所需知识
实现目标
目标:实现基础的移动功能。
public class Move : MonoBehaviour
{
void Start()
{
// 初始化
}
void Update()
{
// 获取玩家输入
}
void FixedUpdate()
{
// 对玩家施加力
}
}
玩家移动大致的框架如上。
Start()
函数:Unity提供的函数,在所有更新方法之前调用,在生命周期中只调用一次。常用于初始化。
Update()
函数:Unity提供的函数,每一帧都会调用,每一秒的帧数于电脑性能有关。
FixedUpdate()
函数:Unity提供的函数,每一帧都会调用,但是每秒固定60帧。常用于物理操作。
public class Move : MonoBehaviour
{
private Rigidbody2D rigidbody2D;
// 玩家的输入信息
private float moveHorizontal;
private float moveVertical;
private Vector2 movement;
void Start()
{
// 初始化
rigidbody2D = getComponent();
}
void Update()
{
// 获取玩家输入
moveHorizontal = Input.GetAxis("Horizontal");
moveVertical = Input.GetAxis("Vertical");
movement = new Vector2(moveHorizontal , moveVertical);
}
void FixedUpdate()
{
// 对玩家施加力
}
}
上面的代码实现了获取玩家的输入。
Rigidbody2D
:Unity组件,有关物理的操作都需要这个组件。
getComponent<>()
:获取绑定了此脚本的对象的组件。后面的泛型表示获取的组件类型,此脚本的代码表示获取此对象的Rigidbody2D
组件。
Input.GetAxis()
:此函数表示获取玩家的轴输入,返回值的范围:[-1 , 1]。
Input.GetAxis("Horizontal")
:表示获取左右方向键的输入,左方向键返回值小于0,右方向键返回值大于0。Input.GetAxis("Vertical")
:表示获取上下方向键的输入,下方向键返回值小于0,上方向键返回值大于0。Vector2
:二维向量对象。代码中用于表示对玩家施加力的方向。
public class Move : MonoBehaviour
{
private Rigidbody2D rigidbody2D;
// 玩家的输入信息
private float moveHorizontal;
private float moveVertical;
private Vector2 movement;
// 移动速度
public float speed;
void Start()
{
// ...初始化省略
}
void Update()
{
// ...获取玩家输入省略
}
void FixedUpdate()
{
// 对玩家施加力
rigidbody2D.AddForce(movement * speed * 10.0f);
}
}
上面代码实现了向玩家施加力。
AddForce()
:向对象施加力,参数为一个二维向量。此脚本的代码speed * 10.0f
作为力的大小。
将变量声明为 public 后,可以直接在 Unity 编辑器里调整变量的值。
此时将脚本绑定到对象后,就可以通过方向键控制对象移动。
目标:增加移动模式(全方向,垂直方向,水平方向)。
public class Move : MonoBehaviour
{
private Rigidbody2D rigidbody2D;
// 玩家的输入信息
private float moveHorizontal;
private float moveVertical;
private Vector2 movement;
// 移动速度
public float speed;
public Enums.movementType movementType;
void Start()
{
// 初始化
rigidbody2D = getComponent();
movementType = Enums.movementType.AllDirections;
}
void Update()
{
// ...获取玩家输入省略
}
void FixedUpdate()
{
// ...对玩家施加力省略
}
}
public class Enums
{
public enum movementType
{
AllDirections,
OnlyHorizontal,
OnlyVertical
}
}
上面的代码移动类型使用了枚举实现。默认初始化时AllDirections
。
public class Move : MonoBehaviour
{
private Rigidbody2D rigidbody2D;
// 玩家的输入信息
private float moveHorizontal;
private float moveVertical;
private Vector2 movement;
// 移动速度
public float speed;
public Enums.movementType movementType;
void Start()
{
// ...初始化省略
}
void Update()
{
// 获取玩家输入
moveHorizontal = Input.GetAxis("Horizontal");
moveVertical = Input.GetAxis("Vertical");
// 移动模式
switch(movementType)
{
case Enums.movementType.OnlyHorizontal:
moveVertical = 0.0f;
break;
case Enums.movementType.OnlyVertical;
moveHorizontal = 0.0f;
break;
}
movement = new Vector2(moveHorizontal , moveVertical);
}
void FixedUpdate()
{
// ...对玩家施加力省略
}
}
public class Enums
{
// ...省略
}
如果水平移动,则将二维向量的 y 轴的值设为0。
如果垂直移动,则将二维向量的 x 轴的值设为0。
[RequireComponent(typeof(Rigidbody2D))]
public class Move : MonoBehaviour
{
// ...省略
}
[RequireComponent(typeof())]
表示绑定此脚本时自动绑定参数中的组件。
因为此脚本需要Rigidbody2D
组件,但是新建的游戏物体是没有Rigidbody2D
组件的。所以为了避免遗漏Rigidbody2D
组件,会为我们自动绑定Rigidbody2D
组件。