006-Unity实战开发古迹探险日志之射线检测

版本是2018\3\14

最近学习siki老师的古迹探险开发,对其中的一段代码颇有收获

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Hero : MonoBehaviour
{
    public NavMeshAgent agent;
    public Animator anim;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) agent.SetDestination(hit.point);
        }
        anim.SetFloat("Speed", agent.velocity.magnitude);
    }
}

主要是其中的射线与碰撞检测以及out关键字的感悟:

首先

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

这一句意思是从主相机发射一条射线到鼠标的位置并返回这条射线

RaycastHit hit;

这里是声明了一个存储碰撞信息的变量

if (Physics.Raycast(ray, out hit))

如果监测到碰撞就把碰撞信息存储到hit中

关于out关键字,可参考下面第一篇博客

参考博客:

out和ref详解 - Alan_beijing - 博客园

Unity 3D中的射线与碰撞检测 - 简书

补充一种比较简单的写法:

RaycastHit2D hitInfo = Physics2D.Raycast(down.transform.position, Vector2.down, 1f, platformLayer);//3D同理
//第一参数是发出射线的位置,第二个是射线的方向,第三个是射线的长度,第四个是射线所在的层级
if (hitInfo.collider != null)//可以这样判断有无碰撞
{

}
//Unity内部层级使用二进制表示的,所以这里也可以写8,二进制表示为1000,表示只有第四层,同理15,1111,表示只有前四层都有,可以用运算来灵活处理层级

其它问题:
Unity的射线检测有延迟,如在当前帧修改了物体位置,之后(同一帧内)调用射线检测,仍能在原位置检测到物体,而新位置检测不到

有错误欢迎指出

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值