传送错误Unity 2d

Teleportation bug Unity 2d

对于一个愚蠢的问题,我很抱歉,因为我是 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++;
 }

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

提前致谢!

P.S。 英语不是我的母语。抱歉错误。

当头部传送并且 body 部件试图移动到头部时,body 部件正在改变头部的方向(更新方向),因此头部确实会发生碰撞再次传送。 PS: 英语也不是我的实际语言。

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

在这一行简单地添加:

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

+1 或 -1 取决于传送门的一侧