2016-08-23 80 views
0

我有發生碰撞的場景。一旦碰撞發生,我希望攝像機從對象1移動到對象2.我試圖在碰撞腳本中編寫代碼,但後來我意識到攝像頭腳本總是會覆蓋它,跟在對象1之後。現在我正試圖將它寫入相機腳本中,但我不確定如何。在碰撞時移動攝像頭

這是我的嘗試:

public class CameraController : MonoBehaviour { 
public GameObject player; 
public GameObject player2; 

private Vector3 offset; 

// Use this for initialization 
void Start() { 
    offset = transform.position - player.transform.position; 
} 



    void OnCollisionEnter (Collision col) { 
     if (col.gameObject.name == "triggerCube") { 
      //SceneManager.LoadScene ("test2"); 


      transform.position = player2.transform.position + offset; 


     } 
     else { 
      transform.position = player.transform.position; 
     } 
    } 
} 

即如果碰撞發生時,轉換爲播放器2的位置,但如果沒有碰撞發生的事情,留在玩家然而,C#不允許這裏面無效一個無效的東西,所以我希望有人對我有更好的解決方案?

我可以使它在沒有包含在lateupdate中的情況下工作,但據我瞭解,在lateupdate中使用它對於相機工作非常重要。

+0

有一個GO成員變量,將其稱爲「targetToFollow」或其他內容,然後在cam的LateUpdate()中執行。在碰撞時,將變量分配的GO更改爲另一個對象(可能通過公共屬性)。問題是你想如何應用這種改變?一個很酷的動畫重新聚焦到一個新的目標或類似的東西,或只是換出後續的對象?這種解決方案適用於後者的情況 – 2016-08-23 07:32:46

+0

它是否必須是GO變量?我對c#很陌生,而且我沒有和那些人一起工作過。不過,你的想法很有道理。 – user3078100

回答

0

這裏有一個更好的瞭解代碼片段:

public class CameraController : MonoBehaviour { 
public GameObject player1; 
public GameObject player2; 
public GameObject focusPlayer; //either player1 or player2, initially player1 

private Vector3 offset;

private void Start() { //could use player1 here as well, it doesn't matter offset = transform.position - focusPlayer.transform.position; }
private void OnCollisionEnter(Collision col) { if (col.gameObject.name == "triggerCube") { //layering? tagging? read up focusPlayer = player2; } else { focusPlayer = player1; } }
private void LateUpdate() { transform.position = focusPlayer.transform.position + offset; }

這種方式,你可以添加更多的球員,不同的對象重點放在相機等,這樣整個事情會變得更加富有活力,更易於閱讀或保持。
如果您希望在更改目標時平滑移動相機,請添加float/Vector2-3/wetc成員變量並調用它(例如)「targetOffsetDiff」。每當凸輪獲得新目標時,將其設置爲當前目標與新目標之間的差異。
向LateUpdate()添加一個'if'來測試變量的值:如果它不爲零,則lerp直到它接近零並重置它。