【问题标题】:Unity3d Make Player jump/teleport when touching obstacleUnity3d让玩家在接触障碍物时跳跃/传送
【发布时间】: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;
}

我知道这段代码效率不高,但是当我尝试旋转障碍物时它变得更加复杂。此代码仅适用于平面障碍物。请检查所附图片:我如何调整代码以使这些新的传送工作?仅添加障碍物的宽度是行不通的,因为玩家可能会从不同的角度(即使是背部)接触到障碍物。

what I need to add

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    我认为你想多了。据我了解你所说的和图像。玩家必须传送到障碍物前面。

    您需要的信息是:

    • ¿障碍物在看哪里?

    • ¿玩家在看哪里?

    我们将假设obstacle.Transform.Rightplayer.Transform.Right 是他们正在看的地方。

    要检查有多少这个向量是否在它们之间共享,您应该使用点积。

    使点积有用的一件事是判断 2 个向量的相似程度。如果您执行这 2 个向量的点积,您可能会得到不同的结果。

    • 1 的值。表示它们面向完全相同的方向。
    • 。表示它们面向的方向介于垂直和相同方向之间。
    • 0 的值。它们是垂直的。(例如:玩家向上看,障碍物向右)。
    • 。表示它们面向的方向介于垂直和相反方向之间。
    • -1 的值。意味着他们正面临着完全相反的方向。

    因此,使用点积给出的值,您可以检索它们所面对的方向的相似程度。有了它,您可以根据obstacle.Transform.Right移动播放器。

    这是一个显示不同值的点积图像的链接: https://chortle.ccsu.edu/VectorLessons/vch09/vch09_6.html

    一个例子是:

    private float multiplier = 5f;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "obstacle")
        {
    
           float dProduct = Vector2.Dot(this.transform.right, collision.gameobject.transform.right);
    
          if(dProduct >= 0)
          {
             this.transform.position = collision.gameobject.transform.position + collision.gameobject.transform.right * dProduct * multiplier;
          }
          else
          {
             this.transform.position = collision.gameobject.transform.position + collision.gameobject.transform.right * dProduct * multiplier * -1f;
          }
        }
    }
    

    我没有测试它,但它可能是一种方法。

    【讨论】:

    • 谢谢!我认为解决方案是以某种方式使用正弦/余弦,但点积似乎更简单(尽管它们实际上相同)。但是......实现会是什么样子?一个具体的代码好像有点复杂,你有想法吗?
    • 我用一个可能的实现编辑了答案。如果答案是正确的,请记住接受答案。
    • 我不得不稍微扩展你的代码,因为有不同的场景(障碍物从后面接触你与你从前面接触障碍物,两种可能性具有完全相同的角度),但它的工作原理归功于您使用点积的想法:) 所以我将其标记为正确
    • 不客气。这可能是一个错误,但尚未标记答案。
    • 我标记了它。由于我很新,它不会显示(但仍会记录)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多