c# - tag - ontriggerenter
cómo se puede asignar un gameObject desde el código usando c# (1)
Estoy trabajando en un generador de monedas al azar. He incluido el código a continuación:
timer -= Time.deltaTime;
if (timer <= 0)
{
Vector3 position = new Vector3(Random.Range(11f, 14f), Random.Range(-0.7f, 4.5f), 0);
Instantiate(coins, position, transform.rotation);
timer = delayTimer;
}
y agrego una colisión para recoger la moneda y hacer un texto de puntaje:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Collisions : MonoBehaviour {
public Text scoreText;
private float score;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
scoreText.text = "Score : " + score;
}
private void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Player")
{
Destroy(gameObject);
scoreText.text = "Score : " + score;
score++;
}
}
}
así que ahora cuando necesito agregar el texto al prefabricado no puedo y si asigno el texto de alguna manera al prefabricado no cuenta ningún puntaje
Necesita un script o prefabricado para conocer un determinado objeto en la escena. ¿derecho?
Cada vez que se encuentre en esta situación, debe revisar su enfoque. Tenga en cuenta:
No puede asignar una referencia de un objeto de una escena a un prefabricado. Eso es básicamente imposible. las prefabricadas no deben saber sobre la escena.
Puede asignar una referencia de un objeto desde una escena a otro objeto de la misma escena.
Puede asignar una referencia de un objeto desde (o dentro de) un prefabricado a cualquier objeto (ya sea a otro prefabricado o mismo prefabricado o dentro de un prefabricado o a un objeto en la escena)
En otras palabras:
puede arrastrar y soltar cualquier cosa excepto desde la escena hasta la prefabricada
¿Alternativa?
Hay muchos.
¿Por qué no probar el patrón singleton? Es fácil de aprender y fácil de usar. Es impecable con objetos que solo tienen una instancia . Como un GameController o GuiController o un UserProfileController, etc.
Tener un GuiController singleton:
public class GuiController : MonoBehaviour
{
//singleton setup
static GuiController instance;
void Awake() { instance = this; }
//now it''s ready for static calls
public UnityEngine.UI.Text MyText;
//static method which you can call from anywhere
public static void SetMyText(string txt) { instance.MyText.text = txt; }
}
Tener un objeto en la escena (mejor sea el lienzo). adjuntar esta secuencia de comandos a ella. Establezca la referencia de My Text
en ella. En el script de colisiones solo llame a GuiController.SetMyText("Score : " + score)
Editar
De hecho, hay un pequeño error con su script de Colisión.
el score
campo que se define en Collisions
restablece a 0 en el nuevo objeto cada vez que se crea una instancia de un objeto de juego con este script. Esto sucede porque el score
no se define como un miembro estático de Collisions
y cualquier objeto nuevo naturalmente tiene sus propios miembros, es decir, un puntaje nuevo. De hecho, no debería ser en Collisions
, es mejor tener un script GameController manejando estos tipos de datos.
De nuevo con el patrón singleton:
public class GameController : MonoBehaviour
{
static GameController instance;
void Awake() { instance = this; }
float score;
public static float Score { get { return instance.score; } set { instance.score = value; } }
}
Adjunte el script a un objeto de juego y en lugar de score++
puede escribir GameController.Score++
;