【问题标题】:How to use events in Unity?如何在 Unity 中使用事件?
【发布时间】: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);?

标签: c# unity3d


【解决方案1】:

通过添加 Borders = new BordersCommands(this); 解决在第一个脚本开始

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多