一、效果展示
二、案列分析
-
使用射线检测,达到点击物体的效果
void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity)) { // 获取检测到的物体 GameObject go = hitInfo.collider.gameObject; // 显示射线 Debug.DrawLine(Camera.main.transform.position, hitInfo.point); } }
-
使用Quaternion.LookRotation 实现更改物体朝向
//计算向量 Vector3 dir = targetPos - Camera.main.transform.position; Quaternion rot = Quaternion.LookRotation(dir); // 使用DoTween 缓慢转向 Camera.main.transform.DORotate(new Vector3(rot.eulerAngles.x, rot.eulerAngles.y, rot.eulerAngles.z), 1.5f, RotateMode.Fast);
-
通过向量计算物体移动到的位置
// 计算移动的位置 Vector3 stopPos = targetPos - 5 * dir.normalized; Camera.main.transform.DOMove(stopPos, 1.5f);
-
使用DOTween实现平滑移动
三、完整代码
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity))
{
//show.text = hitInfo.collider.gameObject.name;
Debug.DrawLine(Camera.main.transform.position, hitInfo.point);
}
if (Input.GetMouseButtonDown(0))
{
// Debug.Log(hitInfo.collider.gameObject.name);
Vector3 targetPos = hitInfo.collider.transform.position;
//实现旋转视角
Vector3 dir = targetPos - Camera.main.transform.position;
// Debug.Log("dir = " + dir.normalized);
Quaternion rot = Quaternion.LookRotation(dir);
// Debug.Log("rot = " + rot);
Camera.main.transform.DORotate(new Vector3(rot.eulerAngles.x, rot.eulerAngles.y, rot.eulerAngles.z), 1.5f, RotateMode.Fast);
// 实现位移
Vector3 stopPos = targetPos - 5 * dir.normalized;
Camera.main.transform.DOMove(stopPos, 1.5f);
}