Unity中SendMessage提示无接收者报错,如何修复道具触发逻辑?
问题解决:SendMessage doubleSpeed has no receiver!
问题根源
报错本质是:你调用SendMessage("doubleSpeed")时,碰撞到的Player对象(或其碰撞体所在对象)上不存在可被调用的doubleSpeed方法,和SendMessageOptions.RequireReceiver无关——这个参数只是让报错更明确,不会解决方法不存在的问题。
解决方案
按以下步骤排查修复:
检查Player脚本的方法定义
确保Player对象挂载的脚本里有大小写完全匹配、权限为public的doubleSpeed方法,示例:public class PlayerController : MonoBehaviour { // 方法名必须和你在Bonus的name字段里填的完全一致(大小写敏感) public void doubleSpeed() { // 这里实现加速逻辑,比如修改移动速度 GetComponent<Rigidbody2D>().velocity *= 2f; } }确认消息发送的目标对象正确
如果Player的Collider是挂载在子物体上的,collision.SendMessage会把消息发给子物体,而子物体上没有对应方法。改成给Player根对象发消息:// 替换原SendMessage行 collision.transform.root.SendMessage(name, null, SendMessageOptions.RequireReceiver);替换为更安全的调用方式(推荐)
用直接获取组件调用方法替代SendMessage,避免字符串匹配带来的错误,编译期就能发现问题:// 修改Bonus脚本的OnTriggerEnter2D方法 private void OnTriggerEnter2D(Collider2D collision) { if(collision.CompareTag("Player")) { PlayerController player = collision.GetComponentInParent<PlayerController>(); if(player != null) { // 直接调用方法,无需依赖字符串 player.doubleSpeed(); Destroy(gameObject); } } }
内容的提问来源于stack exchange,提问作者pi126
相关产品推荐
相关产品推荐

