Home > Back-end >  How can I make the animation match when the NPC walks left or right?
How can I make the animation match when the NPC walks left or right?

Time:11-25

I have some NPCs that randomly walk within a range, however when I can't determine when they are walking left or right so the animation looks wrong.

I have a function called "Decrease" that warns inside the terminal when the object walks decreases or increases its position, but this function does not work as it should

So...

How can I make the animation match when the NPC walks left or right?

Here is my NPC configuration:

enter image description here

Here is my code:

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

public class NPCController : MonoBehaviour
{
    private float waitTime;
    private Animator _animator;
    private SpriteRenderer _renderer;

    public Transform moveSpot;
    private bool _facingRight = true;
    public float lastXVal;
    public float speed;
    public float startWaitTime;
    public float minX;
    public float maxX;
    public float minY;
    public float maxY;

    void Awake()
    {
        _animator = GetComponent<Animator>();
        _renderer = GetComponent<SpriteRenderer>();
    }

    void Start()
    {
        waitTime = startWaitTime;
        moveSpot.position = new Vector2(Random.Range(minX, maxX), Random.Range(minY, maxY));
    }

    void Update()
    {
        transform.position = Vector2.MoveTowards(transform.position, moveSpot.position, speed * Time.deltaTime);

        if (Vector2.Distance(transform.position, moveSpot.position) < 0.2f)
        {
            //Change animation state
            if (waitTime <= 0)
            {
                _animator.SetBool("Walk", true);
                moveSpot.position = new Vector2(Random.Range(minX, maxX), Random.Range(minY, maxY));
                waitTime = startWaitTime;
            }
            else
            {
                _animator.SetBool("Walk", false);
                _animator.SetBool("Idle", true);
                waitTime -= Time.deltaTime;
            }
        }
    }

    public void Decrease()
    {
        if (transform.hasChanged)
        {
            if (transform.position.x < lastXVal)
            {
                //Update lastXVal
                lastXVal = transform.position.x;
                Debug.Log("Decreased!");
            }

            else if (transform.position.x > lastXVal)
            {
                //Update lastXVal
                lastXVal = transform.position.x;
                Debug.Log("Increased");
            }

            transform.hasChanged = false;
        }
    }

}

CodePudding user response:

You can use dot product to calculate the direction of travel.

Vector2 moveDirection = (moveSpot.position - transform.position).normalized;
float dotValue = Vector2.Dot(Vector2.right, moveDirection)

// if dotValue is 1 then you are moving right and if dotValue is -1 you are moving left
  • Related