【发布时间】:2020-08-30 01:18:45
【问题描述】:
在我的 Unity 2D 游戏中,我有一个玩家在碰到障碍物时会传送到障碍物后面。障碍物是一个从屏幕上方向下移动的矩形。到目前为止,我只通过更改 y 位置的量来制作传送效果。但是我必须根据玩家的角度进行一些区分,因为当他更多地接触障碍物时,他必须“传送”更远的距离。我已经使用以下(相当低效的)代码实现了这种传送:
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "obstacle")
{
ContactPoint2D[] contacts = new ContactPoint2D[10];
if (collision.GetContacts(contacts) > 0)
{
if (rigidbody.transform.position.y < collision.contacts[0].point.y)
directionOnObstacleTouch = 1;
else if (rigidbody.transform.position.y > collision.contacts[0].point.y)
directionOnObstacleTouch = -1;
}
teleport()
}
}
void teleport()
{
float shift;
float angle;
shift = 0;
angle = rigidbody.transform.eulerAngles.z;
if (directionOnObstacleTouch == 1) //touching the obstacle from below
{
if (angle < 90f) { shift = 1.10f + ((90f - angle) / 90f) * 0.25f; }
if (90f < angle && angle < 180f) { shift = 1.10f + ((angle - 90f) / 90f) * 0.25f; }
if (180f < angle && angle < 270f) { shift = 1.10f + ((270f - angle) / 90f) * 0.25f; }
if (270f < angle && angle < 360f) { shift = 1.10f + ((angle - 270f) / 90f) * 0.25f; }
}
if (directionOnObstacleTouch == -1) // touching the obstacle from upper side
{
if (angle < 90f) { shift = -1.10f + ((angle - 90f) / 90f) * 0.25f; }
if (90f < angle && angle < 180f) { shift = -1.10f + ((90f - angle) / 90f) * 0.25f; }
if (180f < angle && angle < 270f) { shift = -1.10f + ((angle - 270f) / 90f) * 0.25f; }
if (270f < angle && angle < 360f) { shift = -1.10f + ((270f - angle) / 90f) * 0.25f; }
}
Vector2 pos = rigidbody.transform.position;
pos.y = rigidbody.transform.position.y + shift;
rigidbody.transform.position = pos;
}
我知道这段代码效率不高,但是当我尝试旋转障碍物时它变得更加复杂。此代码仅适用于平面障碍物。请检查所附图片:我如何调整代码以使这些新的传送工作?仅添加障碍物的宽度是行不通的,因为玩家可能会从不同的角度(即使是背部)接触到障碍物。
【问题讨论】:
标签: unity3d