16-04-2016, 09:25 AM
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
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:
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.
Scusate per il topic chilometrico ma ho preferito creare un topic per due problemi anziché due topic per ognuno. Spero che possiate aiutarmi
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