碰撞时移动相机

时间:2016-08-23 07:28:42

标签: c# unity3d unity5

我有一个发生碰撞的场景。一旦碰撞发生,我希望相机从对象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的位置,但如果没有发生碰撞,请留在玩家1.然而,c#不允许这个虚空内的空虚,所以我希望有人有更好的解决方案吗? / p>

我可以让它在没有包含在更新版本中的情况下工作,但据我所知,在更新后期进行它对于相机工作非常重要。

1 个答案:

答案 0 :(得分: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"。每当凸轮获得一个新目标时,将其设置为当前目标与新目标之间的差异。
添加一个' if'到LateUpdate()来测试变量的值:如果它不为零,则变为lerp,直到它变为(接近)为零并重置它。