Creare Videogiochi - Game Developer
Due problemi con Unity - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Unity3D Italia (https://www.making-videogames.net/giochi/Forum-Unity3D-Italia)
+--- Forum: Richieste di Aiuto per Unity 3D (https://www.making-videogames.net/giochi/Forum-Richieste-di-Aiuto-per-Unity-3D)
+--- Discussione: Due problemi con Unity (/thread-Due-problemi-con-Unity)



Due problemi con Unity - 93sunderland - 16-04-2016

Lo so che vi sto tartassando di domande, ma visto che nemmeno il forum ufficiale di Unity mi risponde allora sono sempre costretto a rompervi le palle  Big Grin

PROBLEMA 1:
Ho creato un trigger che fa partire un susseguirsi di animazioni e di rotazioni della MainCamera. Il problema è che al momento della fine di tutti questi eventi vorrei che la MainCamera si posizionasse in una posizione diversa da quella iniziale, ma così non accade. Credo di aver individuato già il problema: quando accadono questi eventi ho imposto che la MainCamera rimanga bloccata, ovvero bool blockCamera = true, ma quando finisce tutto la MainCamera potrà di nuovo muoversi, ovvero bool blockCamera false, tuttavia nel momento in cui la MainCamera viene sbloccata, essa ritornerà con la stessa rotazione di partenza e questo causa molti problemi. A questo punto visto che, secondo me, il problema risiede nello script della MainCamera allora ve lo faccio vedere:

Codice:
using UnityEngine;
using System.Collections;

public class CameraMouseLook : MonoBehaviour {

    public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }

    public RotationAxes axes = RotationAxes.MouseXAndY;

    public float sensitivityX = 15F;
    public float sensitivityY = 15F;
    public float minimumX = -360F;
    public float maximumX = 360F;
    public float minimumY = -60F;
    public float maximumY = 60F;
    
    float rotationX = 0F;
    float rotationY = 0F;

    Quaternion originalRotation;

    public Transform lookObject = null;

    public bool lookAtThing = false;
    public bool blockCamera = false;
    public bool showCrosshair = true;

    void Update ()
    {
        if (blockCamera == false)
        {
            if (axes == RotationAxes.MouseXAndY)
            {
                rotationX += Input.GetAxis ("Mouse X") * sensitivityX;
                rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
            
                rotationX = ClampAngle (rotationX, minimumX, maximumX);
                rotationY = ClampAngle (rotationY, minimumY, maximumY);
            
                Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
                Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, -Vector3.right);
            
                transform.localRotation = originalRotation * xQuaternion * yQuaternion;

            } else if (axes == RotationAxes.MouseX) {
                rotationX += Input.GetAxis ("Mouse X") * sensitivityX;
                rotationX = ClampAngle (rotationX, minimumX, maximumX);
            
                Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
                transform.localRotation = originalRotation * xQuaternion;

            } else {
                rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;
                rotationY = ClampAngle (rotationY, minimumY, maximumY);
            
                Quaternion yQuaternion = Quaternion.AngleAxis (-rotationY, Vector3.right);
                transform.localRotation = originalRotation * yQuaternion;
            }
        }
        if (lookAtThing == true)
        {
            transform.LookAt (lookObject);
        }
        if (lookAtThing == false)
        {
            transform.LookAt (null);
        }
    }
    
    void Start ()
    {
        originalRotation = transform.localRotation;
    }
    
    public static float ClampAngle (float angle, float min, float max)
    {
        if (angle < -360F)
        {
            angle += 360F;
        }
        if (angle > 360F)
        {
            angle -= 360F;
        }
        return Mathf.Clamp (angle, min, max);
    }

    public void LookAt ()
    {
        lookAtThing = true;
    }

    public void StopLookAt ()
    {
        lookAtThing = false;
    }

    public void BlockCamera ()
    {
        blockCamera = true;
    }

    public void UnblockCamera ()
    {
        blockCamera = false;
    }

    void OnGUI()
    {
        Crosshair_Changes script = GetComponent<Crosshair_Changes> ();
        Texture icon = script.crosshair;

        if (showCrosshair == true)
        {
            GUI.DrawTexture (new Rect ((Screen.width - icon.width) / 2, (Screen.height - icon.height) / 2, icon.width, icon.height), icon);
        }
    }
}

PROBLEMA 2:
Adesso mi sto occupando dei vari "crosshair", infatti vorrei che inizialmente il crosshair sia solo un pallino al centro, ma quando il Player guarderà verso degli oggetti interagenti allora il crosshair cambierà. Ad esempio ho creato delle porte che, se guardate, faranno variare il crosshair. Tuttavia ho notato che questo script funziona solo per una porta: ho provato a mettere tre porte uguali e con lo stesso script nella scena, ma solamente una di queste farà variare il crosshair. Qua non ho assolutissimamente capito il motivo, infatti vi farò vedere i tre script incriminati: il primo è quello della MainCamera che ho messo qua sopra e infatti si nota il void OnGUI (); il secondo è messo sotto ed è lo script che permette la variazione di crosshair; l'ultimo è solo una parte dello script delle porte che fa vedere quando il crosshair deve cambiare.
Codice:
using UnityEngine;
using System.Collections;

public class Crosshair_Changes : MonoBehaviour {

    public Texture lookNothing;
    public Texture lookOpenableDoor;

    public Texture crosshair = null;

    private bool openableDoor;

    void Awake ()
    {
        crosshair = lookNothing;
    }
        
    void Update ()
    {
        if (openableDoor == true)
        {
            crosshair = lookOpenableDoor;
        }
        else
        {
            crosshair = lookNothing;
        }
    }

    public void ViewOpenableDoor ()
    {
        openableDoor = true;
    }

    public void StopViewOpenableDoor ()
    {
        openableDoor = false;
    }
}

Codice:
void Update ()
    {
        RaycastHit hit;
        ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));

        Crosshair_Changes scriptCam = Camera.main.GetComponent<Crosshair_Changes> ();

        if (interaction == true && Physics.Raycast (ray, out hit) && animationStop == true && hit.transform.name == name)
        {
            scriptCam.ViewOpenableDoor ();

            if (locked == false)
            {
                if (Input.GetKeyDown ("e"))
                {
                    changeDoorState ();
                }
            }
            else if (locked == true && isBreaking == false)
            {
                if (Input.GetKeyDown ("e"))
                {

                }
            }
            else if (locked == true && isBreaking == true)
            {
                if (Input.GetKeyDown ("e"))
                {
                    Breaking_Rotating_Handle breakScript = handle.GetComponent<Breaking_Rotating_Handle> ();
                    breakScript.breakHandle ();
                }
            }
        }
        else
        {
            scriptCam.StopViewOpenableDoor ();
        }
    }


Scusate per il topic chilometrico ma ho preferito creare un topic per due problemi anziché due topic per ognuno. Spero che possiate aiutarmi  Rolleyes


RE: Due problemi con Unity - Blackg96 - 16-04-2016

Non preoccuparti non rompi le scatole a nessuno siamo qui per aiutarvi Big Grin

Prova ad utilizzare i tag invece del name per il problema dei crosshair.

Mentre per il primo problema non so come aiutarti Sad


RE: Due problemi con Unity - 93sunderland - 16-04-2016

anche utilizzando i tag non si risolve il problema
ho notato che il problema è relativo solo al crosshair, infatti ho fatto una prova inserendo un'altra funzione (tipo variando un valore booleano) e il problema non sussiste
praticamente è solo lo script Crosshair_Changes che viene chiamato solo da una porta


RE: Due problemi con Unity - 93sunderland - 17-04-2016

il PROBLEMA 1 l'ho risolto (benché debba perfezionarlo), mentre il PROBLEMA 2 ancora sussiste


RE: Due problemi con Unity - alessiobb3b - 18-04-2016

Codice:
void Fungi()
   {
       Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
       RaycastHit hit;
       if (Physics.Raycast(ray, out hit, 1) && hit.collider.tag == "Door")
       {
           Add.text = "Premi E per aprire la porta";
           crosshair = lookOpenableDoor;
       }
       else
       {
           Add.text = "";
            crosshair = Nothing;
       }

Ok così dovrebe andare se ho capito il tuo problema, con questo script quando il crossair si trova a distanza 1 dalla porta con tag "Door" si attiva il crossair che hai detto tu e se aggiungi alla scena un UI_text la scritta sarà quella che ho inserito. Altrimenti non compare nessuna scritta e il crossair è normale. Fammi sapere se ho risolto il problema
Ciao a presto


RE: Due problemi con Unity - 93sunderland - 19-04-2016

non funziona nemmeno questo purtroppo

la cosa strana è che se inserisco una funzione che fa variare una variabile booleana insieme allo script del crosshair, accade che la variabile booleana varia in modo corretto, quindi con tutte le porte, mentre lo script del crosshair sempre solo per una porta


RE: Due problemi con Unity - 93sunderland - 19-04-2016

Ho risolto il problema: praticamente non mi ero accorto che con quello script, se interagendo con una porta appariva un crosshair, contemporaneamente non interagendo con l'altra porta allora il crosshair scompariva, quindi lo script non funzionava correttamente. Ecco quello modificato

Codice:
void Update ()
    {
        RaycastHit hit;
        ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
        distance = Vector3.Distance (transform.position, Camera.main.transform.position);

        Crosshair_Changes scriptCam = Camera.main.GetComponent<Crosshair_Changes> ();

        if (interaction == true && Physics.Raycast (ray, out hit) && animationStop == true && hit.transform.name == name)
        {
            scriptCam.ViewOpenableDoor ();

            if (locked == false)
            {
                if (Input.GetKeyDown ("e"))
                {
                    changeDoorState ();
                }
            }  
            else if (locked == true && isBreaking == true)
            {
                if (Input.GetKeyDown ("e"))
                {
                    Door_isBreaking breakScript = GetComponent<Door_isBreaking> ();
                    breakScript.Breaking ();
                }
            }
        }
        else if (distance <= 8.0F)
        {
            scriptCam.StopViewOpenableDoor ();
        }
    }

Adesso la funzione che fa scomparire il crosshair, ovvero scriptCam.StopViewOpenableDoor (), parte solo quando la mainCamera si trova all'interno di un certo range da ogni porta, al di là del quale il crosshair non subirà modifiche fino a quando non si interagirà con un'altra porta (o la stessa di prima).

Tutto funziona, ma non so perchè c'è qualcosa che non mi sconfinfera... se per caso questa soluzione potrebbe portare problemi sarei felicissimo di saperlo.