当我在游戏中使用Portal时,为什么要销毁“ Camera Fallow”?

时间:2020-01-12 07:32:02

标签: c# visual-studio unity3d game-engine

我做了2D游戏的门户。通常,相机需要跟随角色。但是在我编写了门户网站脚本之后,“ CameraFallowScript”不起作用。角色正在通过门户。但通过“ CameraFallowScript”后消失。我是新手,英语不好。 感谢您的帮助。

C:UsersuserNamesomeFile

此处的门户网站脚本:

Camera Fallow Script :

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

public class CameraFallow : MonoBehaviour
{
    public GameObject target;

    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        transform.position = new Vector3(target.transform.position.x, target.transform.position.y, transform.position.z);


    }
}

此处的PortalControl脚本:

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

public class Portal : MonoBehaviour
{
    private Rigidbody2D enteredRigidbody;
    private float enterVelocity, exitVelocity;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        enteredRigidbody = collision.gameObject.GetComponent<Rigidbody2D>();
        enterVelocity = enteredRigidbody.velocity.x;

        if (gameObject.name == "BluePortal")
        {
            PortalControl.portalControlInstance.DisableCollider("orange");
            PortalControl.portalControlInstance.CreateClone("atOrange");
        }
        else if (gameObject.name == "OrangePortal")
        {
            {
                PortalControl.portalControlInstance.DisableCollider("blue");
                PortalControl.portalControlInstance.CreateClone("atBlue");
            }
        }
    }
    private void OnTriggerExit2D(Collider2D collision)
    {
        exitVelocity = enteredRigidbody.velocity.x;

        if (enterVelocity != exitVelocity)
        {
            Destroy(GameObject.Find("Clone"));
        }
        Destroy(collision.gameObject);
        PortalControl.portalControlInstance.EnableColliders();
        GameObject.Find("Clone").name = "Character";
        CameraFallow.DontDestroyOnLoad(transform.gameObject);




    }
}

1 个答案:

答案 0 :(得分:0)

总的来说,我猜我不会创建克隆……为什么要实例化一个新玩家?为什么不简单地将其移动到新位置?

这里发生的是Destroy(collision.gameobject)之后FollowCamera失去了对其target的引用,因此您需要在克隆之后重新分配它,例如在

private void OnTriggerExit2D(Collider2D collision)
{
    exitVelocity = enteredRigidbody.velocity.x;

    if (enterVelocity != exitVelocity)
    {
        Destroy(GameObject.Find("Clone"));
    }
    Destroy(collision.gameObject);
    PortalControl.portalControlInstance.EnableColliders();
    var clone = GameObject.Find("Clone");
    clone.name = "Character";
    DontDestroyOnLoad(clone);


    // It would ofcourse be way more efficient 
    // if you would store this reference somewhere
    FindObjectOfType<CameraFollow>().target = clone;
}

请注意,Find的一般用法很昂贵,应尽可能避免使用它!而是在所有必需的脚本之间传递clone参考。


关于编码样式:传递string参数并不是很好的代码。

我建议例如enum之类的

public enum PortalSide
{
    orange,
    blue
}

然后使用

private Dictionary<PortalSide, Transform> portalSpawns;
private Dictionary<PortalSide, Collider> portalColliders;

private void Awake()
{
    portalSpawns = new Dictionary<PortalSide, Transform> { {PortalSide.blue, bluePortalSpawnPoint} , {PortalSide.orange, orangePortalSpawnPoint}};
    portalColliders = new Dictionary<PortalSide, Collider> { {PortalSide.blue, bluePortalCollider}, {PortalSide.orange, orangePortalCollider} };
}

public void CreateClone(PortalSide whereToCreate)
{
    var spawnPoint = PortalSides[whereToCreate];

    var instantiatedClone = Instantiate(clone, spawnPoint.position, Quaternion.identity);
    instantiatedClone.gameObject.name = "clone";
}

public void DisableCollider(PortalSide ColliderToDisable)
{
    var colliderToDisable = portalColliders[ColliderToDisable];

    colliderToDisable.enabled = false;
}