【问题标题】:Get a new move point, freeze her and move the object until it reaches the point获取一个新的移动点,冻结她并移动对象直到它到达该点
【发布时间】:2022-08-15 17:23:15
【问题描述】:

当玩家远离召唤物超过 10f 时,我试图编写逻辑,召唤物在玩家周围获得一个随机点并朝它移动。

我已经计算了到玩家的距离,当距离超过 10 时,会在玩家周围生成一个随机点,并将光束指向那里。

问题是这个点每帧都会更新一次,我无法弄清楚如何记录一次,直到召唤到达它。

    void Update()
{

    Vector3 RelativePosition = transform.position;
    Vector3 PlayerPosition = Player.transform.position;
    
    float DistanceToPlayer = Vector3.Distance(PlayerPosition, RelativePosition);
    
    if (DistanceToPlayer >= MaxDistanceToPlayer)
    {
    
        MoveToPlayer = true;
        StartCoroutine(MovingToPlayer());
    
    }

}

IEnumerator MovingToPlayer()
{
    
    Vector3 NewPositionToPlayer = Player.transform.position + new Vector3 (Random.Range(-2.0f, 2.0f), 0f, Random.Range(-2.0f, 2.0f));
    Debug.DrawLine(transform.position, NewPositionToPlayer, Color.red);
    
    while (transform.position != NewPositionToPlayer)  
    {  
        
        yield return null;
    }
    
    MoveToPlayer = false;

}

附言

好像下面的代码已经解决了,但是现在对象被传送了,而不是随着时间的推移移动到一个新的点。

        while (transform.position != NewPositionToPlayer)  
    {  
       
        var step =  WalkSpeed * Time.deltaTime; // calculate distance to move
        transform.position = Vector3.MoveTowards(transform.position, NewPositionToPlayer, step);
        Debug.DrawLine(transform.position, NewPositionToPlayer, Color.red);
       
    }
    
    yield return null;

    标签: c# unity3d ienumerator


    【解决方案1】:

    更新:我的最后一个答案是错误的,问题出在 while 循环中。因为循环在单个帧中运行,所以您的脚本所做的就是在循环中运行代码,直到它到达目标位置,并且它看起来像是传送,因为它在单个帧中完成了所有这些。相反,您应该将代码放在更新循环中,但添加一个布尔检查,或者如果对象已实例化,则将其销毁。

    【讨论】:

      【解决方案2】:

      如果有人可以提供帮助:

      void Update()
      {
      
          Vector3 RelativePosition = transform.position;
          Vector3 PlayerPosition = Player.transform.position;
          
          float DistanceToPlayer = Vector3.Distance(PlayerPosition, RelativePosition);
          
          var step = WalkSpeed * Time.deltaTime; // calculate distance to move
          transform.position = Vector3.MoveTowards(transform.position, Pivot.transform.position, step);
          
          if (DistanceToPlayer >= MaxDistanceToPlayer)
          {
              if(MoveToPlayer == false)
              {
                  MoveToPlayer = true;
                  Vector3 NewPositionToPlayer = Player.transform.position + new Vector3 (Random.Range(-2.0f, 2.0f), 0f, Random.Range(-2.0f, 2.0f));
                  Pivot.transform.position = NewPositionToPlayer;
                  Debug.DrawLine(transform.position, NewPositionToPlayer, Color.red);
              }
          }
          
          if (Pivot.transform.position == transform.position)
          {
              MoveToPlayer = false;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多