第一视角脚本
第一步:在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():限制一个向量的最大长度。
网友评论