美文网首页
第一视角脚本

第一视角脚本

作者: 醉酒青牛_fa4e | 来源:发表于2019-04-17 00:22 被阅读0次

    第一视角脚本
    第一步:在unity5中创建一个新场景,选择File|New Project。
    第二步:利用unity自带的组件制作一个简单的场景,如下图:
    简单场景
    中间是一个胶囊(capsule),表示玩家。
    第三步:设置玩家
    1、把玩家(胶囊)的 碰撞检测器capsule collider移除,添加一个character controller(Inspector底部有个Add Component按钮)。
    2、相玩家附加一个摄影机(camera)作为玩家的眼睛(可以把主摄影机直接拿来附加)。附加后建议摄影机设置的位置为0,0.5,0,重置rotation为0,0,0。

    添加脚本

    第一步:向玩家添加鼠标输入能观察四周的脚本
    创建一个名为MouseLook脚本,代码如下:

    using UnityEngine;
    using System.Collections;

    public class MouseLook : MonoBehaviour {
    //定义枚举数据结构,将名称和设置关联起来
    public enum RotationAxes
    {
    MouseXAndY = 0,
    MouseX = 1,
    MouseY = 2
    }
    public RotationAxes axes = RotationAxes.MouseXAndY;
    public float sensitivityHor = 9.0f;//水平旋转的速度
    public float sensitivityVert = 9.0f;//垂直旋转的速度
    public float minimumVert = -45.0f;//垂直旋转的最小角度
    public float maximumVert = 45.0f;//垂直旋转的最小角度

    private float _rotationX = 0;//为垂直角度声明一个私有变量
    
    void Start()
    {
        //将光标锁定到游戏窗口的中心。
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }
    
    void Update ()
    {
        if (axes == RotationAxes.MouseX)
        {
            //水平旋转代码
            transform.Rotate(0,Input.GetAxis("Mouse X") * sensitivityHor, 0);
        }
        else if (axes == RotationAxes.MouseY)
        {
            //垂直旋转代码
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX,minimumVert,maximumVert);
    
            float rotationY = transform.localEulerAngles.y;//保持y轴与原来一样
            transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
        }
        else
        {
            //水平且垂直旋转
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);//限制角度大小
    
            float delta = Input.GetAxis("Mouse X") * sensitivityHor;//设置水平旋转的变化量
            float rotationY = transform.localEulerAngles.y+delta;//原来的角度加上变化量
            transform.localEulerAngles = new Vector3(_rotationX,rotationY,0);//相对于全局坐标空间的角度
        }
    
        //当点击esc后
        if (Input.GetKeyDown("escape"))
        {
            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
            //Cursor.lockState = CursorLockMode.Confined;//将光标限制在游戏窗口。
        }
        if (Input.GetButtonDown("Fire1"))
        {
            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }
    }
    

    }

    第二步:给玩家和摄影机添加脚本
    先把脚本挂到玩家身上可以选择玩家,设置Inspector面板axes枚举变量,看看三个状态下的不同效果。
    如果选择MouseXAndY,发现玩家可以飞行。所有我们可以把玩家的axes值设置为MouseY,使它能够水平旋转,然后向摄影机添加一个MouseLook脚本,设置axes值设置为MouseX,使它垂直旋转。
    第三步:创建玩家移动脚本 FPSInput

    using UnityEngine;
    using System.Collections;

    [RequireComponent(typeof(CharacterController))]//RequireComponent表示此物体需要有 CharacterController才能运行此脚本,否则会报错
    [AddComponentMenu("Control Script/FPS Input")]//AddComponentMenu表示脚本将在unity编辑器中添加组件菜单。以后想添加FPSInput脚本,可以在AddComponent中添加
    public class FPSInput : MonoBehaviour {

    public float speed = 1f;
    public float gravity = -9.8f;
    
    private CharacterController _charController;
    
    void Start()
    {
        _charController = GetComponent<CharacterController>();
    }
    
    void Update ()
    {
        float deltaX = Input.GetAxis("Horizontal")*speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
        //transform.Translate(deltaX*Time.deltaTime, 0, deltaZ * Time.deltaTime);//此方法直接相对于本体移动
    
        Vector3 movement = new Vector3(deltaX,0, deltaZ);//此处是相对于本体的坐标
        movement = Vector3.ClampMagnitude(movement, speed);//限制向量的最大长度,并返回此变化后的向量
        movement.y = gravity;
    
        movement *= Time.deltaTime;
        movement = transform.TransformDirection(movement);//转换为世界坐标系
    
        _charController.Move(movement);//move()是现对与世界坐标系移动物体的。
    }
    

    }

    第四步:给玩家添加脚本,并且看看效果

    总结

    1、Input.GetAxis(“Mouse X”):获取鼠标延左右移动的速度
    2、Input.GetAxis(“Mouse Y”):获取鼠标延上下移动的速度
    3、Input.GetKeyDown(“escape”):按下esc键
    4、transform.Rotate():使物体旋转,如果最后一个参数relativeTo默认以局部坐标旋转,如果设置为-Space.World(世界坐标系),则旋转应用于世界x,y,z轴。
    5、transform.localEulerAngles:物体的欧拉角(相对于父级的坐标),此例子我们直接改变物体的欧拉角以达到旋转的效果。和用transform.Rotate()改变有所区别
    6、Mathf.Clamp():
    7、Cursor.lockState = CursorLockMode.Locked;将光标锁定到游戏窗口的中心。
    Cursor.lockState = CursorLockMode.Confined;将光标限制在游戏窗口。
    8、Cursor.visible = false;隐藏光标
    9、CharacterController:CharacterController类。CharacterController允许你简单地做碰撞约束的移动,而不必处理刚体。
    10、CharacterController.Move():通过运动移动控制器,并且受碰撞约束,会延着碰撞体表面滑动,它不受重力影响。(相对于世界坐标系来移动物品)
    11、transform.TransformDirection():转换为世界坐标系
    12、Vector3.ClampMagnitude():限制一个向量的最大长度。
    

    相关文章

      网友评论

          本文标题:第一视角脚本

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