Суббота, 24 Февраля 2018, 17:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Страница 1 из 11
Модератор форума: beril 
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Присваивание рандомного цвета объекту
Присваивание рандомного цвета объекту
woody111Дата: Пятница, 05 Января 2018, 10:46 | Сообщение # 1
был не раз
Сейчас нет на сайте
Делаю бесконечный платформер. Сейчас не могу разобраться с тем что мне необходимо присваивать цвет платформе , выбранный рандомно. Платформы вообще не получают цвета. Помогите разобраться с проблемой

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformGenerator : MonoBehaviour {

    public GameObject thePlatform;
    public Transform generationPoint;
    public float distanceBettween;
    public Color[] colors = new Color[2];
    Random ranCol = new Random();

    

    private float platformWidth;
    

    // Use this for initialization
    void Start () {
        platformWidth = thePlatform.GetComponent<BoxCollider2D>().size.x;

        colors[0] = GetComponent<Renderer>().material.color = Color.red;
        colors[1] = GetComponent<Renderer>().material.color = Color.green;

    }
    
    // Update is called once per frame
    void Update () {
        if(transform.position.x < generationPoint.position.x)
        {
            transform.position = new Vector3(transform.position.x + platformWidth + distanceBettween, transform.position.y, transform.position.z);

            Instantiate(thePlatform, transform.position, transform.rotation);

            for (int i = 0; i < colors.Length; i++)
            {
                GetComponent<Renderer>().material.color = colors[Random.Range(0, colors.Length)];
            }

            

            
        }
  
    }

   
}
vados4266Дата: Пятница, 05 Января 2018, 11:09 | Сообщение # 2
частый гость
Сейчас нет на сайте
Ты присваеваешь цвет объекту на котором висит скрипт, а нужно созданой платформе.

Код

var plaform =  Instantiate(thePlatform, transform.position, transform.rotation);

for (int i = 0; i < colors.Length; i++)
{
    plaform.GetComponent<Renderer>().material.color = colors[Random.Range(0, colors.Length)];
}
woody111Дата: Пятница, 05 Января 2018, 11:31 | Сообщение # 3
был не раз
Сейчас нет на сайте
Я ту часть кода вставил не в тот скрипт . Но все равно никакого результата....
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformDestroyer : MonoBehaviour {

    public GameObject platformDestructionPoint;
    public Color[] colors = new Color[2];
    //Random ran = new Random;

    // Use this for initialization
    void Start () {
        colors[0] = Color.red;
        colors[1] = Color.green;
        platformDestructionPoint = GameObject.Find("PlatformDestructionPoint");

        
    }
    
    // Update is called once per frame
    void Update () {
        for (int i = 0; i < colors.Length; i++)
        {
            gameObject.GetComponent<Renderer>().material.color = colors[Random.Range(0, colors.Length)];
        }

        if (transform.position.x < platformDestructionPoint.transform.position.x)
        {
            Destroy(gameObject);
        }
    }
}


Вот изображение того что происходит при запуске.
http://prntscr.com/hwbldi


Сообщение отредактировал woody111 - Пятница, 05 Января 2018, 11:32
vados4266Дата: Пятница, 05 Января 2018, 12:24 | Сообщение # 4
частый гость
Сейчас нет на сайте
MonoBehaviour.Update()
Description
Update is called every frame, if the MonoBehaviour is enabled.

Ты меняешь цвет на рандомный каждый проход два раза, хрень.
Если хочешь один раз сменить юзай старт.

Вот держи, скопируешь что нужно.

Код

using System.Collections;
using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    [SerializeField]
    float timeDelay = .5f;

    [SerializeField]
    bool loop = false;

    [SerializeField]
    Color[] colors;

    private Renderer _renderer;

    void Start()
    {
        _renderer = gameObject.GetComponent<Renderer>();
        StartCoroutine(ChangeColor(timeDelay));        
    }

    IEnumerator ChangeColor(float delay)
    {
        _renderer.material.color = colors[Random.Range(0, colors.Length)];

        yield return new WaitForSeconds(delay);

        if(loop)
            StartCoroutine(ChangeColor(delay));
    }
}

woody111Дата: Пятница, 05 Января 2018, 18:18 | Сообщение # 5
был не раз
Сейчас нет на сайте
Точно , надо создавать в Start. Объект создается и никаких изменений ему больше не требуется. А то что у тебя в коде сериализация и корутин- это ты из своего кода вырезал?
BassPiraT92Дата: Пятница, 05 Января 2018, 19:26 | Сообщение # 6
частый гость
Сейчас нет на сайте
Помогите со скриптом!? Вот скрипт в котором я управляю анимацией, перемещением, прыжками. Дак вот, привязан прыжок к пересечению коллайдеров(если не соприкасается герой с коллайдером то прыгнуть 2й раз он не может), как сделать так что бы "землей" считался коллайдер с тегом Ground?

Код

public class Character : MonoBehaviour {

    [SerializeField]
    public int lives = 1;
  [SerializeField]
    public float speed = 3.0f;
    [SerializeField]
    public float jumpForce = 2.5f;
    [SerializeField]
    public bool isGrounded=false;
    public bool fastRun = false;

    private CharState State
    {
        get { return (CharState)animator.GetInteger("State"); }
        set { animator.SetInteger("state", (int)value); }
    }
    new private Rigidbody2D rigidbody;
    private Animator animator;
    private SpriteRenderer sprite;

    private void Start()
    {

    }
    private void Awake()
    {
  rigidbody = GetComponent<Rigidbody2D> ();
  animator = GetComponent<Animator> ();
  sprite = GetComponentInChildren<SpriteRenderer> ();

    }

    private void FixedUpdate()
    {
  CheckGround();
    }

    private void Update()
    {
        if (fastRun == true) speed = 7;
      //  if (Input.GetKeyDown(KeyCode.Escape)) SceneManager.LoadScene("menu");
        if (isGrounded) State = CharState.idle;
        if (Input.GetButton("Horizontal")) Run();
        if (isGrounded && Input.GetButton("Jump")) Jump();
        // if (Input.GetButtonDown("LShift")) fastRun = !true;
              
    }

    private void Run()
    {
       

        Vector3 direction = transform.right * Input.GetAxis("Horizontal");
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
        sprite.flipX = direction.x < 0.0f;
       if(isGrounded) State = CharState.run;
    }

    private void Jump()
    {

        rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
        if(isGrounded) State = CharState.jump;

    }
    private void CheckGround()
    {
  Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 0.3f);

     isGrounded = colliders.Length > 1;
        
    }
    public enum CharState
    {
        idle,
        run,
        jump
    }
}

vados4266Дата: Пятница, 05 Января 2018, 22:41 | Сообщение # 7
частый гость
Сейчас нет на сайте
Цитата vados4266 ()
А то что у тебя в коде сериализация и корутин- это ты из своего кода вырезал?

Ну типа набросал по быстрому.
woody111Дата: Суббота, 06 Января 2018, 16:54 | Сообщение # 8
был не раз
Сейчас нет на сайте
Решил все переделать . думаю у меня возникли проблемы с массивом цветов. Поэтому решил создать int Array и в зависимости от того какое будет значение присвоить соответствующий цвет. Рандомное значение из массива к платформам добавляется но цвет не присваивается. Помогите решить проблему. На функцию ChooseCol не обращайте внимание. Ну и я решил поэкспериментировать с местом куда ставлю код по присвоению цвета в Start или Update - нет никакой разницы значение на объекте не определяется.

вот скрин с результатом Unity
http://prntscr.com/hwtvtn

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformDestroyer : MonoBehaviour {

    public GameObject platformDestructionPoint;
    public GameObject platformRandom;
    private int t;
    int[] numCol = new int[3];

    // public Color[] colors = new Color[2];
    // public int[] numCol = new int[3] { 1, 2, 3 };

    // Use this for initialization
    void Start()
    {

        platformDestructionPoint = GameObject.Find("PlatformDestructionPoint");

        // colors[0] = Color.red;
        // colors[1] = Color.green;

        //for (int i = 0; i < colors.Length; i++)
        //  {
        //    gameObject.GetComponent<Renderer>().material.color = colors[Random.Range(0, colors.Length)];
        //  }

       platformRandom = GameObject.Find("Platform 7_1 (1) (Clone)");
            
        int[] numCol = new int[3] { 1, 2, 3 };

        for (int i = 0; i < numCol.Length; i++)
        {
            t = numCol[Random.Range(0, numCol.Length)];
        }

       

    }

       private void ChooseCol()
    {
       
        int[] numCol = new int[3] { 1, 2, 3 };

        for (int i = 0; i < numCol.Length; i++)
        {
            t = numCol[Random.Range(0, numCol.Length)];
        }

        if(t==1)
        {
            gameObject.GetComponent<Renderer>().material.color = Color.black;
        }

        if(t==2)
        {
            gameObject.GetComponent<Renderer>().material.color = Color.green;
        }

        if(t==3)
        {
            gameObject.GetComponent<Renderer>().material.color = Color.red;
        }
    }

    
    
    // Update is called once per frame
    void Update ()
    {
        if (t == 1)
        {
            platformRandom.GetComponent<Renderer>().material.color = Color.black;
        }

        if (t == 2)
        {
            platformRandom.GetComponent<Renderer>().material.color = Color.green;
        }

        if (t == 3)
        {
            platformRandom.GetComponent<Renderer>().material.color = Color.red;
        }

        if (transform.position.x < platformDestructionPoint.transform.position.x)
        {
            Destroy(gameObject);
        }
    }
}


Сообщение отредактировал woody111 - Суббота, 06 Января 2018, 17:02
drcrackДата: Суббота, 06 Января 2018, 17:31 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
Код
int[] numCol = new int[3] { 1, 2, 3 };

        for (int i = 0; i < numCol.Length; i++)
        {
            t = numCol[Random.Range(0, numCol.Length)];
        }

Эта пять :D Чем не устроило просто t = Random.Range(1, 4); ?

Код
platformRandom = GameObject.Find("Platform 7_1 (1) (Clone)");

Эта строчка выберет не рандомную платформу, а первую в иерархии, у тебя на скрине она даже в кадр не попадает
woody111Дата: Суббота, 06 Января 2018, 17:33 | Сообщение # 10
был не раз
Сейчас нет на сайте
ну а как значение связывать с цветом - через таг или layer?
drcrackДата: Суббота, 06 Января 2018, 18:01 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Для начала обьясни что ты хочешь сделать
Присвоить рандомный цвет рандомной платформе?
Присвоить рандомный, но один и тот же цвет всем платформам?
Присвоить рандомный цвет каждой платформе (всем разный)?

У тебя на скрине кстати на платформе нет Renderer, видимо он где-то внутри в иерархии
Поэтому тебе нужен другой метод — GetComponentInChildren:
Код
platformRandom.GetComponentInChildren<Renderer>().material.color = Color.black;


Сообщение отредактировал drcrack - Суббота, 06 Января 2018, 18:04
woody111Дата: Суббота, 06 Января 2018, 19:02 | Сообщение # 12
был не раз
Сейчас нет на сайте
Я хочу присвоить каждой платформе рандомный цвет из трех.
drcrackДата: Суббота, 06 Января 2018, 19:32 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Создай пустой обьект с именем Platforms, засунь в него все платформы и сделай так:

Код
var colors = new [] {Color.black, Color.green, Color.yellow};

foreach (Transform t in GameObject.Find("/Platforms").transform) {

    t.GetComponentInChildren<Renderer>().material.color = colors[Random.Range(0, colors.Length)];

}


Сообщение отредактировал drcrack - Суббота, 06 Января 2018, 19:33
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Присваивание рандомного цвета объекту
Страница 1 из 11
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг