2017-08-05 72 views
0

最近我一直有一些問題,我的Unity項目。我一直試圖爲每個「x」單位生成檢查點,但由於某種原因,前兩個檢查點成功產卵,但之後沒有任何反應。Unity 2D:檢查點上的檢查點生成無法正常工作

這是我在CheckpointGeneration.cs代碼:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CheckpointGeneration : MonoBehaviour { 

    public GameObject checkpointPrefab; 

    int gap = 5; 
    List<GameObject> previousCheckpointList; 

    private void Start() 
    { 
     Vector3 targetPos = new Vector3(0, -2.35f); 
     Instantiate(checkpointPrefab, targetPos, 
      checkpointPrefab.transform.rotation); 
    } 

    private void Update() 
    { 
     if (CheckpointController.checkpointsReached != previousCheckpointList && CheckpointController.lastCheckpointReached != null) 
     { 
      previousCheckpointList = CheckpointController.checkpointsReached; 

      Vector3 targetPos = new Vector3(CheckpointController.lastCheckpointReached.transform.position.x + gap, CheckpointController.lastCheckpointReached.transform.position.y); 
      Instantiate(checkpointPrefab, targetPos, checkpointPrefab.transform.rotation); 
     } 
    } 
} 

這是CheckpointController.cs代碼:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CheckpointController : MonoBehaviour { 

    public static List<GameObject> checkpointsReached = new List<GameObject>(); 
    public static GameObject lastCheckpointReached; 

    GameObject player; 

    private void Awake() 
    { 
     player = GameObject.FindGameObjectWithTag("Player"); 
    } 

private void Update() 
{ 
     if (checkpointsReached.Count > 0) 
     { 
      lastCheckpointReached = checkpointsReached[checkpointsReached.Count - 1]; 
     } 
    } 

    private void OnTriggerEnter2D(Collider2D collision) 
    { 
     if (collision.tag == "Player") 
     { 
      checkpointsReached.Add(gameObject); 
      GetComponent<SpriteRenderer>().color = new Color(0, 0.86f, 0.29f); 
     } 
     Debug.Log("Checkpoint Reached!"); 
    } 

    public void RespawnAtCheckpoint() 
    { 
     if (lastCheckpointReached != null) 
     { 
      player.transform.parent.position = lastCheckpointReached.transform.position; 
      player.GetComponent<PlayerManager>().isDead = false; 
      Camera.main.transform.position = GameObject.FindGameObjectWithTag("CameraFollow").transform.position; 
      Debug.Log("Respawning..."); 
     } else 
     { 

GameObject.FindGameObjectWithTag("GameController").GetComponent<ReloadLevel>().Reload(); 
     } 
    } 

} 

任何答案,將不勝感激!如果您需要更多信息,請發表評論,我將編輯問題以提供。

+0

「CheckpointGeneration」屬於場景中的空遊戲對象,「CheckpointController」屬於檢查點預製? –

+0

@AleksaRistic是的,「CheckpointGeneration」腳本位於標記爲「GameController」的空遊戲對象上,「CheckpointController」位於檢查點預製件上。 –

+0

它是否將它們產生爲gameobjects –

回答

0

我對您的代碼進行了更改,以便您瞭解一些簡潔的代碼。如果你不明白代碼中的內容,請問我。我還爲全局變量創建了另一個類。考慮到使用它,因爲按名稱查找遊戲對象並不好。

public class GlobalClass : MonoBehaviour 
{ 
    //static objects are not seen in inspector so we will asign player to public gameobject and inside script we transfer it to static gameobject so now we can get player gameobject with GlobalClass.player 
    public static GameObject player; 
    public GameObject _player; 

    //With this you can set all other gameobjects like your GameController or something like that 

    private void Start() 
    { 
     player = _player; 
    } 
} 

public class CheckpointGeneration : MonoBehaviour 
{ 
    public GameObject checkpointPrefab; 

    public float gap = 5.0f; 
    public static int spawnedCheckpoints = 0; //You can alse set it as bool but with this you can maybe make to have 2 or more checkpoints 

    private static Vector2 lastCheckpointPos = new Vector2(0, -2.35f); 

    private void Start() 
    { 
     Instantiate(checkpointPrefab, lastCheckpointPos, checkpointPrefab.transform.rotation); 
     spawnedCheckpoints++; 
    } 

    private void Update() 
    { 
     if (spawnedCheckpoints < 1) 
     { 
      SpawnCheckpoint(); 
     } 
    } 

    public static void RespawnAtCheckpoint() 
    { 
     if (CheckpointGeneration.spawnedCheckpoints > 0) 
     { 
      GlobalClass.player.transform.parent.position = CheckpointGeneration.lastCheckpointPos; 
      GlobalClass.player.GetComponent<PlayerManager>().isDead = false; 
      Camera.main.transform.position = GameObject.FindGameObjectWithTag("CameraFollow").transform.position; 
      Debug.Log("Respawning..."); 
     } else 
     { 

      GameObject.FindGameObjectWithTag("GameController").GetComponent<ReloadLevel>().Reload(); 
     } 
    } //Call this method when player die 

    private static void SpawnCheckpoint() 
    { 
     Vector2 newCheckpointPos = new Vector2(lastCheckpointPos.x + gap, lastCheckpointPos.y); 
     Instantiate(checkpointPrefab, newCheckpointPos, checkpointPrefab.transform.rotation); //Consider using Quaternion.identity 
     lastCheckpointPos = newCheckpointPos; 
     spawnedCheckpoints++; 
    } 
} 

public class CheckpointController : MonoBehaviour 
{ 
    private void OnTriggerEnter2D(Collider2D collision) 
    { 
     if (collision.tag == "Player") 
     { 
      CheckpointGeneration.spawnedCheckpoints--; //with this we sent message to your CheckpointGeneration script that this checkpoint is reached 
      Debug.Log("Checkpoint Reached!"); 
      Destroy(gameObject);//When checkpoint is reached we destroy it and will spawn new one 
     } 
    } 
}