Не срабатывает OnEnable скрипт

Программирование на Юнити.

Не срабатывает OnEnable скрипт

Сообщение tietan 15 ноя 2018, 19:40

Народ, подскажите: на предмете висит скрипт который при onEnable задает localRotation и localPosition объекту. Изначально скрипт у объекта выключен. Но при Instantiate с ресурсов задаю включение скрипта, но почему то изменения localRotation localPosition нее происходит, хотя скрипт считается включенным. Однако стоит только щелкнуть по любому объекту из иерархии как юнька вспоминает что скрипт включен и надо бы его выполнить. В чем может быть причина?
скрипт на предмете
Синтаксис:
Используется csharp
void OnEnable ()
    {
        it = this.gameObject;

        it.transform.localRotation = Quaternion.Euler(x_rot, y_rot, z_rot);

        it.transform.localPosition = new Vector3(x_pos, y_pos, z_pos);
    }
 


и скрипт с Instantiate

Синтаксис:
Используется csharp
void OnTriggerEnter(Collider coll)

    {
        if (coll.GetComponent<CellContainer>() && grabbing != true )
        {

            cell = coll.transform.gameObject;
            if (Input.GetAxis(buttonGrab) == 1 &&  coll.GetComponent<CellContainer>().isFree == false && grabbedObject == null)
            {
               
                Debug.Log("234");
                GameObject newObj = Instantiate(Resources.Load<GameObject>(cell.GetComponent<CellContainer>().pathPrefab));
                grabbedObject = newObj;
                grabbedObject.transform.parent = transform;
                grabbedObject.transform.localPosition = new Vector3(0, 0, 0);
                grabbedObject.transform.localRotation = Quaternion.Euler(0,0,0);
               
                grabbedObject.GetComponent<Rigidbody>().isKinematic = true;
                grabbedObject.GetComponent<tranformPosit>().enabled = true;



            }
            if (grabbing && Input.GetAxis(buttonGrab) < 1) DropObject();

        }
    }
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Не срабатывает OnEnable скрипт

Сообщение Heliosis 15 ноя 2018, 22:13

Можно сделать отдельный метод в этом скрипте, и когда ты после Instantiate включаешь этот скрипт, вызывать этот метод вместо OnEnable.
Или нужно именно OnEnable?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Не срабатывает OnEnable скрипт

Сообщение tietan 16 ноя 2018, 03:05

Heliosis писал(а):Можно сделать отдельный метод в этом скрипте, и когда ты после Instantiate включаешь этот скрипт, вызывать этот метод вместо OnEnable.
Или нужно именно OnEnable?


Да, так как я могу просто выкинуть предмет на сцену и отключить скрипт. Потом снова подобрать и включить и при этом предмет каждый раз будет принимать нужные мне позиции.
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Не срабатывает OnEnable скрипт

Сообщение Friend123 16 ноя 2018, 11:51

Мне кажется, что при Instantiate OnEnable не сработает (не помню если честно, надо проверять), а вот если запихать код в Awake/Start, то сработает
Да и зачем постоянно дергать скрипт вкл/выкл? По-другому разве нельзя обойтись? Тот же пул сделать и там как раз будут работать 2 метода OnEnable и OnDisable, это удобнее, плюс производительность выше.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не срабатывает OnEnable скрипт

Сообщение lawson 16 ноя 2018, 14:06

Мне кажется, что при Instantiate OnEnable не сработает
почему это не сработает?
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Не срабатывает OnEnable скрипт

Сообщение Friend123 16 ноя 2018, 15:50

lawson писал(а):
Мне кажется, что при Instantiate OnEnable не сработает
почему это не сработает?

Затупил, всё сработает.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не срабатывает OnEnable скрипт

Сообщение tietan 16 ноя 2018, 20:37

Проясняю. Я делаю проект для oculuc. У меня есть контроллер Touch (рука то бишь) и есть объекты которые я подбираю или выкидываю. Т к при подборе я делаю объект дочерним и мне нужно чтобы объект лежал в руке в определенных координатах (а не в том положении котором объект был подобран) я юзаю метод OnEnable, в котором прописанны нужные мне координаты, путем включения/отключения скрипта. Если объект лежит на сцене то никаких проблем нет, работает идеально, но при инстансе вот такой вот затуп получается. При этом если поставить сцену на паузу после инстанса и тыкнуть в еирархии на этот объект увидим что скрипт включен, но координаты почему то нулевые. Однако если это сделать без паузы, юнька "вспоминает" и задает указаные координаты. Чтобы не дрочить мозг такой проблемой пока запихал в Update, естественно что работает как надо, + можно прикрутить костыль на проверну нужных координат и отключении скрипта при их соответствии, но хз как это скажется на производительности.
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

Re: Не срабатывает OnEnable скрипт

Сообщение 1max1 16 ноя 2018, 21:08

Думаю OnEnable отрабатывает сразу же после инстанса, а уже после него ты в коде задаешь нулевые координаты, по этому и нулевые они.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Не срабатывает OnEnable скрипт

Сообщение Friend123 16 ноя 2018, 23:00

tietan писал(а):я юзаю метод OnEnable, в котором прописанны нужные мне координаты, путем включения/отключения скрипта

Попробуй не в OnEnable, а в Awake это сделать... я не так выразился изначально - я не уверен про срабатывание OnEnable не при появлении объекта, а при отключении/включении скрипта..
При всем при этом, юзай пул объектов, ну будет таких проблем
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не срабатывает OnEnable скрипт

Сообщение 1max1 16 ноя 2018, 23:13

Авейк сработает точно после инстанса, а по коду дальше у него идет обнуление координат, так что лучше впихнуть всё в Start, он сработает в следующем кадре если не ошибаюсь и всё будет ок.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Не срабатывает OnEnable скрипт

Сообщение Friend123 16 ноя 2018, 23:20

1max1 писал(а):Авейк сработает точно после инстанса, а по коду дальше у него идет обнуление координат, так что лучше впихнуть всё в Start, он сработает в следующем кадре если не ошибаюсь и всё будет ок.

Нет, неверно.. Последовательность такая: Awake -> OnEnable -> Start, т.е. последовательно, т.е. что в любую из них метод пихнешь - сработает.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не срабатывает OnEnable скрипт

Сообщение 1max1 16 ноя 2018, 23:23

Всё верно) (popcorn1)
Методы авейк и старт срабатывают не просто последовательно, авейк - сразу же после инстанса по коду, старт - в следующем кадре.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Не срабатывает OnEnable скрипт

Сообщение Friend123 16 ноя 2018, 23:25

1max1 писал(а):Всё верно) (popcorn1)
Методы авейк и старт срабатывают не просто последовательно, авейк - сразу же после инстанса по коду, старт - в следующем кадре.

Согласен, но у него дело не в кадрах :) А в коде и структуре вызовов... надо там копать
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не срабатывает OnEnable скрипт

Сообщение lawson 17 ноя 2018, 09:26

старт - в следующем кадре.

не большое уточнение: перед первым кадром
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Не срабатывает OnEnable скрипт

Сообщение tietan 17 ноя 2018, 13:26

все нашел косяк, спасибо всем)))

Синтаксис:
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GrabController : MonoBehaviour {

    public OVRInput.Controller controller;
    public string buttonGrab;
    public string Shooting;
    public GameObject grabbedObject;
    public bool grabbing;
    public bool shoot;
    public float grabRadius;
    public LayerMask grabMask;
    private float x;
    public GameObject cell;
   

    private Quaternion LastRotation, currentRotation;

    private void Awake()
    {
       
    }

    void Update()
    {
        if (grabbedObject != null)
        {
            LastRotation = currentRotation;
            currentRotation = grabbedObject.transform.rotation;

        }

        if (!grabbing && Input.GetAxis(buttonGrab) == 1) GrabObject();
        if (grabbing && Input.GetAxis(buttonGrab) < 1) DropObject();

        x += Input.GetAxis(buttonGrab);


    }




    void GrabObject()
    {
        grabbing = true;

        RaycastHit[] hits;

        hits = Physics.SphereCastAll(transform.position, grabRadius, transform.forward, 0f, grabMask);

        if (hits.Length > 0)
        {
            int closestHit = 0;
            for (int i = 0; i < hits.Length; i++)
            {
                if (hits[i].distance < hits[closestHit].distance) closestHit = i;
            }


            grabbedObject = hits[closestHit].transform.gameObject;
            if (grabbedObject.tag != "truck")
            {
                grabbedObject.GetComponent<Rigidbody>().isKinematic = true;
                <span style="color: #0040FF">//grabbedObject.transform.position = transform.position;
               // grabbedObject.transform.rotation = transform.rotation;</span>
                grabbedObject.transform.parent = transform;
                grabbedObject.GetComponent<tranformPosit>().enabled = true;
                if (grabbedObject.tag == "weapon")
                {
                    grabbedObject.GetComponent<WeaponController>().enabled = true;
                    grabbedObject.GetComponent<WeaponController>().Shooting = Shooting;

                }
            }
            if (grabbedObject.tag == "truck")
            {
                Debug.Log ( "pognali");
                //grabbedObject.transform.position = transform.position;
                //grabbedObject.GetComponent<Rigidbody>().isKinematic = true;
                //grabbedObject.transform.rotation = transform.rotation;
                grabbedObject.transform.parent = transform;

            }
           


        }

       

    }

    void DropObject()
    {
        grabbing = false;

        if (grabbedObject != null)
        {
            if (grabbedObject.tag == "weapon")
            {
                grabbedObject.GetComponent<WeaponController>().Shooting = null;
                grabbedObject.GetComponent<WeaponController>().enabled = false;
               

            }

            grabbedObject.GetComponent<tranformPosit>().enabled = false;
            grabbedObject.transform.parent = null;
            grabbedObject.GetComponent<Rigidbody>().isKinematic = false;
            grabbedObject.GetComponent<Rigidbody>().velocity = OVRInput.GetLocalControllerVelocity(controller);
            grabbedObject.GetComponent<Rigidbody>().angularVelocity = GetAngularVelocity();
            grabbedObject = null;

        }  
    }

    void OnTriggerEnter(Collider coll)

    {
        if (coll.GetComponent<CellContainer>() && grabbing != true )
        {
           
            cell = coll.transform.gameObject;
           
            if (Input.GetAxis(buttonGrab) == 1 &&  coll.GetComponent<CellContainer>().isFree == false && grabbedObject == null && coll.GetComponent<CellContainer>().amountItem >= 1)
               {
               
               
                GameObject newObj = Instantiate(Resources.Load<GameObject>(cell.GetComponent<CellContainer>().pathPrefab));
                grabbedObject = newObj;
               
                grabbedObject.transform.parent = transform;
                grabbedObject.GetComponent<Rigidbody>().isKinematic = true;
                grabbedObject.GetComponent<tranformPosit>().enabled = true;

                if (coll.GetComponent<CellContainer>().amountItem > 0)
                {
                    coll.GetComponent<CellContainer>().amountItem--;
                    if (coll.GetComponent<CellContainer>().amountItem == 0)
                    {
                        coll.GetComponent<CellContainer>().pathPrefab = null;
                        coll.GetComponent<CellContainer>().pathPrefabInventory = null;
                        coll.GetComponent<CellContainer>().isFree = true;
                        coll.GetComponent<CellContainer>().nameItem = null;
                        Transform child = coll.GetComponent<CellContainer>().transform.GetChild(0);
                       // GameObject ch = child.gameObject;
                        Destroy(child.gameObject);
                    }
                }


            }
            if (grabbing && Input.GetAxis(buttonGrab) < 1) DropObject();

        }
    }



    Vector3 GetAngularVelocity()
    {
        Quaternion deltaRotation = currentRotation * Quaternion.Inverse(LastRotation);
        return new Vector3(Mathf.DeltaAngle(0, deltaRotation.eulerAngles.x), Mathf.DeltaAngle(0, deltaRotation.eulerAngles.y), Mathf.DeltaAngle(0, deltaRotation.eulerAngles.z));
    }
   

   
}
tietan
UNец
 
Сообщения: 8
Зарегистрирован: 13 ноя 2018, 20:04

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2