【问题标题】:Making an NPC go up and down in UNITY让一个 NPC 在 UNITY 中上下移动
【发布时间】:2019-03-08 04:34:24
【问题描述】:

所以我有这段代码,它是使用航路点让敌人上下移动,它确实有效,但由于一个奇怪的原因,在航路点之间进行了一些循环之后,它一直到通过顶部航路点的无限远(wp0),为什么会这样???我一直在玩弄代码,但没有得到适当的行为。

代码适用于具有运动刚体的 NPC,它“漂浮”在空中,可以像马里奥兄弟游戏中的飞行 koopas 一样上下飞行......

public GameObject[] myWaypoints;
float direction = 1f; //1 up, 0 stop. -1 down.
int _myWaypointIndex = 0; // used as index for My_Waypoints
float _moveTime;
float _vx = 0f;
bool _moving = true;
public float waitAtWaypointTime = 1f;   // how long to wait at a waypoint
public bool loopWaypoints = true; // should it loop through the waypoints

void EnemyMovement()
{
    // if there isn't anything in My_Waypoints
    if ((myWaypoints.Length != 0) && (_moving))
    {

        // make sure the enemy is facing the waypoint (based on previous movement)
        Flip(_vx);

        // determine distance between waypoint and enemy
        _vx = myWaypoints[_myWaypointIndex].transform.position.y - _transform.position.y;

        direction = Mathf.Sign(myWaypoints[_myWaypointIndex].transform.position.y);
        Debug.Log("Direction = " + direction);

        // if the enemy is close enough to waypoint, make it's new target the next waypoint
        if (Mathf.Abs(_vx) <= 0.05f)
        {
            Debug.Log("changin to the next waypoint");

            // At waypoint so stop moving
            _rigidbody.velocity = new Vector2(0, 0);

            // increment to next index in array
            _myWaypointIndex++;

            Debug.Log("_myWaypointIndex = " + _myWaypointIndex);
            Debug.Log("Length = " + myWaypoints.Length);
            direction *= -1;
            Debug.Log("New Direction = " + direction);

            // reset waypoint back to 0 for looping
            if (_myWaypointIndex >= myWaypoints.Length)
            {
                Debug.Log("True");
                if (loopWaypoints)
                {
                    _myWaypointIndex = 0;
                }
                else
                {
                    _moving = false;
                }
            }

            // setup wait time at current waypoint
            _moveTime = Time.time + waitAtWaypointTime;
        }
        else
        {
            // enemy is moving
            _animator.SetBool("Moving", true);

            // Set the enemy's velocity to moveSpeed in the y direction.
            _rigidbody.velocity = new Vector2(0.0f, _transform.localScale.y * moveSpeed * direction);

        }

    }
}

【问题讨论】:

    标签: c# unity3d kinematics waypoint


    【解决方案1】:

    我认为问题在于当您将 _myWaypointIndex 重置为 0 时,loopWaypoints 在其他一些函数中,但是 else 不会使 NPC 停止,所以可能会继续移动到下一个它找不到的航点,因为索引没有被重置所以_vx距离永远不会为0,尝试检查loopWaypoints是否在你想要的时候改变了值,错误可能在那里。

            if (loopWaypoints)
            {
                _myWaypointIndex = 0;
            }
            else
            {
                _moving = false;
                //Stop the movment 
                moveSpeed = 0;
            }
    

    【讨论】:

      【解决方案2】:

      也许: 如果敌人经过最后一个航路点并且 _vx> 0.05f 会发生什么?

      它不会被抓住:

      if (Mathf.Abs(_vx) <= 0.05f)
      

      【讨论】:

        【解决方案3】:

        问题是在 Mathf.abs(_vx)

        你应该做的是在航点处附加一个触发器,并在玩家接触到该触发器时更改航点坐标。

        或者这样做。

        _vx =   Mathf.Abs(myWaypoints 
        [_myWaypointIndex].  
        transform.position.y) - 
        Mathf.Abs(_transform.position.y);
        
        //And then write.
        
        if (_vx <= 0.5f)
           // change coordinate.'''
        

        【讨论】:

          猜你喜欢
          • 2020-06-24
          • 2019-02-17
          • 1970-01-01
          • 1970-01-01
          • 2020-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多