zoukankan      html  css  js  c++  java
  • 【Unity3D】Unity自带组件—完成第一人称人物控制

    1.导入unity自带的Character Controllers包

      

    2.可以看到First Person Controller组件的构成

      

      Mouse Look() : 随鼠标的移动而使所属物体发生旋转

      FPSInput Controller() : 控制物体的移动

    3.同样的,我们为自己的模型添加以上四个组件

      

      其中Mouse Look() 中的Axes属性,是调整围绕的旋转轴

      所谓第一人称就是,鼠标左右晃动则模型以X为轴进行旋转

      鼠标上下晃动则模型的腰关节以Z轴进行旋转

    4.找到模型的腰关节,同样添加Mouse Look(),Axes的值为Y,修改Mouse Look()

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 /// MouseLook rotates the transform based on the mouse delta.
     5 /// Minimum and Maximum values can be used to constrain the possible rotation
     6 
     7 /// To make an FPS style character:
     8 /// - Create a capsule.
     9 /// - Add the MouseLook script to the capsule.
    10 ///   -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
    11 /// - Add FPSInputController script to the capsule
    12 ///   -> A CharacterMotor and a CharacterController component will be automatically added.
    13 
    14 /// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
    15 /// - Add a MouseLook script to the camera.
    16 ///   -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
    17 [AddComponentMenu("Camera-Control/Mouse Look")]
    18 public class MouseLook : MonoBehaviour {
    19 
    20     public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
    21     public RotationAxes axes = RotationAxes.MouseXAndY;
    22     public float sensitivityX = 15F;
    23     public float sensitivityY = 15F;
    24 
    25     public float minimumX = -360F;
    26     public float maximumX = 360F;
    27 
    28     public float minimumY = -60F;
    29     public float maximumY = 60F;
    30 
    31     private Vector3 eulerAngles;
    32 
    33     float rotationY = 0F;
    34 
    35     void LateUpdate ()
    36     {
    37         if (axes == RotationAxes.MouseXAndY)
    38         {
    39             float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
    40             
    41             rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
    42             rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
    43             
    44             transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
    45         }
    46         else if (axes == RotationAxes.MouseX)
    47         {
    48             transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
    49         }
    50         else
    51         {
    52             rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
    53             rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
    54             //----------********使Z轴旋转相应的鼠标偏移********----------//
    55             transform.localEulerAngles = new Vector3(eulerAngles.x,eulerAngles.y,eulerAngles.z + rotationY);
    56         }
    57     }
    58     
    59     void Start ()
    60     {
    61         // Make the rigid body not change rotation
    62         if (GetComponent<Rigidbody>())
    63             GetComponent<Rigidbody>().freezeRotation = true;
    64         //----------********获得初始的旋转********----------//
    65         eulerAngles = transform.localEulerAngles;
    66     }
    67 }

      上面代码中,值得注意的是LateUpdate(),原始的为Update(),因为模型默认会有动画在不停播放,

    那么播放动画的Update()也会调用模型全身的骨骼,那么就会产生冲突,也就使腰部无法上下旋转。

    所以将Update()改为LateUpdate(),后于动画播放的调用,即可。

      此时就可以将Main camera添加在模型腰部组件下

     

    模型的左右旋转、观察上下的视野就完成了。

      

  • 相关阅读:
    问题:oracle if;结果:Oracle IF语句的使用
    问题:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用;结果:PL/SQL中不能用exists函数?
    问题:oracle decode;结果:oracle中的decode的使用
    问题:只能在执行 Render() 的过程中调用 RegisterForEventValidation;结果:只能在执行 Render() 的过程中调用 RegisterForEventValidation
    问题:oracle long 与 clob;结果:long类型比clob到底差在什么地方?
    问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换
    问题:oracle CLOB类型;结果:oracle中Blob和Clob类型的区别
    问题:C#根据生日计算属相;结果:C#实现根据年份计算生肖属相的方法
    po dto vo bo
    eclipse中自动加载源码的方法
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4541948.html
Copyright © 2011-2022 走看看