版本是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 - 博客园
补充一种比较简单的写法:
RaycastHit2D hitInfo = Physics2D.Raycast(down.transform.position, Vector2.down, 1f, platformLayer);//3D同理
//第一参数是发出射线的位置,第二个是射线的方向,第三个是射线的长度,第四个是射线所在的层级
if (hitInfo.collider != null)//可以这样判断有无碰撞
{
}
//Unity内部层级使用二进制表示的,所以这里也可以写8,二进制表示为1000,表示只有第四层,同理15,1111,表示只有前四层都有,可以用运算来灵活处理层级
其它问题:
Unity的射线检测有延迟,如在当前帧修改了物体位置,之后(同一帧内)调用射线检测,仍能在原位置检测到物体,而新位置检测不到
有错误欢迎指出