A.I Companian поворачивается, когда игрок поворачивается - PullRequest
0 голосов
/ 27 октября 2018

У меня есть маленький компаньон, который следует за игроком, но он также должен повернуться, когда игрок это сделает.Но вместо этого он постоянно поворачивается, может кто-нибудь помочь мне увидеть, где я ошибся

public float speed;
public float stoppingDistance;
private Transform target;
Player Player;


void Start()
{
    Player = GameObject.Find("Axel").GetComponent<Player>();
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
}
void Update()
{
    if (Vector2.Distance(transform.position, target.position) > stoppingDistance)
    {
        transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);

        if (Player.facingRight == false)
        {
            Turn();
        }
        else if (Player.facingRight == true)
        {
            Turn();
        }
    }
}
void Turn()
{
    Vector3 Scaler = transform.localScale;
    Scaler.x *= -1;
    transform.localScale = Scaler;
}

1 Ответ

0 голосов
/ 27 октября 2018

Хорошо, вы звоните Turn "все время", но вы никогда не проверяете, если вы, вероятно, уже смотрите в правильном направлении ...

либо измените ваше условие, либо добавьте параметр к Turn и установите фиксированное направление вместо переключения между двумя направлениями без контроля текущего направления.

Вы можете сделать это, например. с перечислением Direction как

public float speed;
public float stoppingDistance;
private Transform target;
Player Player;

private enum Direction
{
    right = 1,
    left = -1;
}

// for storing the scale on start
private Vector3 originalScale;

private void Start()
{
    Player = GameObject.Find("Axel").GetComponent<Player>();

    // If you just want the transform of the Player
    // than simply use 
    target = Player.transform;
    // instead of
    //target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();

    originalScale = transform.localScale;
}

// Btw: for reacting to any user input (as the player movement)
// it is always better to do these things
// in LateUpdate instead of Update
// LateUpdate is executed after all Update calls in the Scene finished
private void LateUpdate()
{
    if (Vector2.Distance(transform.position, target.position) > stoppingDistance)
    {
        transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);

        if (Player.facingRight == false)
        {
            Turn(Direction .left);
        }
        else if (Player.facingRight == true)
        {
            Turn(Direction .right);
        }
    }
}

private void Turn(Direction direction)
{
    transform.localScale = Vector3.Scale(originalScale, Vector3.right * (int)direction);
}

В качестве альтернативы, если вы хотите сохранить свой исходный Turn, вы также можете просто добавить дополнительные условия, прежде чем даже позвонить Turn. Что-то вроде

// ...
    if (Player.facingRight == false && transform.localScale.x > 0)
    {
        Turn();
    }
    else if (Player.facingRight == true && transform.localScale.x < 0)
    {
        Turn();
    }
// ...

private void Turn()
{
    transform.localScale = Vector3.Scale(transform.localScale, -Vector3.right);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...