Вы неправильно понимаете, что делает Lerp. Лерп ничего не оживляет сам по себе, он только интерполирует между двумя значениями на t, где t находится в диапазоне от 0 до 1. Вы можете представить t как процент ->, если t равно 0, результат lerp - это первое значение (или в случае v3 также 0% в направлении 2-го), если t равно 1, результат равен второму, если t равно 0,5, результат лежит в середине обоих, поэтому, если его 0.25 на 25% (Slerp равен в основном то же самое, только то, что значение представляет собой поворот, проверите википедию для получения дополнительной информации обо всем этом).
Но что это значит для вас в конце?
Вам необходимо вызвать Lerp несколько раз и установить t туда, где вы находитесь. Одним из вариантов было бы запустить сопрограмму и постепенно вводить/уменьшать t на (1/seconds) * Time.deltaTime
каждый кадр после того, как игрок войдет/выйдет из триггера.
редактировать:
Приложите это к заметному GameObject и запустить его. Он думает, что он должен прояснить, как работает Лерп. Важная часть: t. он должен вовремя/уменьшать эффект анимации.
using UnityEngine;
public class LerpExample : MonoBehaviour {
public Vector3 targetScale = new Vector3(2, 2, 2);
public float duration = 2;
Vector3 originalScale;
float timeFactor;
float t;
void Start() {
originalScale = transform.localScale;
//since only values between 0 and 1 will do something
//we need to know "how much" Time.deltaTime affects our lerping
//ofc we could calculate it "on the fly", but it stays the same so better store it
timeFactor = 1/duration;
t = 0;
}
void Update() {
//this is just so it repeats over and over
//if t would grow bigger than 1, it would just be interpreted as 1 by Lerp
if (t > 1) t -= 1;
//this is what animates it in the end. each frame (its the update method!) a fraction gets added to t. think of it as percentage.
t += timeFactor * Time.deltaTime;
transform.localScale = Vector3.Lerp(originalScale, targetScale, t);
}
}
edit2: Хорошо, это выше работает в сопрограмме. Тем не менее, это небольшая «ловушка». я не учитывал, когда игрок покидает триггер до того, как масштабирование закончилось. если он это делает, продолжительность несовместима. если, например, его 10, и он уйдет после 2-х, он вернется к норме более 10, а не 2 секунды. я оставляю это до вас, чтобы исправить, если вы хотите, чтобы это было исправлено.
это идет на триггер
using UnityEngine;
public class Cake : MonoBehaviour {
public Vector3 targetScale = new Vector3(2, 2, 2);
public float duration = 2;
void OnTriggerEnter(Collider other) {
Alice alice = other.GetComponentInParent<Alice>();
if (alice == null) return;
alice.Eat(this);
}
void OnTriggerExit(Collider other) {
Alice alice = other.GetComponentInParent<Alice>();
if (alice == null) return;
alice.GrowBackToNormal(this);
}
}
и это идет на объект ввода на спусковой крючок
using UnityEngine;
using System.Collections;
public class Alice : MonoBehaviour {
Vector3 originalScale;
Coroutine eatAllTheCakeCoroutine;
void Start() {
originalScale = transform.localScale;
}
IEnumerator ChangeScale(Vector3 targetScale, float duration) {
Vector3 startScale = transform.localScale;
float timeFactor = 1/duration;
float t = 0;
while (t < 1) {
t += timeFactor * Time.deltaTime;
transform.localScale = Vector3.Lerp(startScale, targetScale, t);
yield return null;
}
transform.localScale = targetScale;
}
public void Eat(Cake cake) {
if (eatAllTheCakeCoroutine != null) StopCoroutine(eatAllTheCakeCoroutine);
eatAllTheCakeCoroutine = StartCoroutine(ChangeScale(cake.targetScale, cake.duration));
}
public void GrowBackToNormal(Cake cake) {
if(eatAllTheCakeCoroutine != null) StopCoroutine(eatAllTheCakeCoroutine);
eatAllTheCakeCoroutine = StartCoroutine(ChangeScale(originalScale, cake.duration));
}
}
Thankyou Су много ДА, Был глупую ошибку, А строка кода была помещена Inthe начала которая не позволяла функции lerp выполнять свою работу. function Start() {//transform.localScale = new Vector3 (1F, 1F, 1F); // это была глупая строка. // -------------------------- –
Теперь My ontriggerEnter и Exit r работают, но когда я активирую строку выхода на выходе, код OVR charcters начинает дрожать внутри зоны триггера // ------ функция OnTriggerStay (информация: Collider) {if (info.tag == "Mani1") {transform.localScale = Vector3.Lerp (transform.localScale, newScale, speed * Time.deltaTime); //transform.localScale = new Vector3 (0.9F, 0.9F, 0.9F); Debug.Log («Player Mani1»); } } // ----------- функция OnTriggerExit (информация: коллайдер) {if (info.tag == "Mani1") {transform.localScale = Vector3.Lerp (transform. localScale, Grow, speed * Time.deltaTime); } } –
необходимо увеличить t (3-й аргумент lerp). он должен идти от 0 до 1, пока вы масштабируетесь.в 1-м кадре t должно быть 0, в следующем вы увеличиваете его на '(1/секунд) * TimeDeltaTime', и вы продолжаете увеличивать каждый последующий кадр, пока не нажмете 1. http://docs.unity3d.com/ScriptReference/ Vector3.Lerp.html, возможно, этот учебник поможет вам http://www.blueraja.com/blog/404/how-to-use-unity-3ds-linear-interpolation-vector3-lerp-correctly – yes