【发布时间】:2023-02-16 20:48:30
【问题描述】:
我看过很多关于统一事件的视频,但仍然不知道如何使用它们。
我有 2 个脚本,第一个我检测到碰撞,第二个脚本应该传送一个附加了第一个脚本的对象。
第一个脚本
using UnityEngine;
public class PlayerShip : MonoBehaviour
{
private Rigidbody2D rb;
private float angle;
public delegate void TeleportHandler(GameObject Border);
public event TeleportHandler OnShipCollidedEvent;
[SerializeField] private float speedMoving;
[SerializeField] private float speedRotating;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetAxis("Horizontal") != 0)
{
angle = -Input.GetAxis("Horizontal") * Time.deltaTime * speedRotating;
transform.Rotate(transform.rotation.x, transform.rotation.y, angle);
}
if (Input.GetKey(KeyCode.W))
rb.AddRelativeForce(Vector2.up * speedMoving);
}
private void OnTriggerEnter2D(Collider2D other)
{
this.OnShipCollidedEvent?.Invoke(other.gameObject);
}
}
第二个脚本 - OnShipCollided 不输出测试
using UnityEngine;
public class BordersCommands : MonoBehaviour
{
private PlayerShip _playerShip;
[SerializeField] private GameObject LeftBorder;
[SerializeField] private GameObject RightBorder;
[SerializeField] private GameObject BotBorder;
[SerializeField] private GameObject TopBorder;
public BordersCommands(PlayerShip _playerShip)
{
this._playerShip = _playerShip;
this._playerShip.OnShipCollidedEvent += OnShipCollided;
}
private void OnShipCollided(GameObject border)
{
Debug.Log("Test");//Here will be teleportation
}
}
【问题讨论】:
-
A) 为什么你的
MonoBehaviour有一个构造函数?它不应该。使用new来创建MonoBehaviour是不允许的并且没有任何意义.. 否则这个类不应该是一个 MonoBehaviour 而只是一个普通的类。 B)doesn't work到底是什么意思?由于您的构造函数很可能永远不会被调用(请参阅 A),当然您也永远不会将侦听器附加到事件...... -
我删除了 MonoBehaviour,如何添加监听器?我尝试了 AddListener 但它没有用。
-
好吧,你在
this._playerShip.OnShipCollidedEvent += ...中添加了一个监听器......但是你究竟是如何创建BordersCommand的实例的? -
是的,我没有创建它,所以我应该在此之前创建 BordersCommand 实例。OnShipCollidedEvent?.Invoke(other.gameObject);?