Как я могу добавить больше источников света, если флаг twoSides имеет значение true? - PullRequest
0 голосов
/ 11 мая 2018
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LightsEffect : MonoBehaviour
{
    public List<UnityEngine.GameObject> waypoints;
    public int howmanylight = 5;
    public bool changeLightsDirection = false;
    public bool twoSides = false;
    public float delay = 0.1f;

    private List<UnityEngine.GameObject> objects;
    private Renderer[] renderers;
    private int greenIndex = 0;
    private float lastChangeTime;

    private void Start()
    {
        objects = new List<UnityEngine.GameObject>();

        if (howmanylight > 0)
        {
            UnityEngine.GameObject go1 = UnityEngine.GameObject.CreatePrimitive(PrimitiveType.Sphere);
            duplicateObject(go1, howmanylight);
            LightsEffects();
        }
    }

    private void Update()
    {
        LightsEffectCore();
    }

    public void duplicateObject(UnityEngine.GameObject original, int howmany)
    {
        if (twoSides == true)
            howmany = howmany * 2;

        howmany++;
        for (int i = 0; i < waypoints.Count - 1; i++)
        {
            for (int j = 1; j < howmany; j++)
            {
                Vector3 position = waypoints[i].transform.position + j * (waypoints[i + 1].transform.position - waypoints[i].transform.position) / howmany;
                UnityEngine.GameObject go = Instantiate(original, new Vector3(position.x, 0.05f, position.z), Quaternion.identity);
                go.transform.localScale = new Vector3(0.3f, 0.1f, 0.3f);
                objects.Add(go);
            }
        }
    }

    private void LightsEffects()
    {
        renderers = new Renderer[objects.Count];
        for (int i = 0; i < renderers.Length; i++)
        {
            renderers[i] = objects[i].GetComponent<Renderer>();
            renderers[i].material.color = Color.red;
        }

        // Set green color to the first one
        greenIndex = 0;
        renderers[greenIndex].material.color = Color.green;
    }

    private void LightsEffectCore()
    {
        // Change color each `delay` seconds
        if (Time.time > lastChangeTime + delay)
        {
            lastChangeTime = Time.time;

            // Set color of the last renderer to red
            // and the color of the current one to green
            renderers[greenIndex].material.color = Color.red;
            if (changeLightsDirection == true)
            {
                Array.Reverse(renderers);
                changeLightsDirection = false;
            }
            greenIndex = (greenIndex + 1) % renderers.Length;
            renderers[greenIndex].material.color = Color.green;
        }
    }
}

Two sides

Внутри метода duplicateObject я проверяю, имеет ли флаг twoSides значение true, а затем удваивает вдвое количество источников света:

public void duplicateObject(UnityEngine.GameObject original, int howmany)
        {
            if (twoSides == true)
                howmany = howmany * 2;

            howmany++;
            for (int i = 0; i < waypoints.Count - 1; i++)
            {
                for (int j = 1; j < howmany; j++)
                {
                    Vector3 position = waypoints[i].transform.position + j * (waypoints[i + 1].transform.position - waypoints[i].transform.position) / howmany;
                    UnityEngine.GameObject go = Instantiate(original, new Vector3(position.x, 0.05f, position.z), Quaternion.identity);
                    go.transform.localScale = new Vector3(0.3f, 0.1f, 0.3f);
                    objects.Add(go);
                }
            }
        }

Это строки:

if (twoSides == true)
    howmany = howmany * 2;

Но это добавит еще 5 источников света между путевыми точками, как показано на скриншоте.

И я хочу добавить еще 5 источников света, но построчно создать две линии между путевыми точками источников света.

Как-то изменить новое положение 5 источников света, чтобы оно было рядом с / рядом с первыми 5 источниками света. А затем выровнять линии света так, чтобы они были равны между путевыми точками.

Две линии и две стороны, я имею в виду что-то вроде этого:

Two sides

Но они должны быть равны между путевыми точками, как на первом скриншоте.

Я попробовал вот что: Изменен метод duplicateObject:

public void duplicateObject(UnityEngine.GameObject original, int howmany)
    {
        GameObject go = new GameObject();

        if (twoSides == true)
            howmany = howmany * 2;

        howmany++;
        for (int i = 0; i < waypoints.Count - 1; i++)
        {
            for (int j = 1; j < howmany; j++)
            {
                Vector3 position = waypoints[i].transform.position + j * (waypoints[i + 1].transform.position - waypoints[i].transform.position) / howmany;
                if (j > 5)
                {
                    go = Instantiate(original, new Vector3(position.x + 1, 0.05f, position.z), Quaternion.identity);
                }
                else
                {
                    go = Instantiate(original, new Vector3(position.x, 0.05f, position.z), Quaternion.identity);
                }
                go.transform.localScale = new Vector3(0.3f, 0.1f, 0.3f);
                objects.Add(go);
            }
        }
    }

Но результат не тот, который я хотел:

Two sides

Теперь проблема в том, что источники света, промежутки между которыми не равны между двумя путевыми точками (кубами), а также новые 5 источников света находятся на расстоянии от путевых точек.

Оба огня, каждый из 5 источников света, должны иметь одинаковые промежутки и располагаться рядом между путевыми точками. Как посадочные огни для самолетов между двумя путевыми точками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...