Unity 革命性技术DOST入门四 Raycast射线检测

作者介绍:铸梦xy。IT公司技术合伙人,IT高级讲师,资深Unity架构师,铸梦之路系列课程创始人。

DOTS Raycast射线检测

1.在使用Raycast之前我们首先要做的是导入引用Havok Physics物理引擎

  • Unity Physics

集成Unity Physics方式:
在这里插入图片描述
在使用的前提下我们需要给物体加上Physics Shape组件

Physics Shape就等价于BoxCollider碰撞体,不加碰撞体我们是接收不了射线检测的。

Physics Body 则等价于RigidBody重力组件

在这里插入图片描述
下面是两种射线检测方式,

一种是主线程正常射线检测

另一种则是使用到了ECS,通过JobSystem把射线的碰撞检测放到了子线程中去跑

第一种


using Unity.Mathematics;
using UnityEngine;
using Unity.Physics;
using Unity.Physics.Systems;
using Unity.Entities;
using Unity.Jobs;
public class RaycastNoraml : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            UnityEngine.Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Entity entity= Raycast(ray.origin,ray.direction*100);
            Debug.Log(entity);
        }
    }

    public Entity Raycast(float3 startPos, float3 endPos)
    {
        //首先获取物理世界
        BuildPhysicsWorld physicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
        //然后获取咱们的碰撞世界
        CollisionWorld collisionWorld = physicsWorld.PhysicsWorld.CollisionWorld;

        RaycastInput raycastInput = new RaycastInput()
        {
            Start = startPos,
            End = endPos,
            //声明碰撞过滤器,用来过滤某些层级下的物体是否进行射线检测
            //1.Filter = CollisionFilter.Default,
            Filter = new CollisionFilter()
            {
                BelongsTo = ~0u,
                CollidesWith = ~0u,
                GroupIndex = 0,
            }
        };
        Unity.Physics.RaycastHit raycastHit = new Unity.Physics.RaycastHit();
        //发射射线去检测Entity实体 
        if (collisionWorld.CastRay(raycastInput, out raycastHit))
        {
            //拿到我们射线击中的entity
            Entity entity = physicsWorld.PhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
            return entity;
        }
        else
        {
            return Entity.Null;
        }
    }
}
 

第二种

using UnityEngine;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Collections;
using Unity.Burst;
using Unity.Physics;
using Unity.Physics.Systems;

public class RaycastSystem : ComponentSystem
{

    protected override void OnUpdate()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //获取物理世界
            BuildPhysicsWorld physicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
            NativeArray<RigidBody> rigidBodies = new NativeArray<RigidBody>(1, Allocator.TempJob);
            //获取射线发射位置
            UnityEngine.Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastJonHande raycastJonHande = new RaycastJonHande()
            {
                mStartPos = ray.origin,
                mEndPos = ray.direction,
                physicsWorld = physicsWorld.PhysicsWorld,
                Bodies = rigidBodies,
            };
            JobHandle jobHandle = raycastJonHande.Schedule();
            jobHandle.Complete();
            Debug.Log("射线击中目标" + rigidBodies[0].Entity);
            rigidBodies.Dispose();
        }
    }
    [BurstCompile]
    public struct RaycastJonHande : IJob
    {
        public NativeArray<RigidBody> Bodies;
        public float3 mStartPos;
        public float3 mEndPos;
        public PhysicsWorld physicsWorld;
        public void Execute()
        {
            //创建输入
            RaycastInput raycastInput = new RaycastInput()
            {
                Start = mStartPos,
                End = mEndPos * 100,
                //声明碰撞过滤器,用来过滤某些层级下的物体是否进行射线检测
                Filter = new CollisionFilter() { BelongsTo = ~0u, CollidesWith = ~0u, GroupIndex = 0, }
            };
            Unity.Physics.RaycastHit raycastHit = new Unity.Physics.RaycastHit();
            发射射线去检测Entity实体 
            if (physicsWorld.CollisionWorld.CastRay(raycastInput, out raycastHit))
            {
                //拿到我们射线击中的entity
                Bodies[0] = physicsWorld.Bodies[raycastHit.RigidBodyIndex];
            }
        }
    }
}

DOTS入门视屏教程

Unity 革命性技术DOST入门五 物理系统Physics触发器

文章来自于铸梦老师,铸梦之路系列课程。
想了解更多框架、帧同步技术、UGUI优化相关技术可在企鹅kt搜索 铸梦xy。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铸梦xy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值