2017-04-12 13 views
2

以下は自分のスクリプトです。これは自分のプレイヤーの弾に置かれ、自分のプレイヤーが発射し、弾丸が生成され、破壊する敵やブロッカーに命中した後、それ以降のダメージのメッセージを送信すると、他の敵を警告しますが、レベルでは1回だけです(プレイヤーの弾丸が生成されるたびに、毎回アラームは発生しません)。高度なありがとう。レベルで一度だけメッセージを送信する方法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スクリプトでイベントを作成します:あなたの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(); 
    } 
} 

OnEnableの機能で登録し、OnDisable機能で登録を解除します。

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


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

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

この詳細については、hereをご覧ください。

+1

はい。それは私を助けます..おかげで.. ..-) –

関連する問題