首页 > 解决方案 > Unity:尝试调用事件时出错

问题描述

我想在播放器与另一个对象发生碰撞时触发一个事件,并在 EventManager 脚本中创建事件,在播放器脚本中引用它,订阅它的“onCollision”方法但是当我尝试在“OnCollisionEnter2D”中调用它时方法它给我一个错误,就像我需要订阅它一样,我不知道为什么。我怎样才能正确调用它?我查看了教程和文档,但我不明白我做错了什么..

错误: PlayerScript.cs(42,21):错误 CS0070:事件“EventManager.onCollisionDo”只能出现在 += 或 -= 的左侧(在“EventManager”类型中使用时除外)

事件管理器脚本:

using System.Collections.Generic;
using UnityEngine;
using System;

public class EventManager : MonoBehaviour
{
    public event onCollisionDo_dlg onCollisionDo;
    public delegate void onCollisionDo_dlg();
   
}

播放器脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class PlayerScript : MonoBehaviour
{

    public float speed = 10;
    private Rigidbody2D body;
    private Vector2 Movement;
    [SerializeField]
    private GameObject EventManager_reference;     // reference to the EventManager via inspector 
    private EventManager EventMS;                  // reference to the EventManager script


   
    void Start()
    {
        body = GetComponent<Rigidbody2D>();
        EventMS = EventManager_reference.GetComponent<EventManager>();
        EventMS.onCollisionDo += onCollision;
    }

    
 void Update()
    {
        Movement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    }

 private void FixedUpdate()
    {
        body.MovePosition((Vector2)transform.position + (Movement * speed * Time.deltaTime));
    }
 private void onCollision()                             // Method to execute when event triggered
    {
        print("it collided");          
        
    }
 private void OnCollisionEnter2D(Collision2D temp)
    {
        EventMS.onCollisionDo?.Invoke();                  // Here is the problem 
    }
}

标签: c#unity3deventsgame-enginegame-development

解决方案


问题背后的原因

该错误是由于在其所在的类之外调用事件而出现的。
更多信息:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/event

潜在的解决方案

如果您希望能够在EventManager类之外调用您的委托,请删除event关键字或添加允许使用另一种方式调用事件的公共方法。

额外说明

在这种情况下,您可以使用内置的委托Action而不是自定义委托。


推荐阅读