最近在学unity,决定记录一下,学到的代码,以便以后回过头来,嘲笑自己的无知。using UnityEngine
不能忘记!
第一种:最简单的
直接利用最简单的if语句来判别键盘输入的是什么,来进行行动。
- 优点:简单易懂。
- 缺点:
除了简单易懂以外没有优点了。
public class MoveWithArrows : MonoBehaviour
{
// 每帧调用一次 Update
void Update()
{
//创建一个二维向量,读取transform里面的数据
Vector2 position = transform.position;
//侦测是否按下某个键位,以进行下一步操作
if (Input.GetKey("d"))
{
position.x = position.x + 0.1f;
}
if (Input.GetKey("a"))
{
position.x = position.x - 0.1f;
}
if (Input.GetKey("s"))
{
position.y = position.y - 0.1f;
}
if (Input.GetKey("w"))
{
position.y = position.y + 0.1f;
}
//返还位置值
transform.position = position;
}
}
第二种:较为灵活的控制方式
通过识别水平垂直输入来进行移动,水平垂直输入可通过工程设置修改。
- 优点:可以修改键位。
- 缺点:由于
Update()
是每一帧运行一次,所以移动速度完全不可控。帧率越高,移动速度越快,反之则慢。
public class MoveWithArrows : MonoBehaviour
{
// 让游戏对象每帧右移 0.1
void Update()
{
// 获取水平输入,按向左,会获得 -1.0 f ; 按向右,会获得 1.0 f
float horizontal = Input.GetAxis("Horizontal");
// 获取垂直输入,按向下,会获得 -1.0 f ; 按向上,会获得 1.0 f
float vertical = Input.GetAxis("Vertical");
// 获取对象当前位置
Vector2 position = transform.position;
// 更改位置
position.x = position.x + 0.1f * horizontal;
position.y = position.y + 0.1f * vertical;
//返还位置值
transform.position = position;
}
}
第三种:利用锁帧来恒定速度的移动方式
锁定游戏的帧率,就可以达到固定移动速度的目的,甚至可以自定义移动速度。
- 优点:速度可控。
- 缺点:帧率锁定,如果有些设备连锁定的帧率都达不到,就会出现速度变慢的情况。
public class MoveWithArrows : MonoBehaviour
{
// 在第一次帧更新之前调用 Start
void Start()
{
// 只有将垂直同步计数设置为0,才能锁帧,否则锁帧的代码无效
QualitySettings.vSyncCount = 0;
//设定应用程序帧数为60
Application.targetFrameRate = 60;
}
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector2 position = transform.position;
position.x = position.x + 0.1f * horizontal;
position.y = position.y + 0.1f * vertical;
transform.position = position;
}
}
第四种:利用单位/秒来移动,以控制速度
既然以每帧为计数单位会导致速度不一,干脆直接用秒来作为计数单位,就不会出问题了。
- 优点:速度完全可控,键位可调
- 缺点:没有考虑刚体碰撞,可能会出现卡模型的情况
public class MoveWithArrows : MonoBehaviour
{
public float speed = 0.1f;
void Update()
{
// 获取水平输入,按向左,会获得 -1.0 f ; 按向右,会获得 1.0 f
float horizontal = Input.GetAxis("Horizontal");
// 获取垂直输入,按向下,会获得 -1.0 f ; 按向上,会获得 1.0 f
float vertical = Input.GetAxis("Vertical");
// 获取对象当前位置
Vector2 position = transform.position;
// 更改位置
position.x = position.x + speed * horizontal * Time.deltaTime;
position.y = position.y + speed * vertical * Time.deltaTime;
// 新位置给游戏对象
transform.position = position;
}
}
第五种:考虑刚体情况下的移动代码
利用FixedUpdate()
解决了刚体碰撞的时候会出现的模型卡顿问题
- 优点:好像啥问题都解决了?
- 缺点:
我也不知道。
public class MoveWithArrows : MonoBehaviour
{
//声明2D刚体对象
Rigidbody2D rigidbody2d;
//获取用户输入
float horizontal;
float vertical;
// 在第一次帧更新之前调用 Start
void Start()
{
//获取当前游戏对象的刚体组件情况
rigidbody2d = GetComponent<Rigidbody2D>();
}
// 每帧调用一次 Update
void Update()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
}
//固定时间间隔(刚体必须)
void FixedUpdate()
{
Vector2 position = rigidbody2d.position;
position.x = position.x + 3.0f * horizontal * Time.deltaTime;
position.y = position.y + 3.0f * vertical * Time.deltaTime;
rigidbody2d.MovePosition(position);
}
}
想说的话
希望我能够好好学会C#和Unity!!!
参考资料:
本文链接:https://ohana.moe/archives/ucode/
版权声明:转载时须注明出处及本声明