Unity transform.position не работает должным образом - PullRequest
0 голосов
/ 23 мая 2018

Хорошо, так что я разобрался с проблемой, с которой столкнулся.Местоположение, которое возвращалось для портала, находилось внутри портала, и оно вылетало, когда один объект находился внутри другого, поэтому я просто добавил пустой объект к порталу, где я хочу, чтобы они выходили, и программа указала на это.

Я работаю над небольшой «игрой» в Unity, и есть четыре портала с метками PortalMain1, PortalMain2, PortalMain3 и PortalMain4, и цель будет для игрокачтобы иметь возможность столкнуться с коллайдером на каждом из порталов и беспрепятственно телепортироваться на один из других порталов.

У меня есть этот бит кода на модели игрока, обрабатывающей события триггера:

private void OnTriggerEnter(Collider other)
{
    int PortalDestination = Random.Range(1, 4);  ///Portals index at 1 because Unity
    string Portal = "PortalMain" + PortalDestination;
    Debug.Log(Portal);
    transform.position = GameObject.Find(Portal).transform.position;
}

Что действительно происходит в игре, так это когда игрок сталкивается с коллайдером на портале игрыправильно выберет портал из 1-4 (хотя, кажется, он никогда не выберет тот, к которому вы прикоснулись, который аккуратен) и телепортирует вас туда.

За исключением того, что вы телепортируетесь рядом с порталом, а не поверх него, и если телепортация работает, похоже, она работает только примерно в 1/4 времени.

Вот изображение иерархии сцены с основанием:

scene with the base

Вот изображение иерархиисцена со зданием:

scene with the building

Вот изображение иерархии сцены с порталом:

scene with the portal

РЕДАКТИРОВАТЬ # 1: я переработал свой метод для работы с Rigidbody, но проблема сохраняется.

private void OnTriggerEnter(Collider other)
{
    int PortalDestination = Random.Range(1, 4);  ///Portals index at 1 because Unity
    string Portal = "PortalMain" + PortalDestination;
    Debug.Log(Portal);
    GetComponent<Rigidbody>().isKinematic = true;
    GetComponent<Rigidbody>().position = GameObject.Find(Portal).transform.position;
    GetComponent<Rigidbody>().isKinematic = false;
} 

Вот ссылка на Github> https://github.com/LvInSaNevL/Bamboozle

1 Ответ

0 голосов
/ 24 мая 2018

Во-первых, присоедините OnTriggerEnter к TRIGGER, а не к игроку.

Во-вторых, прикрепите этот скрипт к порталу и явно установите spawnPoint.

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

public class Portal : MonoBehaviour {
    public static List<Portal> portals {get; protected set;}
    public Transform spawnPoint; // Set it in the editor
    protected bool ignoreNextTouches = false;

    private void Start () {
        if (portals == null)
            portals = new List<Portal>();
        portals.Add (this);
    }
    private void OnTriggerEnter (Collider other) {
        if (!other.gameObject.tag.Equals ("Player"))
            return;
        if (ignoreNextTouches) {
            ignoreNextTouches = false;
            return;
        }
        Portal random = GetRandomPortal (this);
        random.ignoreNextTouches = true;
        other.transform.position = random.spawnPoint.position;
    }
    private static Portal GetRandomPortal (Portal exceptThis) {
        Portal  p = exceptThis;
        while (p == exceptThis)
            p = portals[Random.Range(0,portals.Length)];
        return p;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...