Unity3D学习记录04——利用射线实现角色类似LOL的移动

发布时间 2023-10-23 17:22:49作者: Jet清远

首先新建一个空白的GameObject,挂在一个MouseManager的脚本

实现思路:

通过获取鼠标点击的位置,获得该位置的信息,然后使角色移动到该位置

MouseManager脚本的代码如下:

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.Events;
 5 
 6 [System.Serializable]//将EventVector3这个类序列化
 7 public class EventVector3 : UnityEvent<Vector3> { }
 8 public class MouseManager : MonoBehaviour
 9 {
10     public EventVector3 OnMouseClicked;//声明一个EventVector3的对象
11     public RaycastHit hitInfo;//RaycastHit类型的变量,可以返回射线碰撞的的信息
12 
13     void Update()
14     {
15         SetCursorTexture();
16         MouseControl();
17     }
18     void SetCursorTexture()
19     {
20         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
21         if (Physics.Raycast(ray, out hitInfo))
22         {
23             //切换鼠标贴图
24         }
25     }
26     void MouseControl()
27     {
28         if (Input.GetMouseButtonDown(0) && hitInfo.collider != null)
29         {
30             if (hitInfo.collider.CompareTag("Ground"))
31                 OnMouseClicked?.Invoke(hitInfo.point);
32         }
33     }
34 }

代码解释:

第七行中声明一个类,继承UnityEvent,并且类型是Vector3类型

然后把这个类实例化,实例化的对象为OnMouseClicked

这个是C#中事件的内容,我们可以在满足条件的时候自动触发这个OnMouseClicked的事件

 

接着我们声明两个函数,一个是SetCursorTexture,一个是MouseControl

 

第一个函数中,我们声明一个射线的对象ray,并且用Camera.Main.ScreenPointToRay()获取从摄像机通过屏幕点的光线

ScreenPointToRay()的参数为鼠标点击的位置,这样我们的对象ray就获得了我们鼠标点击的位置信息

Raycast回返回一个bool值,我这边用了两个参数,一个是我们的射线ray,一个是out的hitInfo,也就是返回的信息

那么当我们返回值为true的时候,我们会有一个切换鼠标贴图的效果,这里暂时还没写,后面会补充

 

第二个函数MouseControl的第一个if中,

我们如果鼠标按下了左键(函数的参数0即为鼠标左键,1为鼠标右键)并且我们射线碰撞不为空,

那么我们执行第二个if,第二个if表示 我们射线碰撞到的物体tag为Ground,那么我们执行OnMouseClicked函数

?.Invoke表示如果这个函数不为空,那么我们执行这个函数,和!=null是一个意思,这个写法较为便捷

Invoke中我们需要传入一个Vector3的参数,即为碰撞的Point

最后我们只需要在Unity中设置一下我们Ground的Tag,并且将Player拖拽到挂载脚本的空物体上,然后选择NavMeshAgent的desination就可以了

 

关于射线的Unity 官方的API手册如下: