美文网首页
unity3d 难点---控制人物行走摄像机移动等

unity3d 难点---控制人物行走摄像机移动等

作者: qiaoqiao123 | 来源:发表于2019-04-22 10:59 被阅读0次

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 bodyfreeze rotation 使得物体不会发生旋转或者就是不会发生飘动

如果freezeRotation被启用,旋转不会被物体模拟修改。这对于创建第一人称射击游戏时是很有用的,因为玩家需要使用鼠标完全控制旋转。

Rigidbody中 Angular Drag (角阻力):同样指的是空气阻力,只不过是用来阻碍物体旋转的。如果设置成无限的话,物体会立即停止旋转。如果设置成0,物体在上升过程中,会发生侧翻旋转。

参考资料:
Unity3D教程:如何使用鼠标点击控制角色移动
https://www.cnblogs.com/qiaogaojian/p/5962788.html
Rigidbody.freezeRotation 冻结旋转

相关文章

网友评论

      本文标题:unity3d 难点---控制人物行走摄像机移动等

      本文链接:https://www.haomeiwen.com/subject/ictsgqtx.html