#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));