• Как лучше всего реализовать запуск звука в 2D игрушке?

    @alkska
    Unity developer
    Если проект будет расти у тебя будет куча звуков висеть на этом синглтоне, поэтому можно так сделать :
    1. Пусть синглтон принимает сам звук, например так :
    public AudioClip buttonSound;
    public void DoSomething(){
         Audio.instance.PlaySoundClick(buttonSound);
    }

    2. Создать отдельный скрипт для воспроизведения звука, чтобы вешать на объекты которые могут издавать звук - дальше как умеешь или подписываешься на эвенты объекта, или пишешь интерфейс.
    Ответ написан
    Комментировать
  • Что я не так делаю с интерфейсами?

    @alkska
    Unity developer
    Котик конечно крутой, СОЛИДно объяснил тебе за все, но ты никогда так не достанешь интерфейс с объекта...
    Тебе не понравилось, что интерфейс не показывется в инспекторе - так объяви gameObject
    и потом в awake доставай свой интерфейс вот так :
    gameObg = GetComponent(typeof(IHealth)) as IHealth;
    а еще не нужно доставать компоненты в рантайме - пиши отдельные скрипты детекторы

    using System;
    using UnityEngine;
    
    [RequireComponent(typeof(BoxCollider))]
    public class PlayerDetector : MonoBehaviour
    {
        internal event Action OnPlayerEnter, OnPlayerExit, OnPlayerStay;
    
        protected virtual void OnTriggerEnter(Collider other)
        {
           if (OnPlayerEnter != null)
            if (IsPlayer(other.gameObject))
            {
                OnPlayerEnter.Invoke();
            }
        }
        protected virtual void OnTriggerExit(Collider other)
        {
           if (OnPlayerExit != null)
            if (IsPlayer(other.gameObject))
            {
                OnPlayerExit.Invoke();
            }
        }
        protected virtual void OnTriggerStay(Collider other)
        {
           if (OnPlayerStay!=null)
            if (IsPlayer(other.gameObject))
            {
                OnPlayerStay.Invoke();
            }
        }
    
    
        public static bool IsPlayer(GameObject ob)
        {
            if (ob.CompareTag("Player"))
                return true;
    
            return false;
        }
    }

    Метишь тегом своим рыцаря и кидаешь скрипт на объект который может наносить урон, подписываешься на OnPlayerEnter в скрипте который наносит Damage и не паришься -все безопасно
    Ответ написан
    Комментировать