美文网首页
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