在一起大型的pc游戏中,玩家是可以通过鼠标来控制游戏中角色的移动或者旋转等操作,对于开发者来说需要做的就是怎么去实现游戏对象跟随鼠标的操作来做动作,下面就来看看实现的方法吧。
AخA
1
[SerializeField] LayerMask whatIsGround;
2
void Update(){
3
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
4
Debug.Log(ray);
5
RaycastHit hitInfo;
6
if(Physics.Raycast(ray, out hitInfo, 200, whatIsGround)){
7
Vector3 target = hitInfo.point;
8
target.y = transform.position.y;
9
transform.LookAt(target);
10
}
解释:
1
1
<strong>Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);</strong>
Camera.Main是获取第一个启用且被标记为”MainCamera”的相机。
ScreenPointToRay(Input.mousePosition);
通过MainCamera射出一道无限延伸的射线到Mouse的位置。
Ray类型包含一个Origin(圆点)和一个Direction(方向)两个三位坐标属性,Origin跟随鼠标的移动而改变,Direction始终是朝向MainCamera的方向。
1
1
<strong>RaycastHit hitInfo;</strong>
RaycastHit所包含的数据很多,这里主要用的其中的"Point"这一属性。
1
1
<strong>public static bool Raycast (Ray ray, out RaycastHit hitInfo, floatmaxDistance, int layerMask);</strong>
Raycast返回一个bool值,判断射线是否与指定的遮罩层(layerMask)碰撞器产生碰撞。
1
1
<strong>Transform.LookAt(target);</strong>
![Unity3D如何实现游戏对象跟随鼠标旋转](https://i-blog.csdnimg.cn/blog_migrate/36f4258e79fddc2ac29f48174511634c.gif)
可能会遇到的问题:
通过Debug.Log()输出Ray变量有数值,但是玩家不跟随鼠标移动而转向。
可以通过Debug.Log()检查Physics.Raycast()返回的bool是否为真,如果不是,检查场景内的地板Layer是否标记为对应的layerMask。