1 通过键盘控制人物移动
-
鼠标右键 :
Input.GetMouseButton(1) Input.GetMouseButtonUp(1)
-
屏幕射线:
获取屏幕坐标Vector3 mScreenPos = Input.mousePosition;
定义射线Ray mRay = Camera.main.ScreenPointToRay(mScreenPos);RaycastHit mHit;
-
判断射线是否击中地面
Physics.Raycast(mRay,out mHit) mHit.collider.gameObject.tag=="Terrain"
//获取屏幕坐标
Vector3 mScreenPos = Input.mousePosition;
// 定义射线
Ray mRay = Camera.main.ScreenPointToRay(mScreenPos);
RaycastHit mHit;
//判断射线是否击中地面
if(Physics.Raycast(mRay,out mHit))
{
if(mHit.collider.gameObject.tag=="Terrain")
}
Raycast
- 角色控制
//获取目标坐标
mTargetPos=mHit.point;
//让主角面朝目标坐标并向目标移动
transform.LookAt(mTargetPos);
//播放奔跑动画
transform.gameObject.GetComponent().Play("run");
transform.Translate(Vector3.forward * 0.5F);
- 松开鼠标右键时
transform.gameObject.GetComponent().Play("idle");
2 通过鼠标控制人物移动
前后左右 horizontal
vertical
先转向 后移动
官网给的人物转向
void Rotating(float horizontal,float vertical)
{
Vector3 targetDirection = new Vector3(horizontal,0f,vertical);
Quaternion targetRotation = Quaternion.LookRotation(targetDirection,Vector3.up);
Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation,
targetRotation,turnSmoothing*Time.deltaTime);
rigidbody.MoveRotation(new)
}
人物移动
transform.Translate(Vector3.forward*m_speed);
//同时播放动画
this.SetFloat();
Transform组件移动物体
transform.translate
将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。
Vector3.Lerp, Vector3.Slerp,Vector3.MoveTowards
可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。
Vector3.SmoothDamp
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。
Transform.position
有时重新赋值position能更快实现我们的目标。
Rigidbody组件移动物体
Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。
注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。
3.1 Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。
3.2 Rigidbody.AddForce
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。
3.3 Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点。
CharacterController组件移动物体
CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。
CharacterController.SimpleMove
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。
CharacterController.Move
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。
细节调整
使用rigid body
中freeze rotation
使得物体不会发生旋转或者就是不会发生飘动
如果freezeRotation被启用,旋转不会被物体模拟修改。这对于创建第一人称射击游戏时是很有用的,因为玩家需要使用鼠标完全控制旋转。
Rigidbody中 Angular Drag (角阻力):同样指的是空气阻力,只不过是用来阻碍物体旋转的。如果设置成无限的话,物体会立即停止旋转。如果设置成0,物体在上升过程中,会发生侧翻旋转。
参考资料:
Unity3D教程:如何使用鼠标点击控制角色移动
https://www.cnblogs.com/qiaogaojian/p/5962788.html
Rigidbody.freezeRotation 冻结旋转
网友评论