1. 程式人生 > >U3D進階 | 常用 API 之 Invoke 函式呼叫

U3D進階 | 常用 API 之 Invoke 函式呼叫

金錢副本細節完善

  • 寶箱掉落
    • 給寶箱預製體新增剛體元件即可。
  • 實現按鍵寶箱批量掉落
    • 將例項化生成寶箱的程式碼單獨封裝成一個函式;
    • 使用 for 迴圈,批量生成寶箱。
  • 寶箱自動掉落
    • 現在我們是通過按鍵,程式呼叫 “生成寶箱” 的函式來實現功能。在遊戲中,這個 “生成寶箱” 的函式,是需要由程式自動呼叫的。
    • 使用 Invoke 函式實現。

Invoke 函式

  • Invoke 函式程式碼
    • Invoke ( string, float ):多少秒後執行某個函式 [只調用一次]。
      • String:要執行函式的名稱;
      • Float:秒數,倒計時的時間。
    • InvokeRepeating ( string, float, float )
      :多少秒 [第二個引數] 後執行某個函式,並且以後每隔多少秒 [第三個引數] 都會執行該函式一次 [重複呼叫 N 次]。
    • CancelInvoke (  ):取消這個指令碼中所有的 Invoke 呼叫。
      public class CreateBoxes : MonoBehaviour {
      
          public GameObject goPrefab;
      
      	void Start () {
              InvokeRepeating ("CreateMoreBox", 1.0f, 1.0f);
      	}
      	
      	void Update () {
              if(Input.GetKeyDown(KeyCode.Space))
              {
                  CreateMoreBox();
              }
      
              if (Input.GetKeyDown(KeyCode.Z))
              {
                  CancelInvoke();
              }
          }
      
          void CreateMoreBox()
          {
              for(int i = 0; i <= 5; i++)
              {
                  Vector3 position = new Vector3(Random.Range(-4.0f, 4.0f), 3, Random.Range(-4.0f, 4.0f));
                  GameObject.Instantiate(goPrefab, position, Quaternion.identity);
              }
          }
      }
      

金錢副本主角控制

  • 主角基本控制
    • 建立一個 Cube 模型,美化一下作為主角;
    • 新增剛體元件,使用剛體的 MovePosition 結合按鍵控制主角移動。
  • 控制主角與 Box 碰撞
    • 主角碰撞到 Box,Box 自動銷燬。
      public class PlayerController : MonoBehaviour {
      
          private Rigidbody m_Rigidbody;
          private Transform m_Transform;
      
      	void Start () {
              m_Rigidbody = gameObject.GetComponent<Rigidbody> ();
              m_Transform = gameObject.GetComponent<Transform> ();
      	}
      	
      	void Update () {
              if(Input.GetKey(KeyCode.W))
              {
                  m_Rigidbody.MovePosition(m_Transform.position + Vector3.forward * 0.2f);
              }
      
              if (Input.GetKey(KeyCode.A))
              {
                  m_Rigidbody.MovePosition(m_Transform.position + Vector3.left * 0.2f);
              }
      
              if (Input.GetKey(KeyCode.S))
              {
                  m_Rigidbody.MovePosition(m_Transform.position + Vector3.back * 0.2f);
              }
      
              if (Input.GetKey(KeyCode.D))
              {
                  m_Rigidbody.MovePosition(m_Transform.position + Vector3.right * 0.2f);
              }
          }
      
          void OnCollisionEnter(Collision coll)
          {
              if(coll.gameObject.tag == "Box")
              {
                  GameObject.Destroy (coll.gameObject);
              }
          }
      }