Unity 2D: как заставить патрулирующий ИИ развернуться? - PullRequest
0 голосов
/ 12 января 2019

Я делаю 2D-платформер в Unity и создаю патрулирующего врага с помощью кода из обучающего видео. Враг в основном перемещается случайным образом в разные места на сцене. Но как я могу заставить спрайт развернуться?

Пока это мой код. Я пробовал разные подходы, но не получил ожидаемого поведения.

public float speed = 10f;
private float waitTime;
public float startWaitTime = 1f;

public Transform[] moveSpots;
private int randomSpot;

private bool moving = true;
private bool m_FacingRight = true;

void Start()
{
    waitTime = startWaitTime;
    randomSpot = Random.Range(0, moveSpots.Length);
}

void Update()
{
    transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);

    if (Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
    {

        //Debug.Log(m_FacingRight);

        // if (moving.x > 0 && !m_FacingRight)
        // {
        //     Debug.Log("moving right");
        //     Flip();
        // }
        // else if (moving.x < 0 && m_FacingRight)
        // {
        //     Debug.Log("moving left");
        //     Flip();
        // }

        if (waitTime <= 0)
        {
            //moving = true;
            randomSpot = Random.Range(0, moveSpots.Length);
            waitTime = startWaitTime;
        }
        else
        {
            //moving = false;
            waitTime -= Time.deltaTime;
        }
    }
}

//private void Flip()
//{
    //m_FacingRight = !m_FacingRight;
    //transform.Rotate(0f, 180f, 0f);
//}

********************************** EDIT ************ ****************************

Я закончил с этим для вражеского сценария движения

private bool facingRight = true;
    private Rigidbody2D rigidBody2D;
    private SpriteRenderer spriteRenderer;

    public Vector2 speed = new Vector2(10, 0);
    public Vector2 direction = new Vector2(1, 0);

    private void Awake()
    {
        rigidBody2D = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.CompareTag("Wall") || collision.collider.CompareTag("Player"))
        {
            direction = Vector2.Scale(direction, new Vector2(-1, 0));
        }

        if (!collision.collider.CompareTag("Ground"))
        {
            if (!facingRight)
            {
                Flip();
            }
            else if (facingRight)
            {
                Flip();
            }
        }
    }

    void FixedUpdate()
    {
        Vector2 movement = new Vector2(speed.x * direction.x, 0);
        movement *= Time.deltaTime;
        transform.Translate(movement);
    }

    private void Flip()
    {
        facingRight = !facingRight;
        if (!facingRight)
        {
            spriteRenderer.flipX = true;
        }
        else if (facingRight)
        {
            spriteRenderer.flipX = false;
        }
    }

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Переписать функцию Flip на

private void Flip()
{
   m_FacingRight = !m_FacingRight;
   GetComponent<SpriteRenderer>().flipX = true;
}

Также, если вы ищете ссылку, я сделал платформер в Unity, который включает в себя патрулирование врагов https://github.com/sean244/Braid-Clone

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

В боковом скроллере простой способ добиться этого - использовать SpriteRenderer.flipX .

Например, если вы хотите перевернуть X при отрицательной скорости:

var sr = GetComponent<SpriteRenderer>();
sr.flipX = velocity.x < 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...