Страница 1 из 2

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

СообщениеДобавлено: 15 ноя 2018, 19:40
tietan
Народ, подскажите: на предмете висит скрипт который при 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();

        }
    }

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

СообщениеДобавлено: 15 ноя 2018, 22:13
Heliosis
Можно сделать отдельный метод в этом скрипте, и когда ты после Instantiate включаешь этот скрипт, вызывать этот метод вместо OnEnable.
Или нужно именно OnEnable?

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

СообщениеДобавлено: 16 ноя 2018, 03:05
tietan
Heliosis писал(а):Можно сделать отдельный метод в этом скрипте, и когда ты после Instantiate включаешь этот скрипт, вызывать этот метод вместо OnEnable.
Или нужно именно OnEnable?


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

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

СообщениеДобавлено: 16 ноя 2018, 11:51
Friend123
Мне кажется, что при Instantiate OnEnable не сработает (не помню если честно, надо проверять), а вот если запихать код в Awake/Start, то сработает
Да и зачем постоянно дергать скрипт вкл/выкл? По-другому разве нельзя обойтись? Тот же пул сделать и там как раз будут работать 2 метода OnEnable и OnDisable, это удобнее, плюс производительность выше.

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

СообщениеДобавлено: 16 ноя 2018, 14:06
lawson
Мне кажется, что при Instantiate OnEnable не сработает
почему это не сработает?

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

СообщениеДобавлено: 16 ноя 2018, 15:50
Friend123
lawson писал(а):
Мне кажется, что при Instantiate OnEnable не сработает
почему это не сработает?

Затупил, всё сработает.

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

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

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

СообщениеДобавлено: 16 ноя 2018, 21:08
1max1
Думаю OnEnable отрабатывает сразу же после инстанса, а уже после него ты в коде задаешь нулевые координаты, по этому и нулевые они.

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

СообщениеДобавлено: 16 ноя 2018, 23:00
Friend123
tietan писал(а):я юзаю метод OnEnable, в котором прописанны нужные мне координаты, путем включения/отключения скрипта

Попробуй не в OnEnable, а в Awake это сделать... я не так выразился изначально - я не уверен про срабатывание OnEnable не при появлении объекта, а при отключении/включении скрипта..
При всем при этом, юзай пул объектов, ну будет таких проблем

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

СообщениеДобавлено: 16 ноя 2018, 23:13
1max1
Авейк сработает точно после инстанса, а по коду дальше у него идет обнуление координат, так что лучше впихнуть всё в Start, он сработает в следующем кадре если не ошибаюсь и всё будет ок.

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

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

Нет, неверно.. Последовательность такая: Awake -> OnEnable -> Start, т.е. последовательно, т.е. что в любую из них метод пихнешь - сработает.

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

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

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

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

Согласен, но у него дело не в кадрах :) А в коде и структуре вызовов... надо там копать

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

СообщениеДобавлено: 17 ноя 2018, 09:26
lawson
старт - в следующем кадре.

не большое уточнение: перед первым кадром

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

СообщениеДобавлено: 17 ноя 2018, 13:26
tietan
все нашел косяк, спасибо всем)))

Синтаксис:
Используется 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));
    }
   

   
}