【发布时间】: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