• 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?

Object Storage Arubacloud
0 głosów
481 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,760 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ź 232 wizyt
pytanie zadane 1 sierpnia 2017 w OpenGL, Unity przez Stami Gaduła (3,790 p.)
0 głosów
0 odpowiedzi 264 wizyt
pytanie zadane 14 marca 2019 w C# przez niezalogowany

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...