2016-08-23 83 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直到它接近零并重置它。