2016-04-21 5 views
0

Я забиваю Gear VR APP, я хочу, чтобы мой персонаж уменьшался при входе в зону коллайдера коробки, я могу уменьшить его внезапно с использованием transform.localScale = new Vector3 (0.3F, 0.3F, 0.3F); Но я хочу, чтобы это было сделано гладко. Не знаю, почему он не поднимает эту линию lerp? Может ли кто-нибудь помочь? Я пометил мой коллайдер с ящиками (куб до «Мани») и еще одно, OnTriggerExit мой lerp один тоже не звонит.Lerp.localScale не работает OnTriggerEnter, Unity5.3.3, Gear VR App Dev

#pragma strict 

var newScale : Vector3 = Vector3 (0.1,0.1,0.1); 

var Grow : Vector3 = Vector3 (1,1,1); 
var speed : float =2.0; 

function Start() { 
    transform.localScale = new Vector3(1F,1F,1F); 
} 

function Update() { 

} 

function OnTriggerEnter (info : Collider) { 

    if(info.tag == "Mani") { 
    transform.localScale =Vector3.Lerp(transform.localScale, newScale, speed * Time.deltaTime/2); 
    //transform.localScale = new Vector3(0.3F,0.3F,0.3F); 
    Debug.Log("Player hit new cube"); 
    } 

} 


function OnTriggerExit (Col : Collider) { 

    if(Col.tag == "Mani") { 
    // transform.localScale = new Vector3(transform.localScale.x, 1F, transform.localScale.y); 
    transform.localScale =Vector3.Lerp(newScale, Grow, speed * Time.deltaTime); //transform.localScale = new Vector3(1F,1F,1F); Debug.Log("Player left cube"); 
    } 

} 

ответ

0

Вы неправильно понимаете, что делает 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)); 
    } 
} 
+0

Thankyou Су много ДА, Был глупую ошибку, А строка кода была помещена Inthe начала которая не позволяла функции lerp выполнять свою работу. function Start() {//transform.localScale = new Vector3 (1F, 1F, 1F); // это была глупая строка. // -------------------------- –

+0

Теперь 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); } } –

+0

необходимо увеличить 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