2017-08-05 88 views
0

最近Unityプロジェクトにいくつか問題がありました。私はチェックポイントを 'x'単位で生成しようとしていましたが、何らかの理由で最初の2つのチェックポイントが正常に生成されますが、その後は何も起こりません。ここで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 
     } 
    } 
} 
関連する問題