下面是我的脚本,放置在我的玩家子弹上,每次我的玩家开火时,玩家子弹都会生成,击中敌人或阻挡者后它会被摧毁,在这个脚本中我希望当它发送伤害消息时,它警告其他敌人,但在一个关卡中只警告一次(每次玩家子弹生成时,它不会每次都警告,只警告一次),这是我的代码。先进的感谢。
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
函数。不要用那个。您应该使用delegate
和event
来完成此操作。
在 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/