最近在学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!!!


参考资料:

  1. AwesomeUnityTutorial
  2. C# 官方文档
  3. Unity官方手册
  4. Unity官方教程