我只是从团结开始,然后跟随Thair 2D UFO示例项目。 为了扩展它,我想出了一种怪异的方式来控制播放器。
它总是沿圆形路径移动,一旦我单击一个按钮,圆的方向就会改变,虚拟的圆心将被拉伸,如下图所示。这样一来,您就可以按照8字形或S形图案移动,这很有趣。
但是,一旦我弄清楚如何执行此动作,播放器对象便不再具有任何碰撞检测功能。 在原始示例中,整个movemet处理都在FixedUpdate()中完成。但是,我使用Update(),因为前者似乎对我的代码根本不起作用(即完全没有移动)。
这是到目前为止我的运动代码:
public class ControlledRotation : MonoBehaviour
{
public float radius = 3f;
public float speed = 3f;
private float timeCounter = 0;
private float direction = 1f;
private Vector3 offset;
private Rigidbody2D rb2d;
void Start()
{
offset = transform.position;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.RightArrow))
{
//change the offset from the circle center and the rotation direction on keypress
offset += new Vector3(Mathf.Cos(timeCounter), Mathf.Sin(timeCounter), 0) * radius * direction * 2;
direction *= -1;
}
timeCounter += Time.deltaTime * direction * speed;
transform.position = new Vector3(Mathf.Cos(timeCounter), Mathf.Sin(timeCounter)) * radius * direction + offset;
}
}
Plyer对象具有一个刚体2D和一个Circle Collider 2D。它应该与之碰撞的墙壁具有Box Collider 2D。但是,不明飞行物可以轻松地越过墙壁。 我假设一个可能的原因是我只是简单地更改了transform.position,或者因为我使用Update / FixedUpdate错误。
如果您碰巧对如何保持所选的运动控制机制并仍然能够与物体碰撞有任何建议,我将非常感激:)
编辑: 我觉得我需要使用刚体并施加一些力...但是我还没有弄清楚如何用力来再现这种运动,而且力的响应似乎也不是很清晰
答案 0 :(得分:0)
当您需要移动具有刚体的对象时,需要使用力对其进行移动,而不能仅使用transform.position来实现,而忽略了物理。这就是为什么您无法检测到碰撞的原因。我建议您像这样移动它。当不得不移动与物理学互动所需的角色时,有一些示例。
gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
这是用于沿特定方向移动它的
//Keys for controlling the player (move and shoot) only when he's alive
if (Input.GetKey(KeyCode.UpArrow) && alive)
{
GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.forward * Time.deltaTime * 4);
}
if (Input.GetKey(KeyCode.DownArrow) && alive)
{
GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.back * Time.deltaTime * 4);
}
我希望它能对您有所帮助。)