【问题标题】:How can I make the animation match when the NPC walks left or right?当 NPC 向左或向右走时,如何使动画匹配?
【发布时间】:2022-01-01 13:50:57
【问题描述】:

我有一些 NPC 在一个范围内随机走动,但是当我无法确定它们是向左还是向右走时,动画看起来不对。

我有一个名为“Decrease”的函数,当对象行走时,它会在终端内发出警告,减少或增加其位置,但该函数无法正常工作

所以...

NPC向左或向右走时如何使动画匹配?

这是我的 NPC 配置:

这是我的代码:

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

}

【问题讨论】:

    标签: c# unity3d 2d-games


    【解决方案1】:

    您可以使用点积来计算行进方向。

    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
    

    【讨论】:

    • 这工作得很好,但是有必要使用开关执行例程并转换旋转,非常感谢
    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-02-14
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多