В скрипте Waypoints скрипт привязан к персонажу. Персонаж ждет 10 секунд, прежде чем он войдет в состояние ходьбы и начнет перемещаться между путевыми точками. В последней путевой точке персонаж находится в состоянии ожидания.
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.AI;
public class Waypoints : UnityEngine.MonoBehaviour
{
public List<GameObject> waypoints = new List<GameObject>();
public Animator _animator;
public int waitTimeBeforeGo;
public int num = 0;
public float minDist;
public float speed;
public bool rand = false;
public bool go = true;
public bool loop = false;
public bool waitTime = false;
public float smoothRotation;
public bool inIdle = false;
private bool lastPoint = false;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
float dist = Vector3.Distance(gameObject.transform.position, waypoints[num].transform.position);
if (waitTime == true)
{
StartCoroutine(WaitBeforeGo());
}
else
{
if (go)
{
_animator.SetBool("Walk", true);
if (dist > minDist && lastPoint == false)
{
Move();
}
else
{
if (!rand)
{
if (num + 1 == waypoints.Count)
{
if (loop == true)
{
num = 0;
}
lastPoint = true;
_animator.SetBool("Idle", true);
inIdle = true;
}
else
{
num++;
}
}
else
{
num = Random.Range(0, waypoints.Count);
}
}
}
}
}
public void Move()
{
Quaternion lookOnLook =
Quaternion.LookRotation(waypoints[num].transform.position - transform.position);
transform.rotation =
Quaternion.Slerp(transform.rotation, lookOnLook, Time.deltaTime * smoothRotation);
gameObject.transform.position += gameObject.transform.forward * speed * Time.deltaTime;
}
IEnumerator WaitBeforeGo()
{
yield return new WaitForSeconds(waitTimeBeforeGo);
waitTime = false;
}
}
И теперь у меня также есть скрипт телепортации, прикрепленный к телепортирующемуся объекту.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Teleporting : MonoBehaviour
{
public List<GameObject> teleporters = new List<GameObject>();
public GameObject objectToTeleportMaterial;
public Waypoints waypoints;
public float fadeDuration = 5;
public float fadeInTargetOpacity = 0;
public float fadeOutTargetOpacity = 1;
private List<Vector3> teleportersPositions = new List<Vector3>();
private bool teleported = false;
private Material material;
private GameObject myother;
// Start is called before the first frame update
void Start()
{
}
private void OnTriggerEnter(Collider other)
{
if (other.name == "vanguard_t_choonyung@T-Pose (1)")
{
teleported = false;
myother = other.gameObject;
material = objectToTeleportMaterial.GetComponent<Renderer>().material;
Teleport(material, fadeInTargetOpacity, fadeDuration);
}
}
// Update is called once per frame
void Update()
{
if(waypoints.inIdle == true)
{
material.ToTransparentMode();
}
if (teleported == true)
{
myother.transform.position = teleporters[1].transform.position;
Teleport(material, fadeOutTargetOpacity, fadeDuration);
material.ToOpaqueMode();
teleported = false;
}
}
private void Teleport(Material material, float fadeTargetOpacity, float fadeDuration)
{
StartCoroutine(FadeTo(material, fadeTargetOpacity, fadeDuration));
}
// Define an enumerator to perform our fading.
// Pass it the material to fade, the opacity to fade to (0 = transparent, 1 = opaque),
// and the number of seconds to fade over.
IEnumerator FadeTo(Material material, float targetOpacity, float duration)
{
// Cache the current color of the material, and its initiql opacity.
Color color = material.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 & target.
color.a = Mathf.Lerp(startOpacity, targetOpacity, blend);
// Apply the resulting color to the material.
material.color = color;
// Wait one frame, and repeat.
yield return null;
}
if (targetOpacity == 1)
{
}
if (targetOpacity == 0)
{
teleported = true;
}
}
}
С этим скриптом я есть некоторые проблемы.
Персонаж переходит в прозрачный режим в настройках материала, когда начинает телепортироваться, но после того, как он телепортировался в новое положение в новом положении, он никогда не возвращается в режим непрозрачности в настройки материала.
В новой позиции, когда персонаж начинает исчезать на миллисекунду, персонаж отображается как в режиме непрозрачности, но затем он уходит, а затем начинает исчезать второй телепорт, но никогда не переходите в режим непрозрачности.
Этот класс является вспомогательным классом для изменения режимов материала между прозрачным и непрозрачным:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class MaterialExtensions
{
public static void ToOpaqueMode(this Material material)
{
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
}
public static void ToTransparentMode(this Material material)
{
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
}
}
Что я хочу сделать:
Персонаж проходит между путевыми точками. Когда персонаж доберется до последней путевой точки и войдет в состояние ожидания, подождите 1-2 секунды перед началом телепортации.
При запуске телепортации персонаж должен перейти в прозрачный режим и медленно исчезнуть и измените положение.
В новой позиции персонаж должен медленно исчезать, а затем медленно вернуться в режим непрозрачности.
Персонаж должен начать перемещаться между новыми путевыми точками в своей новой позиции после того, как телепортация исчезла, а затем вернулась в непрозрачный режим.
Как я могу заставить персонажа ждать 1-2 секунды в состоянии ожидания перед началом телепортации?
Как мне сделать так, чтобы персонаж находился на его новой позиции после исчезновения и после перехода в непрозрачный режим, чтобы начать перемещение между новыми путевыми точками? Я добавил путевые точки в его новую позицию.
Как мне исправить проблемы со скриптом телепортации? Сама телепортация все еще не гладкая. В первый раз часть затухания в порядке, но затухание в новой позиции не работает.
Некоторые снимки экрана о режимах Transparent и Opaque.
Первый снимок экрана, показывающий альфа-канал Прозрачный режим, когда значение альфа-канала установлено на 255:
Даже если значение альфа-канала равно 255 в прозрачном режиме, символ все еще выглядит прозрачным.
Прозрачный альфа-цвет установлен на 255
Второй снимок экрана также Прозрачный, на этот раз al [ha установлен на 0:
Альфа прозрачного режима установлена на 0, но все же некоторые символы все еще отображаются
Теперь я вижу, что даже на Прозрачном, когда альфа равна 0, вы можете видеть немного персонажа, который не исчез, его часть еще осталась.
Теперь скриншот режима Непрозрачности один снимок экрана, поскольку ничего не меняется, если альфа равна 0 или 255 в непрозрачном режиме:
Альфа непрозрачного режима имеет значение 255
Итак, что я узнал из этих снимков экрана и пока режим:
Прозрачный режим, когда альфа установлен на 0, не заставляет символ полностью исчезнуть. Это выглядит как будто с небольшого расстояния, но если вы посмотрите поближе, вы увидите, что немного символа все еще осталось.
Прозрачный режим, когда альфа установлена на 255, символ не заполнен полностью. по-прежнему выглядит прозрачным.
Непрозрачный режим, когда альфа установлена на 0 или 255, тот же результат, что символ заполняется, как и в оригинале.
Все эти тесты я проводил на стандартном шейдере.