【发布时间】:2022-01-19 21:52:12
【问题描述】:
嗨,
我的 2d unity 项目有问题。
我的目标是什么:
我想要一个带有额外碰撞器的玩家。这个 Collider 应该将每个带有“Stone”标签的游戏对象放在一个列表中。
我尝试了什么:
我创建了另一个对象,它是我的播放器对象的子对象。
子对象有一个圆形 2d 对撞机(设置为触发器),应该将所有带有“石头”标签的东西放在其父对象的游戏对象列表中。当我撞到一块石头时,这给了我一个错误(有关更多详细信息,请参见下文)。
然后我尝试将它放在子对象的列表中并且它起作用了。我无法真正想象为什么它适用于孩子而不是父母。
这里是脚本:
stompRadiusCollScript(child) 的相关部分:
public class stompRadiusCollScript : bendingScript
{
private GameObject parent;
private List<GameObject> colls;
void Start()
{
colls = new List<GameObject>();
parent = base.gameObject;
}
private void OnTriggerEnter2D(Collider2D givenCollider)
{
if (givenCollider.tag == "Stone")
{
GameObject co = givenCollider.gameObject;
//is able to add in Child List
colls.Add(co);
//cannot add in parent list
//throws error
currCollisions.Add(co);
}
}
错误信息是什么:
NullReferenceException: Object reference not set to an instance of an object
stompRadiusCollScript.OnTriggerEnter2D (UnityEngine.Collider2D givenCollider)
bendingScript(parent)的相关代码:
public class bendingScript : MonoBehaviour
{
protected List<GameObject> currCollisions;
public Collider2D coll;
private System.DateTime _lastTimeStompAttack;
private float _stompAttackMinDelayInMs = 500f;
private float _forceForStone = 100f;
void Start()
{
currCollisions = new List<GameObject>();
coll = GetComponent<CircleCollider2D>();
_lastTimeStompAttack = DateTime.UtcNow;
}
}
附加信息:
- 带有石头标签的对象有一个刚体2d和一个circlecollider2d
问题:
我如何将我所有的石头碰撞作为游戏对象放在父级列表中(bendingScript)?
【问题讨论】:
-
您没有在
stompRadiusCollScript中初始化currCollisions,因为bendingScript.Start是隐藏的。这回答了你的问题了吗? How to correctly inherit Unity's callback functions like Awake(), Start() and Update and FixedUpdate()? -
### 这解决了一个问题。谢谢。但我以某种方式创建了 2 个对象,并以这种方式创建了 2 个单独的列表。孩子有另一个列表而不是父母。
###### 我在父项中添加的内容:protected virtual void Start()###### 我在子项中添加的内容:protected override void Start() {base.Start;}我有点知道继承在控制台应用程序上的作用,但它是如何实现的在这里工作?据我所知,孩子是父母的高级版本,那么我怎么能只在世界上添加孩子呢?还是我误会了什么?