【问题标题】:Object gets stuck when trying to bounce off screen edges, am I doing this wrong?物体在试图从屏幕边缘反弹时卡住了,我做错了吗?
【发布时间】:2014-04-22 19:58:50
【问题描述】:
public class AsteroidMovement : MonoBehaviour
{

public Vector2 speed;
public Vector2 direction;
private Vector2 movement;

private Vector3 TopScreenBound;
private Vector3 BottomScreenBound;

// Use this for initialization
void Start()
{
    TopScreenBound = Camera.main.ViewportToWorldPoint(new Vector3(0f, 1f, 0f));
    BottomScreenBound = Camera.main.ViewportToWorldPoint(new Vector3(0f, 0f, 0f));
}

// Update is called once per frame
void Update()
{
    if (gameObject.transform.position.y >= TopScreenBound.y)
    {
        direction.y *= -1;
    }

    if (gameObject.transform.position.y <= BottomScreenBound.y)
    {
        direction.y *= -1;
    }

    movement = new Vector2(speed.x * direction.x, speed.y * direction.y);
}

void FixedUpdate()
{

    rigidbody2D.velocity = movement;
}
}

我试图让游戏中的小行星从我的屏幕边缘弹起,我已经让它正常工作,但是在几次弹跳后,小行星/物体被“卡”在墙上并在游戏区出现故障.

我做错了吗?我看不到代码中的哪个位置在几次反弹后使小行星卡住了。在此先感谢 :)

【问题讨论】:

  • “卡”在墙上,是指撞到了魔法屏障,在墙边快速来回弹跳?

标签: c# unity3d collision game-physics


【解决方案1】:

您必须固定对象的位置以在屏幕内部反弹,如果您的对象已经在屏幕之外并且在下一帧中没有完全进入屏幕空间,那么您的对象正在改变它的方向是无限的,直到它进入或离开屏幕。

改变这个:

if (gameObject.transform.position.y >= TopScreenBound.y)
{
    direction.y *= -1;
}

if (gameObject.transform.position.y <= BottomScreenBound.y)
{
    direction.y *= -1;
}

到这里:

if (gameObject.transform.position.y >= TopScreenBound.y)
{
    gameObject.transform.position.y = TopScreenBound.y;
    direction.y *= -1;
}

if (gameObject.transform.position.y <= BottomScreenBound.y)
{
    gameObject.transform.position.y = BottomScreenBound.y;
    direction.y *= -1;
}

【讨论】:

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