【发布时间】:2019-06-26 22:01:56
【问题描述】:
我真的需要一些关于我的游戏对象的帮助。
我正在开发一款游戏,其中我想要一个拾取物品来制造物理力爆炸以吹散敌人。我做了一个简单的炸弹对象来测试这个想法。我添加了一个简单的代码,使用循环收集其半径内的所有对撞机,然后将强制添加到这些对撞机。现在代码可以正常工作了,但并不是我所有的游戏对象都能正常反应。
我研究了为什么会这样,我注意到一旦我向对象添加 RigidBody 组件,我的 Collider 就会不断地从游戏对象上掉下来。 AddForce 影响需要 RigidBody。当我移除 rb 时,对撞机保持原位,但对象不会对物理力做出反应。
我添加了一些图片来说明我的意思:
Image of the Collider of the leaf sinking away..
Example image of objects which DO react to the AddForce.
我已经尝试过:
- 从反应的立方体和石头复制/粘贴所有组件设置
在禁用所有其他代码的同时将游戏对象添加到叶游戏对象
比如c#脚本。对撞机和 RB 不会通过
地板,但是当物理力击中对撞机时,它会被吹走
游戏对象保持其位置。
- 尝试不同的游戏对象/碰撞器类型。
- 除去水。
- 使用炸弹的力量/半径。
- 编辑了游戏对象的“标签”和“图层样式”。
下面添加了“爆炸代码”,但是,我认为问题不在代码中。我将代码添加到场景的主摄像机中,并添加了一个简单的球体作为“炸弹”游戏对象。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Explosion : MonoBehaviour
{
public GameObject bomb; //set the position of the explosion
public float power = 10.0f;
public float radius = 10.0f;
public float upForce = 0.0f;
private void FixedUpdate()
{
if (Input.GetKeyDown("space"))
{
print("space key was pressed");
Invoke("Detonate", 1);
}
}
void Detonate()
{
Vector3 explosionPosition = bomb.transform.position; //set the position of our explosion to the position of the bomb.
Collider[] colliders = Physics.OverlapSphere(explosionPosition, radius); //collects all colliders within the radius.
foreach (Collider hit in colliders) { //for each individual collider the following code is ran.
Rigidbody rb = hit.GetComponent<Rigidbody>(); //declare'rb' rigidbody. Get rb component from each collider
if (rb != null)
{
print("BOOM!");
rb.AddExplosionForce(power, explosionPosition, radius, upForce, ForceMode.Impulse); //add force to each collider
}
}
}
}
如何让叶子的 Rigidbody、Collider 和 GameObject 像标准的 3D 对象“立方体”一样相互保持,这样我就可以像其他模型一样用物理力将它们吹走?
感谢您抽出宝贵时间,我已经尝试了几个小时并在 Internet 上四处寻找,但似乎找不到任何解决方案。
【问题讨论】:
-
如果对叶子使用网格对撞机而不是球体对撞机会发生什么?可能是您模型的中心偏移了,使对撞机的原点不在您的实际模型上。 (然而,那应该已经发生了,没有 rb)。另外,如果您增加对撞机的中心 Y 值以再次匹配您的叶子会发生什么?是再次自动倒下还是原地不动?
-
感谢您的回复。网格对撞机没有任何区别,但改变对撞机上的 Y 值以匹配叶子使对撞机停止从地板上掉下来,这是一个很大的胜利!但是,对撞机仍然没有粘在 GameObject 上。当我激活代码时,对撞机会响应 AddForce 但 GameObject 不会移动,这与球体对象不同。我通过这个链接添加了一张图片来说明。 (pro2-bar.myportfolio.com/v1/assets/…)
-
所以我只是在另一个荷叶对象上添加了一个网格对撞机,同样的事情发生了。我必须按“凸”,否则莲花会从地板上掉下来。但是,当我对着游戏对象游泳时,对撞机仍然没有正确附加到游戏对象上,因为它移动了位置。 (pro2-bar.myportfolio.com/v1/assets/…)
-
这很奇怪。当对撞机移动但莲花/叶子保持原位时,变换的 XYZ 是否会发生变化?或者对撞机上的中心XYZ会改变吗?你的叶子上是否有任何脚本不在你的岩石上,它们的行为符合预期?如果是这样,请尝试禁用该脚本。也许还有另一个脚本可以锁定对象的位置(还有你使用的是哪个版本的 Unity?)
标签: c# unity3d game-physics gameobject rigid-bodies