unity3d - 从对撞机访问游戏对象属性
问题描述
所以我有导弹。当它击中目标时,导弹会爆炸。
爆炸有一个半径,里面可能有很多敌人。
敌人有一个“脚本/公共变量”爆炸预制。
我在 MissileMove 类中找到所有使用对撞机的敌人:
Collider[] colliders = Physics.OverlapSphere( transform.position, explosionRadius );
foreach (Collider coli in colliders)
if (coli.tag == "Enemy")
Damage( coli.gameObject);
如何通过变换访问敌人的爆炸预制件?
编辑 - 阅读后...
我的问题是explosionPrefab(enemyMove 类)被定义为一个Transform。它现在是一个游戏对象。它有效:)
但是,实例化爆炸会引发“invalidCastException”并退出函数。爆炸运行(!),但功能的其余部分被跳过 - 敌人幸存下来!
但是,如果我将相同的爆炸预制件“附加”到本地脚本(MissileMove),并改为使用它,它会正常运行(不抛出异常) - 有什么区别?
void Damage( GameObject enemy )
{
GameObject exp = enemy.GetComponent<EnemyMove>().explosionPrefab;
Debug.Log("Start EnemyExplosion");
// Below throws exception, runs, then quits function
GameObject explosion = Instantiate( exp, enemy.transform.position, enemy.transform.rotation);
// Below runs perfectly
GameObject explosion = Instantiate( enemyExplosion, enemy.transform.position, enemy.transform.rotation);
Destroy(explosion, 2f);
Debug.Log("EnemyExplosion startet");
Destroy(enemy);
}
例外:
InvalidCastException:指定的强制转换无效。
(wrapper castclass) System.Object.__castclass_with_cache(object,intptr,intptr)
UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 位置, UnityEngine.Quaternion 旋转) (在
C:/buildslave/unity/build/Runtime /Export/Scripting/UnityEngineObject.bindings.cs:276)
BulletMove.Damage (UnityEngine.GameObject 敌人) (在 Assets/Scripts/BulletMove.cs:60)
BulletMove.HitTarget () (在 Assets/Scripts/BulletMove.cs:49 )
BulletMove.Update () (在 Assets/Scripts/BulletMove.cs:26)
解决方案
你可以在你的敌人中使用GetComponentInChildren
或使用,然后从那个类中获得相应的爆炸。GetComponent
Physics.OverlapSphere
推荐阅读
- java - 减少一个数据库表中的一项并将其添加到另一个表
- angular - Maximum call stack size exceeded when adding PWA in Angular
- javascript - 使用 jQuery 更改查询参数的值
- mysql - “调用未定义的方法 Illuminate\Support\Facades\File::save()”
- javascript - 如何在多边形上显示标签和图标?
- amazon-web-services - 我正在实施 AWS 实例调度程序,如果我想保持实例/环境正常运行,尽管它计划停止运行,我该怎么办?
- javascript - i can not Specify a variable out of the event
- php - 如何仅更新 Laravel 表单中的一个输入?
- c# - 如何在我的窗口服务应用程序中修复我的 Web API 调用的 400 错误请求
- makefile - *** 尽管使用了制表符,但缺少分隔符