Вопрос:

как отправить сообщение один раз на уровне Unity3d C #

c# unity3d

195 просмотра

1 ответ

159 Репутация автора

Ниже приведен мой сценарий, который помещается в пулю моего игрока, каждый раз, когда мой игрок стреляет, генерирует пулю игрока и после удара по врагу или блокирующим объектам, которые он уничтожает, в этом сценарии я хочу, чтобы после отправки сообщения об ущербе он тревожил других врагов , но только один раз на уровне (каждый раз, когда игрок генерирует пулю, он не будет тревожиться каждый раз, только один раз), вот мой код. Расширенное спасибо.

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
  }
}
Автор: Newbies Studio Источник Размещён: 12.04.2017 06:38

Ответы (1)


2 плюса

83610 Репутация автора

Решение

Я заметил, что вы используете SendMessageфункцию Unity . Не используйте это. Вы должны сделать это с 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!");
}

Вы можете узнать больше об этом здесь .

Автор: Programmer Размещён: 12.04.2017 08:07
Вопросы из категории :
32x32