Когда я использовал портал в My Game, почему уничтожили «Camera Fallow»? - PullRequest
0 голосов
/ 12 января 2020

Я сделал портал для 2D игры. Обычно камера должна следовать за персонажем. Но после написания скриптов портала «CameraFallowScript» не работает. Персонаж проходит через портал. но после прохождения «CameraFallowScript» исчезает. Я немного новичок, и мой английский sh плохой. спасибо за помощь.

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);


    }
}

Сценарий портала здесь:

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);




    }
}

Сценарий PortalControl Здесь:

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

public class PortalControl : MonoBehaviour
{
    public static PortalControl portalControlInstance;

    [SerializeField]
    private GameObject bluePortal, orangePortal;

    [SerializeField]
    private Transform bluePortalSpawnPoint, orangePortalSpawnPoint;
    private Collider2D bluePortalCollider, orangePortalCollider;

    [SerializeField]
    private GameObject clone;
    void Start()
    {
        portalControlInstance = this;
        bluePortalCollider = bluePortal.GetComponent<Collider2D>();
        orangePortalCollider = orangePortal.GetComponent<Collider2D>();
    }

    // Update is called once per frame
    public void CreateClone(string whereToCreate)
    {
        if (whereToCreate == "atBlue")
        {
            var instantiatedClone = Instantiate(clone, bluePortalSpawnPoint.position, Quaternion.identity);
            instantiatedClone.gameObject.name = "clone";
        }
        if (whereToCreate == "atOrange")
        {
            var instantiatedClone = Instantiate(clone, orangePortalSpawnPoint.position, Quaternion.identity);
            instantiatedClone.gameObject.name = "clone";
        }
    }
    public void DisableCollider(string ColliderToDisable)
    {

        if (ColliderToDisable == "orange")
        {
            orangePortalCollider.enabled = false;

        }
        else if (ColliderToDisable == "blue")
        {
            bluePortalCollider.enabled = false;
        }
    }
public void EnableColliders()
    {
        orangePortalCollider.enabled = true;
        bluePortalCollider.enabled = true;
    }
}

1 Ответ

0 голосов
/ 12 января 2020

В общем, я бы не стал создавать клонов, наверное ... зачем создавать новый игрок? Почему бы просто не переместить его на новую позицию?

Здесь происходит следующее: после 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;
}
...