unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力

unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第1张图片

上一篇用一个MonoBehaviour的prefab,转换成entity版本的prefab, 并创建了N个prefab. 上一篇连接:

冰团儿:使用原型,创建N个 基于DOTS-Unity.Animation 的动画Entity角色​zhuanlan.zhihu.com
unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第2张图片

这一次我想加点简单的物理了~~

因为是在官方的DOTS-Unity.Animation.Samples例子上“进化”,而且这个例子近期并未更新(距离我写这篇完整,已经有几个月没更新),我们尝试把所有的package都升级以下,因版本的问题,报各种错误。“猜测性”试用几个依赖包的适配,几番折腾终于找到一个“还能用”的版本。在此贴出:

Animation    	preview.7 - 0.3.0
Burst		1.2.1
Collections	preview.11 - 0.5.1
DOTS Editor	preview	- 0.6.0
Entities	preview.11 - 0.5.1
Hybrid Renderer	preview.11 - 0.3.3
Job		preview.11 - 0.2.4
Mathematics	1.1.0
Unity.Physics	preview	- 0.2.5

这个在package mananger 中搜不到,这个是 Unity.Animation.Sample 例子中被关联的
Data Flow Graph 0.12.0-preview.6

准备就绪。

先给 prefab(角色)加 Component 组件(MonoBehaviour)~

unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第3张图片

第一个组件相当于 BoxCollider, 第2个相当于Rigidbody。

添加这两个组件后,感觉相当顺利~~ 结果:

unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第4张图片
运行结果

不幸的穿越了~~~

猜测是 碰撞盒子不对,开搜~~ 下面这个文章给了简单的介绍(因为解决了问题,没再搜其他)

Unity DOTS Physics学习笔记-射线检测​inspoy.cc
unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第5张图片

我改造了上面网页的例子(因为API版本问题),现简化如下:

using System.Collections;
using System.Collections.Generic;
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine;
using Unity.Physics;
using Unity.Physics.Systems;
using Unity.Transforms;
using Random = UnityEngine.Random;
using Unity.Rendering;
using Unity.Transforms;
#if UNITY_EDITOR
using UnityEditor;
#endif


public class TestPhysics : MonoBehaviour
{
    public  GameObject prefab = null;

    private void Start()
    {
        EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
        
        var entityFromPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(prefab, World.DefaultGameObjectInjectionWorld);
        
        for (int i = 0; i < 100; ++i)
        {
            var entity = entityManager.Instantiate(entityFromPrefab);
            
#if UNITY_EDITOR
            entityManager.SetName(entity, prefab.name + entity.Index); 
#endif        
            var position = transform.TransformPoint(Random.onUnitSphere * 3f);
            entityManager.SetComponentData(entity, new Translation {Value = position});
            
            // ------  以下是新增代码  -----------------------
            // 创建 AABB 盒子. 添加到 entity. 这里尺寸随便设的,先测试成功再细究.
            BoxGeometry boxGeometry = new BoxGeometry();
            boxGeometry.Size = 1;
            boxGeometry.Center = float3.zero;
            boxGeometry.Orientation = quaternion.identity;

            entityManager.AddComponentData(entity, new PhysicsCollider
            {
                Value = Unity.Physics.BoxCollider.Create(boxGeometry)
            });
        }
    }
}

实验成功

unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第6张图片
运行结果

搞定~~

下面是尝试 1000 个动画角色的运行,这只是将 MonoBehaviour 转换成 ECS 模式,离 DOTS 还有些距离~~ 效率很低. 慢慢来~

unity开宝箱动画_给DOTS-Unity.Animation 加点物理-重力_第7张图片
1000个动画角色运行效果

你可能感兴趣的:(unity开宝箱动画)