【问题标题】:Unity 3D - Moving Object & Player with Push/Pull || Applying Opposing ForceUnity 3D - 使用推/拉移动对象和播放器 ||施加反作用力
【发布时间】:2018-09-03 19:46:12
【问题描述】:

所以我一直在为一个问题苦苦挣扎,不知道如何解决。

我正在尝试在 Unity 中模拟类似于《星球大战》中使用的原力的魔法系统,但遇到了一些麻烦。我正在尝试适当地模拟推拉物体。这意味着当玩家推动一个物体时,玩家和物体都会受到施加在他们身上的力。如果物体足够轻,玩家应该不会受到任何明显的影响,并且应该将物体推开。如果它们的质量相似,则两者都应该以一定的速度被推开,如果物体较重,玩家应该主要被推开。拉动也是如此。问题是当物体被锚定在某物上时。如果玩家将轻物体推入墙壁,玩家应该开始接收足够的力来开始将它们向后推,因为墙壁和物体的总质量将玩家向后推。

目前,当按下一个键时,我可以使用以下代码执行第一部分: 请注意,力是根据玩家到物体的距离和物体的质量来确定的。

// 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 根据其刚体质量决定是否移动实体。

我的问题是,我如何检测一个物体是否被锚定,如果它结合了物体的质量和它所锚定的物体,并将该力施加到玩家身上?我在想怎么做,我知道我需要弄清楚施加力的方向,然后确定被推或拉的物体是否与该方向的任何物体发生碰撞,如果是的话根据组合质量向玩家施加力。但是,当以靠墙的角度推动物体时,这会变得有些棘手。例如考虑以下场景:

施加在立方体上的力有一个水平分量和一个垂直分量,因此当立方体+墙壁组合的物体向玩家推回时应该考虑这一点。这怎么可能实现或接近?我真的很难想出如何在没有硬编码指令的情况下做到这一点。

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

注意该系统实际上是基于名为 Mistborn 的系列丛书,但这个概念非常接近星球大战中的原力,所以当更多人熟悉时,我会使用它它

【问题讨论】:

    标签: c# unity3d game-physics


    【解决方案1】:

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

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

    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;
    }
    

    使用此解决方案,您将能够检查玩家相对于附近墙壁的位置。这可以用来计算他的方向与墙相比,相对于他正在推动的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多