Как я могу создать скрипт менеджера для управления всеми нарисованными кругами одновременно? - PullRequest
0 голосов
/ 17 декабря 2018

Первый скрипт для рисования круга: когда я присоединяю этот скрипт к игровому объекту, он рисует круг вокруг объекта.

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

[RequireComponent(typeof(LineRenderer))]
public class DrawCircle : MonoBehaviour
{
    [Range(0, 50)]
    public int segments = 50;
    [Range(1, 50)]
    public float xradius = 5;
    [Range(1, 50)]
    public float yradius = 5;
    [Range(-10, 10)]
    public float height = 0;
    public bool changeBothRadius = false;
    [Range(0.1f, 2)]
    public float lineThickness = 0.1f;
    public bool minimumRadius = false;

    private LineRenderer line;

    void Start()
    {
        line = gameObject.GetComponent<LineRenderer>();
        line.positionCount = segments + 1;
        line.useWorldSpace = false;
    }

    void Update()
    {
        line.startWidth = lineThickness;
        line.endWidth = lineThickness;

        CreatePoints();
    }

    void CreatePoints()
    {
        float x;
        float z;

        float angle = 20;

        for (int i = 0; i < (segments + 1); i++)
        {
            x = Mathf.Sin(Mathf.Deg2Rad * angle) * xradius;
            z = Mathf.Cos(Mathf.Deg2Rad * angle) * yradius;

            line.SetPosition(i, new Vector3(x, height, z));

            angle += (360f / segments + 1);
        }
    }
}

Теперь я создал скрипт менеджера, который должен контролировать все круги наOnce:

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

public class CirclesManager : MonoBehaviour
{
    public GameObject[] objectsToAddCircles;
    [Range(0, 50)]
    public int segments = 50;
    [Range(1, 50)]
    public float xradius = 5;
    [Range(1, 50)]
    public float yradius = 5;
    [Range(-10, 10)]
    public float height = 0;
    public bool changeBothRadius = false;
    [Range(0.1f, 2)]
    public float lineThickness = 0.1f;
    public bool minimumRadius = false;

    void Start()
    {

        for (int i = 0; i < objectsToAddCircles.Length; i++)
        {
            objectsToAddCircles[i].AddComponent<DrawCircle>();
            objectsToAddCircles[i].AddComponent<LineRenderer>();
        }
    }

    void Update()
    {
        for (int i = 0; i < objectsToAddCircles.Length; i++)
        {
            var lr = objectsToAddCircles[i].GetComponent<LineRenderer>();
            lr.startWidth = lineThickness;
            lr.endWidth = lineThickness;

            var dc = objectsToAddCircles[i].GetComponent<DrawCircle>();
            dc.segments = segments;
            dc.xradius = xradius;
            dc.yradius = yradius;
            dc.height = height;
            dc.changeBothRadius = changeBothRadius;
            dc.minimumRadius = minimumRadius;
        }
    }
}

Так что теперь у каждого объекта есть компонент LineRenderer и скрипт DrawCircle, и теперь скрипт CirclesManager работает со всеми объектами нормально, но если я попытаюсь изменить индивидуальные настройки объекта, он не изменится.Например, я могу изменить ползунки xrdaius или yradius в скрипте менеджера, но если я попытаюсь изменить их в определенном объекте, ползунки не будут перемещаться, они не изменятся.

Не могу понять, почему скрипт менеджераработает, но не каждый отдельный объект со скриптом и LineRenderer.

1 Ответ

0 голосов
/ 17 декабря 2018

В классе CirclesManager в Update у вас есть следующие строки:

dc.xradius = xradius;
dc.yradius = yradius;

Независимо от того, где и как вы измените отдельный DrawCircle радиус экземпляра, эти строки всегда будут перезаписывать эти значения.

Я не знаю, какое поведение вы хотите заархивировать, но вы можете создать массив bool, чтобы вы могли вручную установить, какие круги будут управляться CirclesManager, а какие будут использовать свои собственные значения:

// you can change it in the inspector which is handy
// if i'th value of this array is false
// then i'th CircleDrawer GameObject in objectsToAddCircles array
// won't be affected by this manager
public bool changableCircle[];

void Start() {
    // your code
    changableCircle = new bool[objectsToAddCircles.Length];
}

void Update() {
    for(...) {
        // values which are always overwritten by manager
        if(changableCircle[i]) {
            // values which you don't want to be changed by this manager
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...