using System.Collections;// 使用Unity的命名空间,主要包含一些基本的集合和Unity特定的集合类
using System.Collections.Generic;
// 引入UnityEngine命名空间,这个命名空间包含了Unity引擎的核心类和功能
using UnityEngine;
// 定义一个名为MouseRayPoint的公共类,继承自MonoBehaviour类,这使得这个类可以附加到Unity的游戏对象上
public class MouseRayPoint : MonoBehaviour
{
Vector3 target;// 定义一个Vector3类型的变量target,用于存储目标位置
public float smoothTime = 5f;// 定义一个公共浮点数变量smoothTime,表示平滑移动的时间
private Vector3 velocity = Vector3.zero;// 定义一个私有的Vector3类型的变量velocity,初始化为零向量
GameObject mainRole; // 定义一个私有的GameObject类型的变量mainRole,用于存储场景中的某个对象
public float speedMove = 10f;// 定义一个公共浮点数变量speedMove,表示移动的速度
private void Start()
{
mainRole = GameObject.Find("Sphere"); // 通过GameObject.Find方法找到名为"Cube"的对象,并将其赋值给mainRole变量
}
// Unity的Update方法,每帧都会执行,这里主要用来处理鼠标射线以及物体的平滑移动
void Update()
{
Ray oneRayMouse = Camera.main.ScreenPointToRay(Input.mousePosition);// 使用Camera的ScreenPointToRay方法将鼠标位置转换为射线
RaycastHit OneShotOBJ; // RaycastHit类型的一个变量,用于存储射线投射的结果
Physics.Raycast(oneRayMouse, out OneShotOBJ); // 使用Physics的Raycast方法对场景进行射线投射
if (Input.GetMouseButtonDown(0))// 判断鼠标左键是否按下
{
Debug.Log(OneShotOBJ.point + "== " + OneShotOBJ.transform.name);// 如果鼠标左键被按下,打印出投射结果中物体的点和平移量(如果存在的话)
target = OneShotOBJ.point;// 将鼠标点击位置设为追踪目标
}
if (target != null) // 如果存在追踪目标
{
FollowPointSmooth(); // 调用FollowPointSmooth方法使物体平滑追踪到目标点
}
} // end Update
void FollowPointSmooth()// 定义一个名为FollowPointSmooth的方法,用于使物体平滑移动到新的位置并朝向目标点
{
Vector3 targetPosition = target + new Vector3(0, 1, -1);//计算新的位置,给目标位置添加了一个偏差(这里是一个垂直于地面的向量)
//
// 使用Vector3的SmoothDamp方法使物体平滑移动到新的位置,平滑时间为smoothTime,速度为speedMove,位移为targetPosition减去当前位置
mainRole.transform.position = Vector3.SmoothDamp(mainRole.transform.position, targetPosition, ref velocity, smoothTime); //平滑移动到新的位置
// 使物体朝向目标点加上一个垂直于地面的向量(这里是一个垂直向上向下的向量)的偏移量,使物体始终朝向目标点方向但是并不完全对齐目标点
mainRole.transform.LookAt(target + new Vector3(0, 1.5f, 0));
}
}// end class