- Home /
How can i check and fire an event when the user look at specific object ?
For example in my case i have a lot of objects moving around up in the sky. I want to make that each time the user look up at the objects to fire the event. For example if i have 60 spheres moving in the sky above the player when he look up and the player look get to see the objects the spheres then fire the event. Not just look up but only if the player see the objects the spheres.
I'm not sure if it's relative to the camera view or it should be something with the character it self face ? The character in my case is ThirdPersonController.
I saw some solutions in the answer in this question
but this is relative to the camera/s view. And i want to use the ThirdPersonCharacter view. My character view is controlled by a child main camera under the ThirdPersonCharacter with a script so i can move the mouse 360 degrees around. So i guess it's relative to this camera. I want when i move the mouse around up and the user see the Spheres it's important to know when he see them and not just to look up then fire the event.
Not sure what event/s to register to and how to fire them .
Not sure how to make "seen" event so only when the user/camera saw the specific object/s then fire the trigger.
This is my camera script:
using UnityEngine;
using System.Collections;
public class CameraScript : MonoBehaviour {
public Transform TargetLookAt;
public float Distance = 5.0f;
public float DistanceMin = 3.0f;
public float DistanceMax = 10.0f;
private float mouseX = 0.0f;
private float mouseY = 0.0f;
private float startingDistance = 0.0f;
private float desiredDistance = 0.0f;
public float X_MouseSensitivity = 5.0f;
public float Y_MouseSensitivity = 5.0f;
public float MouseWheelSensitivity = 5.0f;
public float Y_MinLimit = -40.0f;
public float Y_MaxLimit = 80.0f;
public float DistanceSmooth = 0.05f;
private float velocityDistance = 0.0f;
private Vector3 desiredPosition = Vector3.zero;
public float X_Smooth = 0.05f;
public float Y_Smooth = 0.1f;
private float velX = 0.0f;
private float velY = 0.0f;
private float velZ = 0.0f;
private Vector3 position = Vector3.zero;
//CursorLockMode wantedMode;
void Start (){
Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax);
startingDistance = Distance;
Reset();
//SetCursorState();
//OnGUI();
}
void Update(){
}
void FixedUpdate (){
if (TargetLookAt == null)
return;
HandlePlayerInput();
CalculateDesiredPosition();
UpdatePosition();
}
void HandlePlayerInput (){
float deadZone= 0.01f; // mousewheel deadZone
//if (Input.GetMouseButton(1))
//{
mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity;
mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity;
//}
// this is where the mouseY is limited - Helper script
mouseY = ClampAngle(mouseY, Y_MinLimit, Y_MaxLimit);
// get Mouse Wheel Input
if (Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone)
{
desiredDistance = Mathf.Clamp(Distance - (Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity),
DistanceMin, DistanceMax);
}
}
void CalculateDesiredPosition (){
// Evaluate distance
Distance = Mathf.SmoothDamp(Distance, desiredDistance, ref velocityDistance, DistanceSmooth);
// Calculate desired position -> Note : mouse inputs reversed to align to WorldSpace Axis
desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
}
Vector3 CalculatePosition ( float rotationX , float rotationY , float distance ){
Vector3 direction = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
return TargetLookAt.position + (rotation * direction);
}
void UpdatePosition (){
float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, ref velX, X_Smooth);
float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, ref velY, Y_Smooth);
float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, ref velZ, X_Smooth);
position = new Vector3(posX, posY, posZ);
transform.position = position;
transform.LookAt(TargetLookAt);
}
void Reset (){
mouseX = 0;
mouseY = 10;
Distance = startingDistance;
desiredDistance = Distance;
}
float ClampAngle ( float angle , float min , float max ){
while (angle < -360 || angle > 360)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
}
return Mathf.Clamp(angle, min, max);
}
// Apply requested cursor state
/*void SetCursorState ()
{
Cursor.lockState = wantedMode;
// Hide cursor when locking
Cursor.visible = (CursorLockMode.Locked != wantedMode);
}
void OnGUI ()
{
GUILayout.BeginVertical ();
// Release cursor on escape keypress
if (Input.GetKeyDown (KeyCode.Escape))
Cursor.lockState = wantedMode = CursorLockMode.None;
switch (Cursor.lockState) {
case CursorLockMode.None:
GUILayout.Label ("Cursor is normal");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
case CursorLockMode.Confined:
GUILayout.Label ("Cursor is confined");
if (GUILayout.Button ("Lock cursor"))
wantedMode = CursorLockMode.Locked;
if (GUILayout.Button ("Release cursor"))
wantedMode = CursorLockMode.None;
break;
case CursorLockMode.Locked:
GUILayout.Label ("Cursor is locked");
if (GUILayout.Button ("Unlock cursor"))
wantedMode = CursorLockMode.None;
if (GUILayout.Button ("Confine cursor"))
wantedMode = CursorLockMode.Confined;
break;
}
GUILayout.EndVertical ();
SetCursorState ();
}*/
}