Моя функция запускается, как только я применяю скрипт к GameObject в редакторе сцен. Мне нужно, чтобы это влияло только на объект во время выполнения - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть простой скрипт, который должен захватить позицию и поворот поворота GameObject, а затем переместить GameObject обратно в эту позицию, когда его ударил Raycast. (Объекты перемещаются, когда игрок сталкивается с ними.)

Хорошо работает для объектов, к которым уже прикреплен скрипт, но когда я применяю скрипт к новому GameObject, он сбрасывает значения преобразования в (0, 0,0), (0,0,0) в редакторе сцены.

Я уверен, что есть более разумный способ сделать это.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformReset : MonoBehaviour
{
    private Transform LocalTransform;
    private Vector3 InitialPos;
    private Quaternion InitialRot;

    private Vector3 CurrentPos;
    private Quaternion CurrentRot;

    void Start()
    {
        InitialPos = transform.position;
        InitialRot = transform.rotation;       
    }

    public void Reset()
    {
        transform.position = InitialPos;
        transform.rotation = InitialRot;
        Debug.Log("resetting position of " + gameObject.name);
    }
}

эта часть "public void Reset ()" вызывается моим скриптом raycasting. Но я думаю, что проблема заключается в том, что он работает в редакторе сцены прежде, чем когда-либо получит полезное значение «InitialPos».

Благодарим за любую помощь и совет.

1 Ответ

5 голосов
/ 06 ноября 2019

Reset - это сообщение MonoBehaviour, которое двигатель вызывает при определенных условиях. Из документации , выделено мое:

Сброс вызывается, когда пользователь нажимает кнопку Сброс в контекстном меню инспектора или при первом добавлении компонента . Эта функция вызывается только в режиме редактора. Сброс чаще всего используется для предоставления хороших значений по умолчанию в Инспекторе.

По сути, ваше наименование метода вступает в противоречие со встроенным поведением, с которым он не должен иметь ничего общего. Если вы измените имя вашего метода на другое, оно должно работать нормально:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformReset : MonoBehaviour
{
    private Transform LocalTransform;
    private Vector3 InitialPos;
    private Quaternion InitialRot;

    private Vector3 CurrentPos;
    private Quaternion CurrentRot;

    void Start()
    {
        InitialPos = transform.position;
        InitialRot = transform.rotation;       
    }

    public void ResetTransform()
    {
        transform.position = InitialPos;
        transform.rotation = InitialRot;
        Debug.Log("resetting position of " + gameObject.name);
    }
}

А затем в другом классе:

transformResetComponent.ResetTransform();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...