1. 程式人生 > >Unity2D:2.基於狀態的簡易2D人物移動

Unity2D:2.基於狀態的簡易2D人物移動

使用了列舉來表示狀態,方便新增功能,提高程式碼可讀性:

程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class player1 : MonoBehaviour {
 
    /// <summary>
    /// 人物速度
    /// </summary>
    public float Speed = 5f;
 
    /// <summary>
    /// 移動狀態列舉
    /// </summary>
public enum WalkIdle { Standalone, Up, Down, Left, Right, LeftUp, LeftDown, RightUp, RightDown } void FixedUpdate() { // 人物移動 switch (GetWalkIdle()) { case WalkIdle.Standalone:
break; case WalkIdle.Up: transform.Translate(Vector3.up * Time.deltaTime * Speed); break; case WalkIdle.Down: transform.Translate(Vector3.down * Time.deltaTime * Speed); break; case
WalkIdle.Left: transform.Translate(Vector3.left * Time.deltaTime * Speed); break; case WalkIdle.Right: transform.Translate(Vector3.right * Time.deltaTime * Speed); break; case WalkIdle.LeftUp: transform.Translate(Vector3.up * Time.deltaTime * Speed * 0.707f); transform.Translate(Vector3.left * Time.deltaTime * Speed * 0.707f); break; case WalkIdle.LeftDown: transform.Translate(Vector3.down * Time.deltaTime * Speed * 0.707f); transform.Translate(Vector3.left * Time.deltaTime * Speed * 0.707f); break; case WalkIdle.RightUp: transform.Translate(Vector3.up * Time.deltaTime * Speed * 0.707f); transform.Translate(Vector3.right * Time.deltaTime * Speed * 0.707f); break; case WalkIdle.RightDown: transform.Translate(Vector3.down * Time.deltaTime * Speed * 0.707f); transform.Translate(Vector3.right * Time.deltaTime * Speed * 0.707f); break; } } /// <summary> /// 獲得人物行走狀態 /// </summary> /// <returns></returns> public WalkIdle GetWalkIdle() { if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) { return WalkIdle.LeftUp; } else if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D)) { return WalkIdle.RightUp; } else if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A)) { return WalkIdle.LeftDown; } else if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.D)) { return WalkIdle.RightDown; } else if (Input.GetKey(KeyCode.W)) { return WalkIdle.Up; } else if (Input.GetKey(KeyCode.A)) { return WalkIdle.Left; } else if (Input.GetKey(KeyCode.S)) { return WalkIdle.Down; } else if (Input.GetKey(KeyCode.D)) { return WalkIdle.Right; } return WalkIdle.Standalone; } }