Jak wykonac funkcje dla kazdego klona?

Programowanie w Unity.

Jak wykonac funkcje dla kazdego klona?

Postprzez DoktorGold » 11 Lip 2019, 22:04

Funkcja wykonuje sie tylko dla jednego klona

Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BigEnemy : MonoBehaviour
{

    public Rigidbody rb;

    public IEnumerator BigEnemyDebuff()

    {

        yield return new WaitForSeconds(10);
      //  GameObject.Find("Sphere").transform.localScale -= new Vector3(1F, 1F, 1F);
        GameObject.Find("Sphere(Clone)").transform.localScale -= new Vector3(1F, 1F, 1F);
    }



    IEnumerator OnTriggerEnter(Collider other)

    {


        if (other.gameObject.name == "BigEnemyBuff")
        {

          //  GameObject.Find("Sphere").transform.localScale += new Vector3(1F, 1F, 1F);
            GameObject.Find("Sphere(Clone)").transform.localScale += new Vector3(1F, 1F, 1F);

            yield return StartCoroutine(BigEnemyDebuff());
        }
        if (other.gameObject.name == "BigEnemyBuff(Clone)")
        {

          //  GameObject.Find("Sphere").transform.localScale += new Vector3(1F, 1F, 1F);
            GameObject.Find("Sphere(Clone)").transform.localScale += new Vector3(1F, 1F, 1F);
            yield return StartCoroutine(BigEnemyDebuff());
        }





    }
}


co zrobic zeby wykonywala sie dla wszystkich o tagu "Enemy"?Probuje ale ciagle nie dziala stanalem na tym:

Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BigEnemy : MonoBehaviour
{
    private Transform _transform;
    public Rigidbody rb;
    public GameObject[] enemys;
    public IEnumerator BigEnemyDebuff()

    {
        if (enemys == null)
            enemys = GameObject.FindGameObjectsWithTag("Enemy");

        foreach (GameObject Enemy in enemys)
        {
            yield return new WaitForSeconds(10);
            rb = GetComponent<Rigidbody>();
            // Set the maximum angular velocity.

            _transform = transform;
            _transform.localScale = new Vector3(1F, 1F, 1F);

        }

    }



    IEnumerator OnTriggerEnter(Collider other)

    {


        if (other.gameObject.name == "BigEnemyBuff")
        {

         
                enemys = GameObject.FindGameObjectsWithTag("Enemy");

            foreach (GameObject Enemy in enemys)
            {

                rb = GetComponent<Rigidbody>();
                // Set the maximum angular velocity.
               
                _transform = transform;
                _transform.localScale = new Vector3(5F, 5F, 5F);
                yield return StartCoroutine(BigEnemyDebuff());
            }
        }
        if (other.gameObject.name == "BigEnemyBuff(Clone)")
        {

            if (enemys == null)
                enemys = GameObject.FindGameObjectsWithTag("Enemy");

            foreach (GameObject Enemy in enemys)
            {
                rb = GetComponent<Rigidbody>();
                // Set the maximum angular velocity.

                _transform = transform;
                _transform.localScale = new Vector3(5F, 5F, 5F);
                yield return StartCoroutine(BigEnemyDebuff());
            }
        }





    }
}



Prosze o pomoc.
Ostatnio edytowany przez DoktorGold, 12 Lip 2019, 17:11, edytowano w sumie 1 raz
DoktorGold
 
Posty: 7
Rejestracja: 01 Lip 2019, 03:08
Has thanked: 0 time
Been thanked: 0 time

Re: Jak wykonac funkcje dla kazdego klona?

Postprzez Hostur » 12 Lip 2019, 06:03

A gdzie tutaj ruszasz przeciwników?

Kod: Zaznacz wszystko
 foreach (GameObject Enemy in enemys)
        {
            yield return new WaitForSeconds(10);
            rb = GetComponent<Rigidbody>();
            // Set the maximum angular velocity.

            _transform = transform;
            _transform.localScale = new Vector3(1F, 1F, 1F);

        }


iterując po przeciwnikach najpierw pobierasz swoje własne rigidbody
Następnie cachujesz swój własny transform i zmieniasz mu localscale

Kod: Zaznacz wszystko
 foreach (GameObject e in enemys)
 {
   yield return new WaitForSeconds(10);
   e.GetComponent<Transform>().localScale = new Vector3(1,1,1);
 }


oczywiście widzę że próbujesz robić coś podobnego na triggerach więc przeciwników tych powinieneś cachować

Kod: Zaznacz wszystko
private const string ENEMY = "Enemy";
private Transform[] _enemyTransforms;
private void Start()
{
  var enemies = GameObject.FindGameObjectsWithTag(ENEMY );
  _enemyTransforms = new Transform[enemies.Count];
  for(int i = 0; i < enemies.Count; i++)
    _enemyTransforms[i] = enemies[i].GetComponent<Transform>();
}

private void SetEnemiesLocalScale(Vector3 scale)
{
  for(int i = 0; i < _enemyTransforms.Length; i++)
    _enemyTransforms[i].localScale = scale;
}


Ale tak na przyszłość, postaw po prostu w kodzie breakpointa i zdebuguj taką funkcję albo po prostu na głos opisz sobie linijka po linijce co się dzieje, nie co chciałeś żeby się zadziało tylko co rzeczywiście widzisz w kodzie bo dla każdego innego programisty na pierwszy rzut oka te funkcje nie mają sensu
Hostur
 
Posty: 726
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: Jak wykonac funkcje dla kazdego klona?

Postprzez DoktorGold » 12 Lip 2019, 18:06

Wielkie dzieki pomoglo,wrzucam kod ktory dziala moze komus sie kiedys przyda
Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BigEnemy : MonoBehaviour
{

    public GameObject[] enemys;
    public IEnumerator BigEnemyDebuff()

    {

        yield return new WaitForSeconds(2);
        enemys = GameObject.FindGameObjectsWithTag("Enemy");
        foreach (GameObject e in enemys)
        {

            e.GetComponent<Transform>().localScale = new Vector3(1, 1, 1);
        }
    }



    IEnumerator OnTriggerEnter(Collider other)

    {
   

        if (other.gameObject.name == "BigEnemyBuff")
        {
            enemys = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject e in enemys)
            {
               
                e.GetComponent<Transform>().localScale = new Vector3(4, 4, 4);
            }

            yield return StartCoroutine(BigEnemyDebuff());
        }
        if (other.gameObject.name == "BigEnemyBuff(Clone)")
        {
            enemys = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject e in enemys)
            {

                e.GetComponent<Transform>().localScale = new Vector3(4, 4, 4);
            }

            yield return StartCoroutine(BigEnemyDebuff());
        }





    }
}
DoktorGold
 
Posty: 7
Rejestracja: 01 Lip 2019, 03:08
Has thanked: 0 time
Been thanked: 0 time

Re: Jak wykonac funkcje dla kazdego klona?

Postprzez DoktorGold » 12 Lip 2019, 19:49

Hmm..Jak zmienic wartosc zmiennej w srypcie u kazdego o tagu Enemy?Robie tak ale nie dziala

Kod: Zaznacz wszystko
            foreach (GameObject e in enemys)
            {

                e.GetComponent<ProsteAI>().predkoscRuchu = 1;
            }
DoktorGold
 
Posty: 7
Rejestracja: 01 Lip 2019, 03:08
Has thanked: 0 time
Been thanked: 0 time

Re: Jak wykonac funkcje dla kazdego klona?

Postprzez Hostur » 12 Lip 2019, 19:52

przedebuguj powinno działać jeśli predkoscRuchu to publiczna zmienna to nie ma powodu żeby ten kod nie zadziałał, postaw breakpointa i sprawdź co to za "e", czy ma prosteai i jaka jest predkosc ruchu przed i po zmianie, naucz się używać debugera
Hostur
 
Posty: 726
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: Jak wykonac funkcje dla kazdego klona?

Postprzez DoktorGold » 12 Lip 2019, 20:23

Juz dziala;)Ok dopiero teraz dowiedzialem sie o breakpointach xP
Wielkie dzieki!
DoktorGold
 
Posty: 7
Rejestracja: 01 Lip 2019, 03:08
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Majestic-12 [Bot] oraz 2 gości