Jump to content
Sign in to follow this  
jecfmaatrix

Propagación con Script

Recommended Posts

Muy buenas tardes  a todos, primero que nada, soy muy novato en Unity, pero con muchas ganas de aprender, ahora estoy tratando de hacer un videojuego acerca de una pandemia(Covid-19) y me he quedado bloqueado varios días en una parte la cual es: 

Una persona infectada camina por una ruta, y al colisionar con otras personas dentro de un radio establecido pueda contagiarlas y estas personas contagiadas a su vez puedan transmitir la enfermedad igualmente(Activo un Sistemas de partículas cuando una persona se halla contagiado) y así mismo si existe una colisión con personas no contagiadas que no pase nada.

He intentado poner en cada persona un SpheraCollider con un radio de 2 y esta a su vez que se active con un TriggerEnter cuando colisiona con otra persona, pero no se me ocurre como transmitir el contagio. Probé en hacer una Lista de tipo Persona con una variable boolean infected con su constructor.

 

Mil disculpas por las molestias, ¿Alguien me puede dar alguna idea de que hacer?  Muchas gracias.

Share this post


Link to post
Share on other sites

Creas una lista de todas las personas, esta puede ser estática y estar dentro del componente "ActorBehaviour" luego con una función de contacto basándonos en la distancia calcularía el nivel de contagio actual.

Pseudo código

public class ActorBehaviour : MonoBehaviour {

    public int InfectionAmount => m_infectionAmount;
    public bool IsInfected => m_infectionAmount > 95;

    [SerializeField] private LayerMask m_layerMask = 0;
    [SerializeField] private int m_radiusInfection = 3;
    [SerializeField] private bool m_usePhysicsMode = true;
    [SerializeField, Range (0, 100)] private int m_infectionAmount = 0;

    private void Start () {
        m_actors.Add (this);
    }

    private void OnDestroy () {
        m_actors.Remove (this);
    }

    private void Update () {
        foreach (ActorBehaviour actor in GetNearestActors ())
            actor.Contact (this, Vector3.Distance (transform.position, actor.position));
    }

    private void Contact (ActorBehaviour from, float distance) {
        m_infectionAmount += Mathf.RountToInt (from.InfectionAmount * (distance / m_radiusInfection));
        m_infectionAmount = Mathf.Clamp (m_infectionAmount, 0, 100);
    }

    private IEnumerable<ActorBehaviour> GetNearestActors () {
        if (m_usePhysicsMode) {
            RaycastHit[] hits = Physics.SphereCastAll (new Ray (transform.position, Vector3.Up), m_radiusInfection, Mathf.Infinity, m_layerMask);
            foreach (RaycastHit hit in hits) {
                ActorBehaviour actor = hit.GetComponent<ActorBehaviour> ();
                if (actor is object)
                    yield return actor;
            }
        } else {
            foreach (ActorBehaviour actor in GetActors ()) {
                if (Vector3.Distance (transform.position, actor.position) < m_radiusInfection)
                    yield return actor;
            }
        }
    }

    #region Static Region
    private static List<ActorBehaviour> m_actors { get; set; } = new List<ActorBehaviour> ();

    public static IEnumerable<ActorBehaviour> GetActors () {
        for (int i = 0; i < m_actors.Count; i++)
            if (m_actors[i] is object)
                yield return m_actors[i];
    }

    #endregion
}

Podes elegir si hacerlo mediante colisiones o recorriendo la lista comparando distancias, ambos métodos son un poco lentos, pero son los más fáciles de implementar. Lo mejor en este caso seria implementar QuadTree o similar.

Saludos.

Share this post


Link to post
Share on other sites

Muchas gracias por la ayuda, demoré en entender el código, aun me falta mucho por aprender.

Este tipo de programación tiene un nombre en concreto? 

  • Like 1

Share this post


Link to post
Share on other sites
12 hours ago, jecfmaatrix said:

Muchas gracias por la ayuda, demoré en entender el código, aun me falta mucho por aprender.

Este tipo de programación tiene un nombre en concreto? 

De nada, no, no tiene un nombre. 

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...