Dudas básicas Unity

LeeSinGafas

Hola, hace nada que he empezado con Unity y mi programación con C# está un poco oxidada, me han surgido 2 dudas muy tontas.

1: Tengo un Objeto con 2 scripts (A y B) Quiero acceder a una variable pública de A desde B para modificar su valor, pero no se como se hace

2: Tengo un objeto que quiero que atraviese un BoxCollider, he activado Ontrigger para ello pero el objeto hace como unos saltitos muy raros en los límites del BoxCollider. Si voy muy rápido con ese objeto lo atravieso y no se nota casi, pero si me quedo quieto por los límites hace cosas muy raras. Mas que nada busco que el BoxCollider no tenga ninguna física

Gracias de antemano!

B

1: Tienes dos soluciones. Poner una referencia pública al script de B en A y arrastrarla desde el editor, o bien usar GetComponent: http://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html

Un ejemplo de usar GetComponent sería:

MonoBehaviour behaviour;

void Start()
{
      behaviour = GameObject.Find("B").GetComponent<MonoBehaviour>();
}

void Update()
{
      behaviour.variable = valor;
}

Haciendo una referencia pública te ahorrarías el GameObject.Find del Start() y sería todo mucho más cómodo. Aunque yo lo que suelo hacer es hacer un script singleton que se llame Resources o algo similar, y ahí pongo todas las referencias a Prefabs, Objetos, o lo que sea que necesite acceder en runtime.

2: Usas PlayerController?

2 respuestas
marod

#1

Como dice #2 te valdría, pero es mejor si te puedes ahorrar el Find ya que tiene un coste bastante grande. Te pongo otro ejemplo

/*
* Codigo script A
*/
public class ScriptA : MonoBehaviour {

	public int variable;

}

/*
* Codigo script B
*/
public class ScriptB : MonoBehaviour {

	public ScriptA scriptA;

	// Use this for initialization
	void Start () {
	
scriptA.variable = 3;

	}

}

Luego, desde el Inspector te saldría esto:

Lo único que tendrías que hacer es referenciar el Script A del GameObject que quieras usar en el ScriptB.

Respecto a la pregunta 2, no entiendo muy bien que quieres hacer. Si no me equivoco BoxCollider de por sí no tiene ninguna física si no le pones un Rigidbody al objeto.

1 respuesta
LeeSinGafas

Muchas gracias a ambos, al final usé el método de #3 y funciona perfecto.

#2 ¿Player controller? Ni idea xD Pero al final se solucionó solo

DanielParra

#1

Sobre la primera, creo que tienes una solución mejor que poner una referencia publica. Si los scripts están en el mismo gameObject puedes hacer:

public class ScriptA : MonoBehaviour {

    public int variable;

    private int variable2;
    public int Variable2 {
        get { return variable2; }
        set { variable2 = value; }
    }

}

public class ScriptB : MonoBehaviour {

    private ScriptA scriptA;

    // Use this for initialization
    void Start () {
            scriptA = gameObject.GetComponent<ScriptA>();
            scriptA.variable = 1;
            scriptA.Variable2 = 2; //fijate que es Variable2 y no variable2

    }

}

Esto te evita tener que referenciar en los gameObjects, que si trabajas con más gente puede ser un dolor.
También te recomiendo acceder a la variable con una propiedad y mantener la encapsulación, como puedes ver con la variable2.

En el caso de optar por referenciarlo te recomiendo que la variable sea privada y utilices [SerializeField] para mantener la encapsulación.

1

Usuarios habituales