Unity中OnTriggerEnter2D仅修改触发碰撞对象int值问题
问题原因
你当前代码里的flowerPoint是实例级变量,每一个挂载了该脚本的GameObject都会单独持有一份独立的flowerPoint副本,触发碰撞时自然只会修改被碰撞对象自己的那一份变量,不会同步到其他6个对象的同名字段。
解决方案
根据你的实际需求可以选择以下两种实现方式:
方案1:所有挂载该脚本的对象共享同一个flowerPoint数值
把变量改成静态成员即可,静态成员属于类本身,所有类实例共享同一份存储:
// 添加static关键字 public static int flowerPoint; private void OnTriggerEnter2D(Collider2D collision) { // 推荐用CompareTag代替直接==tag,性能更优 if(collision.CompareTag("Bee")) { if (flowerPoint >= 4) { Invoke("startMakingHoney", 10f); flowerPoint -= 4; } } }
注意:静态变量不会显示在Inspector面板,如果需要在编辑器里调整初始值,可以单独写一个全局管理类持有这个变量,或者在脚本的
Awake/Start方法里给静态变量赋初始值。
方案2:每个对象保留独立的flowerPoint,仅碰撞时同步修改所有对象的数值
如果你的业务逻辑需要每个对象单独存储自己的flowerPoint,只是碰撞触发时要所有对象的数值同步减4,可以查找所有挂载了该脚本的实例批量修改:
[SerializeField] public int flowerPoint; private void OnTriggerEnter2D(Collider2D collision) { if(collision.CompareTag("Bee")) { if (flowerPoint >= 4) { Invoke("startMakingHoney", 10f); // 查找所有该脚本的实例,统一修改数值 foreach(var scriptInstance in FindObjectsOfType<替换为你的脚本类名>()) { scriptInstance.flowerPoint -= 4; } } } }
提示:把代码里的
替换为你的脚本类名修改为你实际的C#脚本文件名即可。
内容的提问来源于stack exchange,提问作者BitsuBOA
相关产品推荐
相关产品推荐

