Unidad: ¿Cómo hacer que el script funcione con objects duplicates?

Tengo un object en mi juego que, onclick, hace que el jugador se mueva hacia él. Lo hace al enviar su position a la function SetTarget del jugador. La function de movimiento del jugador se dirige hacia la position.

Esto está funcionando, pero cuando duplico el object y hago clic en él, el jugador aún se mueve hacia la position del object original . Cuando imprimo instrucciones de debugging en la console, parece que se están calculando ambas posiciones, pero la position original es la última y gana. (Estoy usando la position this.transform.position del object para enviar la position a la function SetTarget del jugador.)

¿No puedo duplicar objects como este y esperar que el script funcione? ¿Necesito usar un prefabricado? ¿Si es así, cómo? Sé cómo crear prefabricados, pero no estoy seguro de lo que tendría que cambiar con la secuencia de commands u otras configuraciones cuando se crean. Gracias.

Aquí está el código:

public class PotController : MonoBehaviour { private GameObject chefObject; void Start () { chefObject = GameObject.Find ("Chef"); } void Update() { if(Input.GetMouseButtonDown(0)){ //print ("pot clicked!"); ChefController chefScript = chefObject.GetComponent<ChefController> (); print (this.gameObject.transform.position); chefScript.SetTheTarget (this.gameObject.transform.position); } } } public class ChefController : MonoBehaviour { private Vector3 target; public float speed = 2; // Use this for initialization void Start () { target = this.transform.position; } private void MoveTowardsTarget() { Vector3 targetPosition = new Vector3(0,0,0); targetPosition = target; Vector3 currentPosition = this.transform.position; //check distance to target if(Vector3.Distance(currentPosition, targetPosition) > 0.4f) { Vector3 directionOfTravel = targetPosition - currentPosition; directionOfTravel.Normalize(); this.transform.Translate( (directionOfTravel.x * speed * Time.deltaTime), (directionOfTravel.y * speed * Time.deltaTime), (directionOfTravel.z * speed * Time.deltaTime), Space.World); } } void Update () { MoveTowardsTarget (); } public void SetTheTarget (Vector3 position){ target = position; } } 

EDITAR

De acuerdo, entonces el problema es que necesitas identificar en qué pozo se hizo clic. Con su código actual, cada vez que se hace clic en el mouse, se apaga el código en cada PotController.

Lo que debe hacer es agregar un colisionador a su Pot, lo que le permitiría realizar una testing de colisión en el mouse para ver en qué Pot se hizo clic.

Entonces, en lugar de su código de actualización (), tendría:

 void Update() { if (Input.GetMouseButtonDown(0)) { RaycastHit2D[] hits; Vector2 pos = Input.mousePosition; pos = Camera.main.ScreenToWorldPoint (pos); hits = Physics2D.RaycastAll (pos, new Vector2 (0, 0), 0.01f); for (int i = 0; i < hits.Length; i++) { if (hits [i].collider.gameObject == this.gameObject) { ChefController chefScript = chefObject.GetComponent<ChefController> (); print (this.gameObject.transform.position); chefScript.SetTheTarget (this.gameObject.transform.position); break; } } } } 

Pero francamente, el Raycasting probablemente debería hacerse desde la class Player, y luego llamarías a Pot.SetTarget () desde allí. Esto no es muy eficiente, pero debería mostrarte cómo hacer esto.