Почему при получении всех материалов в список все элементы равны нулю? И как изменить положение объекта при затухании / затухании?

#c# #unity3d

#c# #unity3d

Вопрос:

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

public class MoveNavi : MonoBehaviour
{
    public GameObject rig_f_middle;
    public float speed;
    public float distanceFromTarget;
    public static bool naviChildOfHand = false;
    public GameObject naviParent;
    public MeshRenderer[] materialsToFade;

    private List<Material> materials = new List<Material>();

    private void Start()
    {
        foreach(MeshRenderer meshrend in materialsToFade)
        {
            materials.Add(meshrend.GetComponent<Material>());
        }
    }

    private void Update()
    {
        if (IKControl.startMovingNAVI == true)
        {
            var v = rig_f_middle.transform.position - transform.position;
            if (v.magnitude < distanceFromTarget)
            {
                naviChildOfHand = true;
                StartCoroutine(FadeTo(materials, 0, 0.2f));
                this.enabled = false;
                return;
            }
            Vector3 moveDir = v.normalized;
            transform.position  = moveDir * speed * Time.deltaTime;
        }

    }

    IEnumerator FadeTo(List<Material> materials, float targetOpacity, float duration)
    {
        foreach (Material mat in materials)
        {
            // Cache the current color of the material, and its initiql opacity.
            Color color = mat.color;
            float startOpacity = color.a;

            // Track how many seconds we've been fading.
            float t = 0;

            while (t < duration)
            {
                // Step the fade forward one frame.
                t  = Time.deltaTime;
                // Turn the time into an interpolation factor between 0 and 1.
                float blend = Mathf.Clamp01(t / duration);

                // Blend to the corresponding opacity between start amp; target.
                color.a = Mathf.Lerp(startOpacity, targetOpacity, blend);

                // Apply the resulting color to the material.
                mat.color = color;

                // Wait one frame, and repeat.
                yield return null;
            }

            StartCoroutine(FadeTo(materials, 1, 0.2f));

            if (targetOpacity == 1)
            {
                //MaterialExtensions.ToOpaqueMode(material);

            }

            if (targetOpacity == 0)
            {

            }
        }
    }

    private void ChangeChild()
    {
        var parent = GameObject.Find("Navi Parent");
        transform.parent = parent.transform;
        transform.localPosition = parent.transform.localPosition;
        transform.localRotation = Quaternion.identity;
        transform.localScale = new Vector3(0.001f, 0.001f, 0.001f);
    }
}
  

В materialsToFade есть 6 средств визуализации сетки, затем в начале я получаю материалы из каждого средства визуализации сетки и добавляю их в список материалов, но затем все элементы в materials имеют значение null.

Пример объекта с средством визуализации сетки и материалом :

Средство визуализации сетки с материалом

Другая проблема заключается в том, как я могу сделать это, пока преобразование получает fade out alpha равным 0, и перед тем, как оно начнет fade in обратно к 1, чтобы создать дочерний элемент изменения?

Для этого требуется очень мало ограниченного времени, но я хочу, чтобы, когда альфа-преобразование равно 0, Change Child затем исчезал обратно до 1 и выполнялся как можно быстрее, чтобы игрок не заметил переключения.

Комментарии:

1. Пожалуйста, задавайте по одному вопросу за раз

Ответ №1:

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

 foreach(MeshRenderer meshrend in materialsToFade)
{
    materials.Add(meshrend.material);
}
  

Что касается изменения дочернего элемента при затухании перед затуханием, просто вызовите ChangeChild непосредственно перед вызовом StartCoroutine(fadeTo(materials, 1, 0.2f));