2017-02-21 20 views
-1
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class BoxCollider : MonoBehaviour { 

    private float degree = 180f; 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void OnTriggerEnter(Collider c) 
    { 
     GameObject character = GameObject.Find(c.name); 
     character.transform.rotation = Quaternion.Slerp(character.transform.rotation, Quaternion.Euler(0, 0, degree), Time.deltaTime); 
    } 
} 

У меня есть два символа ThirdPersonController. Когда событие OnTriggerEnter является триггером, я вижу в c.Name "ThirdPersonController"Как я могу вращать гладкие символы на столкновении?

Я также добавил 4 пустых игровых объекта, каждый из которых добавил коробку коллайдера, установленную IsTrigger, а также приложил каждый объект игры к этому сценарию.

И я проверил, когда персонаж добрался до стены, они перестают двигаться, но продолжают ходить по месту.

Теперь я хочу, чтобы в этом месте текущий символ (или оба), который запустил событие, чтобы повернуть на 180 градусов. Но вместо этого он не делает поворот, характер/ы продолжают выходить из местности в некоторой степени изменились на оси z, я думаю.

Я думаю, что я сделал что-то неправильно с линией Quaternion.Slerp.

ответ

0

Использование Collider.gameObject

Как у вас есть два геймобжекты с таким же названием, ваша GameObject.Find(c.name) линия всегда будет возвращать один и тот же один, независимо от того, Collider фактически вызвало столкновения.

GameObject.Find также очень медленный по сравнению с непосредственным использованием свойства gameObject Collider, поэтому вам нужно избегать использования Найти как можно чаще.

Вот модифицированная версия:

void OnTriggerEnter(Collider c) 
{ 
    // Don't use GameObject.Find here - just use the gameObject ref on the given collider: 
    GameObject character = c.gameObject; 

    character.transform.rotation = Quaternion.Slerp(character.transform.rotation, Quaternion.Euler(0, 0, degree), Time.deltaTime); 
} 

Time.deltaTime для обновления только

Это просто достаточно случайным, очень небольшое число в противном случае.

+0

Что-то не так. На 4 пустых игровых объекта на каждом из них я добавил компонент коллайдера. Если я установил свойство IsTrigger в ON, то флажок установлен, когда третий оператор контролирует стену (gameobject), он перестает перемещаться, просто продолжайте ходить по месту. Но тогда это не вызывает событие OnTriggerEnter в скрипте. Если я удалю uncheckbox IsTrigger, тогда он вызовет событие, но и тогда персонаж будет продолжать выходить из местности. –

+0

@ DanielHalfoni Вам нужно также переместить строку 'Quaternion.Slerp' в' Update' _ (потому что она использует Time.deltaTime, которая некорректна внутри OnTriggerEnter), но я не знаю, чего вы пытаетесь достичь , –

+0

Я пытаюсь сделать так, чтобы игрок не упал и не выйдет из области местности, это моя общая цель в этом случае. –