【问题标题】:Teleportation bug Unity 2d传送错误 Unity 2d
【发布时间】:2021-10-30 10:06:58
【问题描述】:

对于一个愚蠢的问题,我很抱歉,因为我是 Unity 的新手。

我一直在努力解决一个我无法找到答案并且并不真正理解的问题。 这是我记录的问题:https://youtu.be/C7Bfq--56h8

这是我的代码:

蛇运动:

    void Start()
    {       

    }

      private void Awake()
      {
            if(!rigidbody) rigidbody = GetComponent<Rigidbody2D>();
      }


    // Update is called once per frame
     void Update ()
     {
      
     if(Input.GetKey(KeyCode.A))
     {
         angle += Time.deltaTime * rotationSpeed;
     }
     if(Input.GetKey(KeyCode.D))
     {
         angle -= Time.deltaTime * rotationSpeed;
     }

     PositionHistory.Insert(0, transform.position);

      int index = 0;
     foreach (var body in BodyParts) {
           Vector3 point = PositionHistory[Mathf.Min(index * Gap, PositionHistory.Count - 1)];
           Vector3 moveDirection = point - body.transform.position;
           body.transform.position += moveDirection * BodySpeed * Time.deltaTime;
            Quaternion rotation = Quaternion.LookRotation(body.transform.position - transform.position, transform.TransformDirection(Vector3.up));
            body.transform.rotation = new Quaternion(0, 0, rotation.z, rotation.w);
           index++;
     }
        
     }
     private void FixedUpdate()
      {
      rigidbody.MoveRotation(angle);
       rigidbody.velocity = rigidbody.GetRelativeVector(Vector3.right).normalized * speed;
      }


      private void GrowSnake() 
      {
            StartCoroutine(waiter());
      }

      private void OnTriggerEnter2D(Collider2D col)
     {
           if (col.gameObject.layer == 7)
            {
                  GrowSnake();
            }
     }
      IEnumerator waiter()
      {
            GameObject body = Instantiate(BodyPrefab);
            body.SetActive(false);
            BodyParts.Add(body);
            yield return new WaitForSeconds(0.2f);
            body.SetActive(true);

      }
}

}

WallTeleportation 代码:

private void OnTriggerEnter2D(Collider2D col) {
if (col.gameObject.layer == 6) {
    Debug.Log("GameObject1 collided with " + col.transform.position);
    col.transform.position = new Vector3(col.transform.position.x, col.transform.position.y * -1, 0);
    }
}

我假设问题出现在这部分:

  int index = 0;
 foreach (var body in BodyParts) {
       Vector3 point = PositionHistory[Mathf.Min(index * Gap, PositionHistory.Count - 1)];
       Vector3 moveDirection = point - body.transform.position;
       body.transform.position += moveDirection * BodySpeed * Time.deltaTime;
        Quaternion rotation = Quaternion.LookRotation(body.transform.position - transform.position, transform.TransformDirection(Vector3.up));
        body.transform.rotation = new Quaternion(0, 0, rotation.z, rotation.w);
       index++;
 }

在过去的整个晚上和现在几个小时里,我一直在为这个问题苦苦挣扎。任何建议都会有所帮助。

先谢谢了!

附: 英语不是我的母语。对错误感到抱歉。

【问题讨论】:

  • 我理解的问题是因为头部变形时身体部位正在改变运动方向。
  • 请以文字、图片(动画gif?)的形式添加问题描述,以提高此问题的实用性和可发现性
  • Emond,请看这个问题:stackoverflow.com/questions/69786300/…这个基本一样,但是这个问题的第二部分。非常感谢您的建议!!!

标签: c# unity3d c#-4.0


【解决方案1】:

当头部瞬移并且身体部位试图前往头部时,身体部位正在改变头部的方向(更新方向),因此头部会再次碰撞并再次传送。 PS:英语也不是我的实际语言。

【讨论】:

    【解决方案2】:

    传送错误是由在另一个门户的坐标处变换对象引起的,另一个门户也是如此。因此,头部会不断地从左向右弹跳。

    只需在这一行添加:

    col.transform.position = new Vector3((col.transform.position.x * -1) + 1, col.transform.position.y, 0);
    

    +1 或 -1 取决于门户的一侧

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多