【发布时间】: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