2017-04-12 42 views
2

下面是我的脚本,它放置在我的播放器项目符号上,每次我的播放器火,玩家子弹生成后击中敌人或阻止它破坏,在这个脚本我想当它发送信息后,它会对其他敌人发出警报,但只能在一个关卡中发生一次(每当玩家发出子弹时,它不会每次都发出警报,只是一次),这是我的代码。先进的谢谢。如何发送消息一级Unity3d C#

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 
    } 
} 
+0

我强烈建议你使用[Collisions](https://unity3d.com/learn/tutorials/topics/physics/detecting-collisions-oncollisionenter)来检测你的子弹何时击中敌人,而不是像那样做在更新功能中。 – CNuts

+0

其实我整个项目都是这样设计的,所以现在不能改变,因为它对我来说会变得混乱。所以下次我会记住这一点 –

+1

没有下一次。这是一个非常糟糕的**代码。如果它保证它,你必须从头开始,因为不能保证if语句将成立。 – Programmer

回答

2

我注意到你正在使用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

+1

是的。它帮助我..谢谢队友.. :-) –