• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Unity - jak uzyskać dostęp do skryptu w obiekcie, który jest klonem?

0 głosów
146 wizyt
pytanie zadane 21 lipca 2019 w C# przez polan31 Nowicjusz (150 p.)
zamknięte 22 lipca 2019 przez polan31

UNITY 2D C#

Staram się wyzerować, na kilka sekund, prędkość rotacji w moich obiektach klonach, za każdym razem kiedy wcisnę przycisk, który dodałem do ekranu głównego mojej sceny w Unity. Uważam, że najlepszym rozwiązanie byłoby, aby wyszukać każdy obiekt z określonym tagiem (wszystkie klony mają ten sam tag). Problem polega na tym, że nie działa to w przypadku klonów...

Każdy klon ma dodany skrypt rotacji:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotation : MonoBehaviour {

	public float speed;
	public float speed2 = 0f;
	private Rigidbody2D rb2D;



	// Use this for initialization
	void Start () {
		
	}

	// Update is called once per frame
	public void Update () {

		transform.Rotate (0, 0, speed);
	}

	public void Stop (){

		StartCoroutine(SpeedZero());
		Debug.Log ("ZEROOOOO");
	}

	IEnumerator SpeedZero()
	{
		transform.Rotate (0, 0, speed2);
		yield return new WaitForSeconds(20);
		transform.Rotate (0, 0, speed);
	
	}
}

 

Obiekty spawnuję za pomocą skryptu SunSpawner:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SunSpawner : MonoBehaviour {

	public GameObject[] theSuns;
	public Transform generationPoint;

	private int sunSelector;
    private float sceneHeight;

    float distance = 0.5f;


	Vector3 maxWidthPoint;
    Vector3 minWidthPoint;

    //Radious base on circle collider radious
    float lastSunRadious = 2f;


	void Start (){
        minWidthPoint = Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height / 2f));
        maxWidthPoint = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height / 2f));

        float bottom = Camera.main.ScreenToWorldPoint(new Vector2(0, 0)).y;
        float top = Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height)).y;
        sceneHeight = top - bottom;

        Debug.LogFormat("Scene height: {0}, minWidthPoint: {1}, maxWidthPoint {2}", sceneHeight, minWidthPoint, maxWidthPoint);

    }

		
	public void Update (){

		if (transform.position.y < generationPoint.position.y) {

            sunSelector = Random.Range(0, theSuns.Length);
            float currentSunRadious = theSuns[sunSelector].GetComponentInChildren<CircleCollider2D>().radius * theSuns[sunSelector].GetComponentInChildren<CircleCollider2D>().transform.localScale.x * theSuns[sunSelector].transform.localScale.x;
            float distanceBetween = distance + lastSunRadious + currentSunRadious; //Random.Range(lastSunRadious+currentSunRadious, sceneHeight);
            float sunXPos = Random.Range(minWidthPoint.x + currentSunRadious, maxWidthPoint.x - currentSunRadious);

            Vector3 newSunPosition = new Vector3(sunXPos, transform.position.y + distanceBetween, transform.position.z);

            transform.position = newSunPosition;
            lastSunRadious = currentSunRadious;
			Instantiate (theSuns [sunSelector], transform.position, transform.rotation);

		}
	}
		
}


Teraz dodałem Canvas i przycisk, w którym chciałem za pomocą funkcji OnClick zatrzymać rotację w każdym obiekcie (klonie), który istnieje a ma określony tag (w moim przypadku jest to "Log"). Jak już napisałem, nie potrafię tego jednak zrobić. Próbowałem kilku rzeczy, stworzyć listę, wyszukać tagu, odwołać się do skryptu Rotation i uruchomić Coroutine, ale nic nie chce działać. Aktualnie nie posiadam żadnego skryptu dodanego do przycisku stop, bo kompletnie już nie wiem, co tu zrobić

Jest ktoś w stanie mi pomóc?
Będę wdzięczny 

Pozdrawiam

komentarz zamknięcia: Poprawna odpowiedź

1 odpowiedź

+1 głos
odpowiedź 21 lipca 2019 przez MsMaciek123 Pasjonat (24,400 p.)
wybrane 22 lipca 2019 przez polan31
 
Najlepsza

Pierwsze musimy uzyskać dostęp do przechwilą stworzonego obiektu. W tym celu zapiszemy go w tablicy o pojemności np. 100

GameObject clone = Instantiate(/*bla bla bla*/) as GameObject;
#zapisz clone do tablicy
for(int I=0; I<tablica[].size; i++;) //nie jestem pewny tablica[].size
{
    if(tablica[i]==null)
    {
        tablica[i] = clone;
        #wyjdź z pętli
    }
}

Teraz nasza funkcja stop musi znaleźć się w SunSpawner i przejechać po wszystkich obiektach i tam wywołać funkcję stop. (Funkcja stop w skrypcie z rotacją zostaje)

void StopAll()
{
    foreach(GameObject this ..../*o tym jak używać tej pętli nauczysz się sam :)*/)
    {
        if(this!=null)
            this.GetComponent<Rotation>().Stop(); //uruchamiamy funkcje stop w aktualnym klonie
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 1 sierpnia 2017 w OpenGL, Unity przez Stami Gaduła (3,780 p.)
0 głosów
0 odpowiedzi 78 wizyt
pytanie zadane 14 marca 2019 w C# przez niezalogowany

86,460 zapytań

135,216 odpowiedzi

300,377 komentarzy

57,209 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...