Включение и отключение коллайдера в зависимости от направления в Unity - PullRequest
1 голос
/ 25 марта 2019

Я думаю, это будет просто, но по какой-то причине я не могу понять это. У меня 4 игрока GameObjects вокруг моего игрока, каждый со своим коллайдером. Мне нужно иметь возможность включать и отключать дочерние объекты GameObject в зависимости от направления движения персонажа. Таким образом, если игрок двигается вправо влево, верхний и нижний коллайдеры будут отключены, оставляя активным только правый коллайдер. Если игрок перемещается вверх, то левый, правый и нижний коллайдеры будут отключены, оставляя только верхний коллайдер. И это тот же принцип для двух других направлений. Но по какой-то причине мой код работает как для левого, так и для правого направления, но когда мой персонаж перемещается вверх или вниз, он отключает все, кроме левого коллайдера. Могу ли я получить помощь? Вот мой код:

public BasicNPCPrototype NPCPrototype;
    private bool nearNPC = false;

    public bool facingRight;
    public bool facingUp;

    public GameObject RightCollider;
    public GameObject LeftCollider;
    public GameObject TopCollider;
    public GameObject BottomCollider;

    // Use this for initialization
    protected override void Start()
    {
        base.Start();
    }

    // Update is called once per frame
    protected override void Update()
    {
        // Call the GetInput Function
        GetInput();

        // Call the CheckIfNear function
        CheckIfNear();

        // Call the CheckDirection function
        CheckDirection();

        // Call the DisableInteractionColliders function
        DisableInteractionColliders();

        base.Update();
    }

    void GetInput()
    {
        if(playerActive)
        {
            direction = Vector2.zero;

            // Get the horizontal Axis and put in the X value of "direction"
            direction.x = Input.GetAxisRaw("Horizontal");
            // Get the Vertical Axis and put in the Y value of "direction"
            direction.y = Input.GetAxisRaw("Vertical");
        }    
    }

    // Look at our movement direction and decide which way were facing
    void CheckDirection()
    {
        if (direction.x > 0)
        {
            facingRight = true;
            facingUp = false;
        }
        else if (direction.x < 0)
        {
            facingRight = false;
            facingUp = false;
        }

        if (direction.y > 0) // && !facingRight)
        {
            facingUp = true;
            facingRight = false;
        }
        else if (direction.y < 0) // && !facingRight)
        {
            facingUp = false;
            facingRight = false;
        }

    }

    // Look at what direction the Player is facing and disable/enable the correct colliders to account for it
    void DisableInteractionColliders()
    {
        // WIP
        if(facingRight)
        {
            RightCollider.SetActive(true);
            LeftCollider.SetActive(false);
            TopCollider.SetActive(false);
            BottomCollider.SetActive(false);
        } else if(!facingRight)
        {
            LeftCollider.SetActive(true);
            RightCollider.SetActive(false);
            TopCollider.SetActive(false);
            BottomCollider.SetActive(false);
        }

         else if(facingUp)
        {
            TopCollider.SetActive(true);
            RightCollider.SetActive(false);
            LeftCollider.SetActive(false);
            BottomCollider.SetActive(false);
        } else if(!facingUp)
        {
            BottomCollider.SetActive(true);
            RightCollider.SetActive(false);
            LeftCollider.SetActive(false);
            TopCollider.SetActive(false);
        }
    }

Если читать легче, вы можете прочитать его на PasteBin: https://pastebin.com/y1jQT17w

Игнорировать CheckIfNear (); вызовите функцию обновления, как для будущих планов, но в настоящее время она пуста.

1 Ответ

2 голосов
/ 25 марта 2019
    if(facingRight)
    {
        RightCollider.SetActive(true);
        LeftCollider.SetActive(false);
        TopCollider.SetActive(false);
        BottomCollider.SetActive(false);
    } 
    else if(!facingRight)
    {
        LeftCollider.SetActive(true);
        RightCollider.SetActive(false);
        TopCollider.SetActive(false);
        BottomCollider.SetActive(false);
    }

    else if(facingUp)
    {
        TopCollider.SetActive(true);
        RightCollider.SetActive(false);
        LeftCollider.SetActive(false);
        BottomCollider.SetActive(false);
    } 
    else if(!facingUp)
    {
        BottomCollider.SetActive(true);
        RightCollider.SetActive(false);
        LeftCollider.SetActive(false);
        TopCollider.SetActive(false);
    }

FaceRight имеет значение True или False.Это означает, что ваша первая пара операторов if (if(facingRight) и if(!facingRight)) всегда истинна, поэтому ваш код никогда не достигнет 3-го оператора if, а ваша переменная FacingUp никогда не будет использоваться.

На вашем месте яназначил бы используемое целое число, чтобы сохранить направление и выбрать коллайдеры, используя переключатель.Вот так:

int dir = 0;

void CheckDirection()
{
    if (direction.x > 0)
    {
        dir = 1;
    }
    else if (direction.x < 0)
    {
        dir = 2;
    }

    if (direction.y > 0)
    {
        dir = 3;
    }
    else if (direction.y < 0)
    {
        dir = 4;
    }

}

.

void DisableInteractionColliders()
{
        LeftCollider.SetActive(false);
        RightCollider.SetActive(false);
        TopCollider.SetActive(false);
        BottomCollider.SetActive(false);

        switch(dir)
        {
            case 1: RightCollider.SetActive(true);
                    break;
            case 2: LeftCollider.SetActive(true);
                    break;
            case 3: TopCollider.SetActive(true);
                    break;
            case 4: BottomCollider.SetActive(true);
                    break;

            default: break;
        }
}
...