【问题标题】:move object downwards with Vector2.MoveTowards in a void使用 Vector2.MoveTowards 在 void 中向下移动对象
【发布时间】:2020-05-11 13:56:08
【问题描述】:

所以,我对这段代码有点问题:

private void ReDeal()
{
    if (!userInput.first)
    {
        userInput.FirstSelected(GameObject.Find(bottoms[0][0]));
        bottoms[0].Remove(userInput.slot1.name);
        GameObject cardToDestroy = GameObject.Find(userInput.slot1.name);

        //Move card down before destroy

        Destroy(cardToDestroy);



        bottoms[0].Add(deck.Last<string>());
        deck.RemoveAt(deck.Count - 1);
    }
}

目前它正在正常工作,并且游戏对象 (cardToDestroy) 已被销毁。 id 喜欢做的是将 Gameobject 向下移动 Y 轴,使其“滑出”屏幕并在此之后将其销毁。尝试使用 while 循环和 Vector2.MoveTowards 或 Vector2.Lerp 来实现这一点,但没有成功。我似乎没有让 MoveTowards 在 VOID 内工作

【问题讨论】:

  • 你可以使用速度将它向下移动并检查它是否接触地面以在它在地下时将其摧毁

标签: c# unity3d void


【解决方案1】:

好的,我实际上解决了这个问题,我用 while 循环创建了一个 IEnumerator:

IEnumerator MoveCard(GameObject card, int cardIndex)
{
    Vector2 startPosition = card.transform.position;
    Vector3 stopPOsition = new Vector2(startPosition.x, startPosition.y - 4);
    while(Vector2.Distance(card.transform.position, stopPOsition) > 0.1f)
    {
        float step = 10f * Time.deltaTime;
        card.transform.position = Vector2.MoveTowards(card.transform.position, stopPOsition, step);
        yield return null;
    }

    Destroy(card);


}

然后我将 IEnumerator 称为 ReDeal() void 内的协程:

private void ReDeal()
{
    if (!userInput.first)
    {
        userInput.FirstSelected(GameObject.Find(bottoms[0][0]));
        bottoms[0].Remove(userInput.slot1.name);
        GameObject cardToDestroy = GameObject.Find(userInput.slot1.name);

        StartCoroutine(MoveCard(cardToDestroy, 0));


    }
}

【讨论】:

    【解决方案2】:

    您可以通过使用协程轻松实现此效果。

    private void ReDeal()
    {
        if (!userInput.first)
            {
                userInput.FirstSelected(GameObject.Find(bottoms[0][0]));
                bottoms[0].Remove(userInput.slot1.name);
                GameObject cardToDestroy = GameObject.Find(userInput.slot1.name);
            //Move card down before destroy
            StartCoroutine(Destroy());
    
            bottoms[0].Add(deck.Last<string>());
            deck.RemoveAt(deck.Count - 1);
        }
    }
    
    private float movementFactor = 1.0f;
    private float maximumDistance = 15f;        
    
    private IEnumerator Destroy(GameObject go, float distance)
            {
                float accumulatedDistance = 0;
                float go_x = go.transform.position.x;
                float go_z = go.transform.position.z;
                if (accumulatedDistance < distance)
                {
                    go.transform.position -= new Vector3(0,movementFactor,0);
                    yield return null;
                }
    
            Destroy(go);
        }
    

    【讨论】:

      【解决方案3】:

      对于这种事情,你最好的朋友是协程。

      IEnumerator SlideAndDestroy(Card cardToDestroy)
      {
          float velocity = -1;
          while(transform.position.y > offscreenDistance)
          {
              transform.position += new Vector3(0, velocity * Time.deltaTime, 0);
              yield return new WaitForSeconds(Time.deltaTime);
          }
          Destroy(cardToDestroy);
          yield return null;
      }
      

      然后你想在哪里销毁你的卡

      StartCoroutine(SlideAndDestroy(cardToDestroy));
      

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        相关资源
        最近更新 更多