c# - 如何在Unity3d C#关卡中发送一次消息

标签 c# unity-game-engine

下面是我的脚本,放置在我的玩家子弹上,每次我的玩家开火时,玩家子弹都会生成,击中敌人或阻挡者后它会被摧毁,在这个脚本中我希望当它发送伤害消息时,它警告其他敌人,但在一个关卡中只警告一次(每次玩家子弹生成时,它不会每次都警告,只警告一次),这是我的代码。先进的感谢。

using System.Collections;
public class player_bullet_mover : MonoBehaviour 
{
[HideInInspector]
public Vector3 target;
public GameObject target_object;
public float damage_is;
private player_damage_controller player_damage_script;

// Use this for initialization
void Start () 
{
    player_damage_script = GameObject.FindObjectOfType (typeof(player_damage_controller)) as player_damage_controller;

    if(target == Vector3.zero)
    {
        Destroy(  this.gameObject );
    }
    transform.LookAt (target);
}

// Update is called once per frame
void Update () 
{
    this.transform.position = Vector3.MoveTowards ( this.transform.position , target, 300 * Time.deltaTime );
}

void OnTriggerEnter( Collider other )
{
    if(other.CompareTag("Enemy") )
    {
        other.SendMessage( "damage", 2 );
        Destroy( this.gameObject );
    }
    //call alarm_enemies function here but once in a level, not every time, it generate
}
public void alarm_enemies()
  {
    //send message to enemy script
  }
}

最佳答案

我注意到您正在使用 Unity 的 SendMessage 函数。不要用那个。您应该使用delegateevent 来完成此操作。

player_bullet_mover 脚本中创建一个事件:

bool sentOnce = false;
public delegate void damaged();
public static event damaged OnDamaged;

在您的 player_bullet_mover 脚本中,在发生碰撞时调用订阅事件的函数。

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Enemy"))
    {
        other.SendMessage("damage", 2);
        Destroy(this.gameObject);
    }

    //call alarm_enemies function here but once in a level, not every time, it generate

    //Send if we have not send this before
    if (!sentOnce)
    {
        sentOnce = true;
        //Alert every enemy
        OnDamaged();
    }
}

从您想要警报的敌人脚本中,订阅在 player_bullet_mover 脚本中创建的事件。在 OnEnable 函数中订阅它,并在 OnDisable 函数中取消订阅。

void OnEnable()
{
    player_bullet_mover.OnDamaged += damagedCallBack;
}


void OnDisable()
{
    player_bullet_mover.OnDamaged -= damagedCallBack;
}

void damagedCallBack()
{
    UnityEngine.Debug.Log("Damaged!");
}

您可以了解更多相关信息here .

关于c# - 如何在Unity3d C#关卡中发送一次消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377199/

相关文章:

c# - 使用来自 Unity C# 的参数运行 .exe 文件

c# - 如何通过套接字从 UWP 应用程序连接到 Unity 游戏服务器套接字?

c# - 如何从 Windows Phone 8.1(不是 Silverlight)联系人获取生日

c# - 有没有办法将Y旋转轴压缩为一个字节?

c# - 如何在 Windows 应用商店应用程序中获取正在执行的程序集版本信息?

c# - 无法让 ASP.NET MVC 6 Controller 返回 JSON

Android 应用程序仅在从 Google Play 下载后首次启动时崩溃

c# - Unity3D - 物体在y轴范围内连续上下移动

c# - 如何防止控件在模式窗体打开时捕获 KeyDown 事件?

c# - 导出到 Excel,并更改工作表名称