Unity3D学习记录04——利用射线实现角色类似LOL的移动
首先新建一个空白的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手册如下: