У меня есть 3 сценария, один дублирует сценарий, а третий должен получить созданные объекты, но я не могу получить эти объекты.Как я могу получить объекты? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 3 сценария, один дублирует сценарий, а третий должен получить созданные объекты, но я не могу получить эти объекты.Как я могу получить объекты?

Первый скрипт - Generate Stairs Units.Этот скрипт прикреплен к пустому GameObject.

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

public class GenerateStairsUnits : MonoBehaviour
{
    [Header("Stairs Units Prefab")]
    public GameObject stairsUnitsPrefab;
    [Space(5)]
    [Header("Settings")]
    [Range(1, 20)]
    public int numberOfUnits = 1;
    public static GameObject Unit;

    private int oldNumberOfUnits = 0;
    private List<GameObject> units = new List<GameObject>();

    // Use this for initialization
    void Start ()
    {
        oldNumberOfUnits = numberOfUnits;

        var unitsParent = GameObject.Find("Stairs Units");
        for (int i = 0; i < numberOfUnits; i++)
        {
            Unit = Instantiate(stairsUnitsPrefab, unitsParent.transform);
            Unit.name = "Stairs " + i.ToString();
            units.Add(Unit);
            Unit.AddComponent<MoveObjects>();
        }
    }

    // Update is called once per frame
    void Update ()
    {

    }
}

Сценарий GenerateStairsUnits дублирует префаб второго скрипта. Generate Stairs:

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

public class GenerateStairs : MonoBehaviour
{
    [Header("Stairs Prefb")]
    public GameObject stairsPrefab;
    [Space(5)]
    [Header("Platforms")]
    public bool addPlatforms = false;
    public GameObject platformsPrefab;
    [Space(5)]
    [Header("Settings")]
    public float delay = 3;
    public int stairsNumber = 5;
    public Vector3 stairsStartPosition;
    public Vector3 stairSize;
    public Vector3 stairsSize;
    public float stepWidthFactor = 1f;
    public GameObject moveobjects;

    private Vector3 stairsPosition;
    private GameObject stairsParent;

    // Use this for initialization
    void Start()
    {
        moveobjects = GameObject.Find("Move Objects");

        stairsParent = new GameObject();
        stairsParent.name = "Stairs";
        stairsParent.transform.parent = GenerateStairsUnits.Unit.transform;
        StartCoroutine(BuildStairs());
    }

    // Update is called once per frame
    void Update()
    {

    }

    private IEnumerator BuildStairs()
    {
        for (int i = 1; i <= stairsNumber; i++)
        {

            stairsPosition = new Vector3(
                    stairsStartPosition.x,
                    stairsStartPosition.y + (i * stairsSize.y),
                    stairsStartPosition.z + (i * stairsSize.y) * stepWidthFactor);

            GameObject stair = Instantiate(
                    stairsPrefab,
                    stairsPosition,
                    Quaternion.identity);

            stair.tag = "Stair";
            stair.transform.parent = transform;
            stair.transform.localScale = stairSize;

            yield return new WaitForSeconds(delay);
        }
    }
}

GenerateStairsUnits также добавляет в качестве компонента третий скрипт Move.Объекты:

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

public class MoveObjects : MonoBehaviour
{
    public List<GameObject> objectsToMove = new List<GameObject>();
    public AnimationCurve curve;
    public float stepsPerSecond = 1f;
    public bool changeDirection = false;

    private Vector3 trackStart;
    private Vector3 trackEnd;
    private Vector3 horizontalTravel;
    private float verticalTravel;
    private float divisor;
    private float phase = 0f;

    // Use this for initialization
    public void Init()
    {
        if (curve == null)
        {
            curve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1));
        }
        curve.preWrapMode = WrapMode.Clamp;
        curve.postWrapMode = WrapMode.Clamp;

        trackStart = objectsToMove[0].transform.position;
        int count = objectsToMove.Count;
        var span = objectsToMove[count - 1].transform.position - trackStart;

        divisor = 1f / count;
        horizontalTravel = (count + 1) * span * divisor;
        horizontalTravel.y = 0f;

        verticalTravel = span.y;
        trackEnd = trackStart + (count + 1) * span / count;
    }

    // Update is called once per frame
    void Update()
    {
        if (objectsToMove != null && objectsToMove.Count > 0 && curve != null)
        {
            AnimationCurve();
        }
    }

    private void AnimationCurve()
    {
        phase = Mathf.Repeat(phase + stepsPerSecond * divisor * Time.deltaTime, 1f);

        for (int i = 0; i < objectsToMove.Count; i++)
        {
            float t = Mathf.Repeat(phase + i * divisor, 1f);
            // Get the height of the curve at this step.
            float curveHeight = curve.Evaluate(t) * verticalTravel;

            if (changeDirection)
            {
                objectsToMove[i].transform.position = trackStart                // First step
                                  - horizontalTravel * t      // evenly spaced horizontal
                                  + curveHeight * Vector3.up; // curving vertical
            }
            else
            {
                objectsToMove[i].transform.position = trackStart                // First step
                                  + horizontalTravel * t      // evenly spaced horizontal
                                  + curveHeight * Vector3.up; // curving vertical
            }
        }
    }

    private void StraightLineTrack()
    {
        float divisor = 1f / objectsToMove.Count;

        // Compute the current phase of the escalator, 
        // from 0 (1st step at track start) to 1 (1st step at track end)
        phase = Mathf.Repeat(phase + stepsPerSecond * divisor * Time.deltaTime, 1f);

        // Place each step a proportional distance along the track.
        for (int i = 0; i < objectsToMove.Count; i++)
        {
            float t = Mathf.Repeat(phase + i * divisor, 1f);
            objectsToMove[i].transform.position = Vector3.Lerp(trackStart, trackEnd, t);
        }
    }
}

Теперь проблема:

После дублирования GenerateStairs и создания лестниц для каждого Лестничного блока и добавления компонента «Перемещение объектов» получается:

ВИерархия У меня есть пустое имя GameObject Лестницы Единицы.Под Лестницами есть Лестницы Юнитов Лестницы 0, Лестницы 1, Лестницы 2, Лестницы 3, Лестницы 4. А под каждой Лестницей есть Лестницы.

К каждой единице, например, к Лестнице 0, также прикреплен скрипт Move Objects.

Теперь моя проблема заключается в том, как получить лестницу каждого объекта в список объектов Object Move to Moves.

В объекте Move объектов у меня есть имя List ObjectToMove.Например, в разделе «Лестница 0» есть 10 ступеней, которые мне нужны, чтобы эти 10 ступеней добраться до объектов «Перемещение по ступенькам 0. Затем следующие 10 ступеней Лестницы 1 и т. Д.».Но я не могу понять, как добавить лестницу каждой единицы к объектам ToMove.

Stairs

В конце концов, объекты ToMove должны перемещать объект.Лестницы каждого Лестницы.

1 Ответ

0 голосов
/ 20 ноября 2018

Так как ваш Stairs N gameobject присоединяет к нему два скрипта GenerateStairs и MoveObjects, вы можете получить ссылку MoveObjects, вызвав GetComponent перед генерацией Stair s и передать ее BuildStairs function.

void Start()
{
    ...
    MoveObjects moveObjects = gameObject.GetComponent<MoveObjects>();
    StartCoroutine(BuildStairs(moveObjects));
}

Получив ссылку MoveObjects, вы можете затем передать эту ссылку в вашу BuildStairs функцию и добавить те, которые генерируют stair s, в список objectsToMove внутри MoveObjects.

Измените функцию и введите MoveObjects, как показано ниже:

private IEnumerator BuildStairs(MoveObjects moveObjects)
{
    ...
    moveObjects.objectsToMove.add (stair);
    ...
}

О GetComponent .

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