【问题标题】:Back and forth movement using Rigidbody2D movePosition使用 Rigidbody2D movePosition 来回移动
【发布时间】:2017-06-13 13:03:10
【问题描述】:

我有两个力场 I 和 II(图片在这里 - https://i.stack.imgur.com/yXAhQ.png)。它们都有一个带有布尔“repel”的附加脚本,该脚本在 MouseDown() 上切换。这些力场需要直接在其路径上吸引或排斥宇宙飞船。船的实际运动是通过从船上向右和向下的光线投射来完成的。这些射线投射检查力场的“排斥”布尔值,然后飞船要么移开要么移向力场。所有游戏对象都是运动学的。

我需要能够通过切换它们的“排斥”布尔值来在力场之间来回移动飞船。通过使用 transform.Translate 移动船,这可以正常工作。然而,碰撞是错误的,所以我决定改用 Rigidbody2D.MovePosition。

现在,飞船可以向 ForceField I 移动,当它检测到 ForceField II 时,它会沿垂直线改变航向,这正是我想要的。但是,当它沿 X 轴射线检测到 ForceField I 时,它不能再靠近或远离 ForceField I。所以,船现在只能上下移动。如何让飞船在力场之间移动?

这是附在船上的代码 -

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class shipRays_test : MonoBehaviour {

             public float rayDistance = 100;
             public Vector2 Xspeed;
             public Vector2 Yspeed;

             private polarityScript polarityright;
             private polarityScript polaritydown;
             private Rigidbody2D rb;

             void Start()
             {
                 rb = GetComponent<Rigidbody2D>();
             }  

             void FixedUpdate ()
             {
                 Debug.DrawRay (transform.position, Vector2.right * rayDistance, Color.red);
                 RaycastHit2D rightHit = Physics2D.Raycast (transform.position, Vector2.right, rayDistance);

                 Debug.DrawRay (transform.position, Vector2.down * rayDistance, Color.green);
                 RaycastHit2D downHit = Physics2D.Raycast (transform.position, Vector2.down, rayDistance);

                 if (rightHit.collider != null) 
                 {
                     if (rightHit.collider.CompareTag ("forceField"))
                     {    
                         polarityright = rightHit.collider.gameObject.GetComponent<polarityScript > ();
                         if (polarityright.repel) 
                         {
                             rb.MovePosition (rb.position - Xspeed * Time.fixedDeltaTime);      
                         }
                         else if (!polarityright.repel)
                         {
                             rb.MovePosition (rb.position + Xspeed * Time.fixedDeltaTime);
                         }
                     }
                 }

                 if (downHit.collider != null)
                 {
                     if (downHit.collider.CompareTag ("forceField"))
                     {
                         polaritydown= downHit.collider.gameObject.GetComponent<polarityScript >();
                         if (polaritydown.repel)
                         {
                             rb.MovePosition (rb.position + Yspeed * Time.fixedDeltaTime);
                         }
                         else if (!polaritydown.repel)
                         {
                             rb.MovePosition (rb.position - Yspeed * Time.fixedDeltaTime);
                         }
                     }
                 }
             }
 }

【问题讨论】:

  • 您可能必须将要使用的偏移量相加并仅调用一次rb.MovePosition()。在我看来,该函数的作用是存储它给出的值并从当前位置进行插值,因此第二次调用它会覆盖该值。
  • 你能给我看一个示例代码行吗?我不确定我应该如何进行。我应该将对象的 rb.position 存储在 fixedUpdate 中的变量中并将其传递给 rb.MovePosition 吗?
  • 在两个 if 语句之前:Vector3 newPos=rb.position; ... 在第一个 if 块内:newPos += Yspeed; ... 在第二个内:newPos += Xspeed; ... 在两者之后:rb.MovePosition(newPos)
  • 成功了!非常感谢!
  • 我不确定是否是这种情况(MovePosition() 覆盖了该值),但您已确认我的建议有效,我现在将其作为答案发布。

标签: c# unity3d unity5 unity3d-2dtools


【解决方案1】:

显然Rigidbody.MovePosition() 存储传递的值并在帧上进行插值,每次调用都会覆盖先前的值,在此期间Rigidbody.position 不会更改。文档中根本没有说明这一点(或者至少没有说明),但问题就在于此。

要解决此问题,您需要自己创建一个变量来保持所需的新位置,并将其作为逻辑流添加到其中,并且仅在最后调用 MovePosition()

所以你必须像这样设置:

Vector3 newPos = rb.position;
 if (rightHit.collider != null) 
 {
     //...
         {
             newPos -= Xspeed * Time.fixedDeltaTime;      
         }
     //...
 }

 if (downHit.collider != null)
 {
     //...
         {
             newPos += Yspeed * Time.fixedDeltaTime;      
         }
     //...
 }
 rb.MovePosition(newPos);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多