unity3d学习(一)制作第一人称射击-玩家的视口和移动

玩家的视口和移动

写在前面:
- 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking
- 内容:第二章
- 下一篇:unity3d学习(二)制作第一人称射击-玩家射击和添加敌人


构建简单场景

第一步:在unity5中创建一个新场景,选择File|New Project。
第二步:利用unity自带的组件制作一个简单的场景,如下图:
unity3d学习(一)制作第一人称射击-玩家的视口和移动_第1张图片
中间是一个胶囊(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();
    }

    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():限制一个向量的最大长度。

注意:很多类和方法不清楚请查看官方文档。

你可能感兴趣的:(unity3d,c#)