Unity 3D - 移动物体&推/拉的球员||应用反对力量

时间:2018-03-25 16:52:56

标签: c# unity3d game-physics

所以我一直在努力解决问题,不知道如何处理它。

我正在尝试模拟类似于星球大战中使用的力量的魔法系统,并遇到了一些麻烦。我正在尝试模拟适当地推动和拉动物体。这意味着当玩家推动一个物体时,玩家和物体都会施加一个力。如果物体足够轻,则不应以任何明显的方式影响玩家,并且应该将物体推开。如果他们的群众是相似的,那么两者都应该以某种速度被推开,如果对象是劈开的,那么玩家应该主要被推开。拉动也是如此。问题是当对象锚定某些东西时。如果玩家将轻型物体推入墙壁,则玩家应该开始接受足够的力量以开始向后推动它们,因为墙壁和物体的组合质量正在推动玩家返回。

目前,当按下某个键时,我可以使用以下代码执行第一部分: 请注意,力的确定取决于玩家与物体之间的距离及其质量。

// dir: push or pull (-1 or 1)

Vector3 directionToPlayer = (dir * (player.transform.position - transform.position)).normalized;

rb.AddRelativeForce(directionToPlayer * f * Time.deltaTime);

player.GetComponent<Rigidbody>().AddRelativeForce(-directionToPlayer * f * Time.deltaTime);

实际上,当对象仅依靠Unity的物理系统时,代码才能正常工作。但是,当物体被推到墙上或者某些东西很重时,它不起作用。这很清楚,因为我只是对对象和玩家施加相同的力,让Unity决定是否根据其刚体质量移动实体。

我的问题是,如何检测对象是否被锚定,以及它是否将对象的质量与锚定的对象组合在一起,并将该力量应用于播放器?我正在考虑如何做到这一点,我知道我需要弄清楚施加力的方向,然后确定被推或拉的物体是否与该方向的任何物体发生碰撞,如果是这样的话根据组合质量向玩家施加力量。然而,当以一个靠墙的角度推动物体时,这会变得有点棘手。例如,请考虑以下情形:

enter image description here

在立方体上施加力的水平和垂直分量,因此当立方体+墙组合对象推回到玩家时应该考虑。怎么能完成或接近?如果没有硬编码方向,我真的很难想到如何做到这一点。

感谢任何帮助,我很乐意澄清是否有任何不清楚的地方。

注意该系统实际上是基于一本名为Mistborn的书籍系列,但这个概念与“星球大战”中的“力量”非常接近,所以随着越来越多的人熟悉,我将继续使用它。它

1 个答案:

答案 0 :(得分:0)

这不是一个完整的解决方案,但你可以使用我的想法来获取附近的物体,然后根据它对你的物体和玩家施加力。

脚本应放在您正在推动的对象上,或者至少使用您正在推动的对象的球体对撞机。

public List<string> _ValidTargetTags = new List<string> { "Wall" };

public void CheckNearbyArea()
{
    //Each of the nearby items will be checked to see if they are a wall or other valid target.
    Collider[] ObjectsStruck = ScanForItems(GetComponent<SphereCollider>());
    foreach (var o in ObjectsStruck)
    {
        if (_ValidTargetTags.Contains(o.gameObject.tag))
        {
            //If wall or other valid target
            //Check where wall is placed
            //Act according to wall position.
        }
    }
}

///The method below should find a list of all items inside a spherecollider of the object you are pushing.
Collider[] ScanForItems(SphereCollider sphereCollider)
{
    Vector3 center = sphereCollider.transform.position + sphereCollider.center;
    float radius = sphereCollider.radius;

    Collider[] allOverlappingColliders = Physics.OverlapSphere(center, radius);

    return allOverlappingColliders;
}

使用此解决方案,您将能够检查球员相对于任何附近墙壁的位置。这可以用来计算他的方向与墙相比,相对于他推动的物体。