• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Due problemi con Unity
#1
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
 
Rispondi
#2
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
 
Rispondi
#3
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
 
Rispondi
#4
il PROBLEMA 1 l'ho risolto (benché debba perfezionarlo), mentre il PROBLEMA 2 ancora sussiste
 
Rispondi
#5
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
 
Rispondi
#6
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
 
Rispondi
#7
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.
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  problema con unity non spara thespeedkiller01 0 342 21-05-2017, 10:15 PM
Ultimo messaggio: thespeedkiller01
  Informazioni creazione videogioco con unity Fabrysmock 9 1,042 01-03-2017, 07:41 PM
Ultimo messaggio: Fabrysmock
  Help ADS/pubblicità con Unity Parzival 2 538 21-02-2017, 10:53 PM
Ultimo messaggio: Parzival
Sad Problemi nel build del gioco MrCraft99x5 1 572 19-02-2016, 09:06 AM
Ultimo messaggio: Master Gabriel
Wink Problemi di assi su Unity alessiobb3b 9 1,129 12-01-2016, 10:28 PM
Ultimo messaggio: alessiobb3b
  Errore nell'importazione di un FBX creato con Cinema4D in Unity SteeBono 4 980 22-10-2015, 12:28 PM
Ultimo messaggio: SteeBono
  Luci pesanti su gioco VR per Android con Unity Refref1990 1 884 13-08-2015, 11:20 PM
Ultimo messaggio: eoasier
  Problemi con personaggio catun22 6 1,489 21-12-2014, 11:05 AM
Ultimo messaggio: Master Gabriel
  dubbio su tipologia di gioco con unity catun22 5 1,344 02-09-2013, 11:11 AM
Ultimo messaggio: yuriiacuzzo
  problema chiamata void in due script adriqueru99 5 1,140 04-07-2013, 10:51 AM
Ultimo messaggio: adriqueru99

Vai al forum:


Browsing: 6 Ospite(i)