Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在级别Unity3d C中发送一次消息#_C#_Unity3d - Fatal编程技术网

C# 如何在级别Unity3d C中发送一次消息#

C# 如何在级别Unity3d C中发送一次消息#,c#,unity3d,C#,Unity3d,下面是我的脚本,它放在我的玩家子弹上,每次我的玩家开火,玩家子弹生成,在击中敌人或拦截器后,它会摧毁,在这个脚本中,我希望当它发送伤害信息之后,它会警告其他敌人,但在一个关卡中只有一次(每次玩家子弹生成,它不会每次报警,只有一次),这是我的代码。高级谢谢 using System.Collections; public class player_bullet_mover : MonoBehaviour { [HideInInspector] public Vector3 target; pub

下面是我的脚本,它放在我的玩家子弹上,每次我的玩家开火,玩家子弹生成,在击中敌人或拦截器后,它会摧毁,在这个脚本中,我希望当它发送伤害信息之后,它会警告其他敌人,但在一个关卡中只有一次(每次玩家子弹生成,它不会每次报警,只有一次),这是我的代码。高级谢谢

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的
发送消息
功能。请不要使用该功能。您应该使用
委托
事件
来执行此操作

player\u bullet\u mover
脚本中创建一个事件:

bool sentOnce = false;
public delegate void damaged();
public static event damaged OnDamaged;
player\u bullet\u 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();
    }
}
从您想要警报的敌方脚本中,订阅在
玩家子弹移动者
脚本中创建的事件。在
OnEnable
函数中订阅该事件,并在
OnDisable
函数中取消订阅

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


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

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

您可以了解更多信息。

我强烈建议您使用检测子弹击中敌人的时间,而不要在更新功能中这样做。实际上,我整个项目都是以这种方式设计的,所以现在不能更改,因为它会给我带来混乱。所以下次我会记住这一点,没有下次了。这是一个非常重要的问题d代码。如果它保证,你必须从头开始,因为不能保证
if
语句是正确的。好的,我将更改我的代码,然后更新我的问题。好的,我已经更改了代码,也更新了问题。