2017-04-12 44 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

是的。它幫助我..謝謝隊友.. :-) –