Ray
- Ray (origin : Vector3, direction : Vector3)
Origin 是射线的中心
Direction 是射线的长度 - Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition)
这句话的意思为创一个射线在鼠标所在位置从摄像机发送至屏幕 - 除了Ray还有Physics.Raycast
用以检测光线是否触碰到物体
其中API文档中有的四个
-
public static bool Raycast(Ray ray, RaycastHit hitInfo, float distance, int layerMask);
-
public static bool Raycast(Ray ray, float distance, int layerMask);
-
public static bool Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask);
-
public static bool Raycast(Vector3 origin, Vector3 direction, RaycastHit , float distance ,int layerMask);
个人认为参数多点会更提高代码可读性
除此之外还可以去vs里查看更多Raycast的重载
注意:这个layerMask一定要用LayerMask.GetMask
不要用LayerMask.NameToLayer去得到当前蒙版的级别
因为这个参数里面的Layermask是2的当前层级的次方
- RaycastHit(上一个的函数里面有一个参数是这个)
这个可以提供你一个介值使用out参数传递给上面的函数在那里面使用使用完以后这个RaycastHit类型参数就有值可以使用了,可以吧有值的这个参数当做gameobject类型使用。
鼠标选择物体
- 首先放三个物体
- 然后给他们的Layer改一下
- 写上ray相关的代码
private int TargetMask;
void Start()
{
TargetMask = LayerMask.GetMask("Target");//得到的
print(TargetMask);//输出看看是不是得到了值
}
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从鼠标所在位置发射射线
RaycastHit hit;//设置一个被射线射到的物体
if (Physics.Raycast(ray,out hit,100.0F,TargetMask))//使这个射线往原定方向射100米并且只与你设置的Layer层级相撞
{
Vector3 offset = new Vector3(15,0,0);//目标物体偏移量
hit.transform.position += offset;//使目标物体偏移
}
}
- 当鼠标移至目标位置会有下图的效果
- 如有需要可以设置成需要按什么键的时候鼠标在上面才会移动
目标匹配
- 函数:
void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime,float targetNormalizedTime)
- 如何使用:
使你的targetBodyPart(你想要动的身体部位)在你执行的动作的开始时间startNormalizedTime到最终时间targetNormalizedTime之间,移向目标地方matchRotation,matchPosition(目标地点的位置和旋转值)并且你需要定下一个weightMask(x,y,x方向上的权重)去移动 - 用于攀爬和移动之类,用途广泛