mirror of
https://github.com/FriendshipIsEpic/FiE-Game.git
synced 2024-11-27 15:57:59 +01:00
232 lines
6 KiB
C#
232 lines
6 KiB
C#
|
using UnityEngine;
|
||
|
|
||
|
namespace Fie.Title
|
||
|
{
|
||
|
public class FieTitleCameraOrbit : MonoBehaviour
|
||
|
{
|
||
|
public GameObject target;
|
||
|
|
||
|
public Transform targetFocus;
|
||
|
|
||
|
public float distance = 1f;
|
||
|
|
||
|
[Range(0.1f, 4f)]
|
||
|
public float ZoomWheelSpeed = 4f;
|
||
|
|
||
|
public float minDistance = 0.5f;
|
||
|
|
||
|
public float maxDistance = 10f;
|
||
|
|
||
|
public float xSpeed = 250f;
|
||
|
|
||
|
public float ySpeed = 120f;
|
||
|
|
||
|
public float xObjSpeed = 250f;
|
||
|
|
||
|
public float yObjSpeed = 120f;
|
||
|
|
||
|
public float yMinLimit = -20f;
|
||
|
|
||
|
public float yMaxLimit = 80f;
|
||
|
|
||
|
private float x;
|
||
|
|
||
|
private float y;
|
||
|
|
||
|
private float normal_angle;
|
||
|
|
||
|
private float cur_distance;
|
||
|
|
||
|
private float cur_xSpeed;
|
||
|
|
||
|
private float cur_ySpeed;
|
||
|
|
||
|
private float req_xSpeed;
|
||
|
|
||
|
private float req_ySpeed;
|
||
|
|
||
|
private float cur_ObjxSpeed;
|
||
|
|
||
|
private float cur_ObjySpeed;
|
||
|
|
||
|
private float req_ObjxSpeed;
|
||
|
|
||
|
private float req_ObjySpeed;
|
||
|
|
||
|
private bool DraggingObject;
|
||
|
|
||
|
private bool lastLMBState;
|
||
|
|
||
|
private Collider[] surfaceColliders;
|
||
|
|
||
|
private float bounds_MaxSize = 20f;
|
||
|
|
||
|
[HideInInspector]
|
||
|
public bool disableSteering;
|
||
|
|
||
|
private void Start()
|
||
|
{
|
||
|
Vector3 eulerAngles = base.transform.eulerAngles;
|
||
|
x = eulerAngles.y;
|
||
|
y = eulerAngles.x;
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
public void DisableSteering(bool state)
|
||
|
{
|
||
|
disableSteering = state;
|
||
|
}
|
||
|
|
||
|
public void Reset()
|
||
|
{
|
||
|
lastLMBState = Input.GetMouseButton(0);
|
||
|
disableSteering = false;
|
||
|
cur_distance = distance;
|
||
|
cur_xSpeed = 0f;
|
||
|
cur_ySpeed = 0f;
|
||
|
req_xSpeed = 0f;
|
||
|
req_ySpeed = 0f;
|
||
|
surfaceColliders = null;
|
||
|
cur_ObjxSpeed = 0f;
|
||
|
cur_ObjySpeed = 0f;
|
||
|
req_ObjxSpeed = 0f;
|
||
|
req_ObjySpeed = 0f;
|
||
|
if ((bool)target)
|
||
|
{
|
||
|
Renderer[] componentsInChildren = target.GetComponentsInChildren<Renderer>();
|
||
|
Bounds bounds = default(Bounds);
|
||
|
bool flag = false;
|
||
|
Renderer[] array = componentsInChildren;
|
||
|
foreach (Renderer renderer in array)
|
||
|
{
|
||
|
if (!flag)
|
||
|
{
|
||
|
flag = true;
|
||
|
bounds = renderer.bounds;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bounds.Encapsulate(renderer.bounds);
|
||
|
}
|
||
|
}
|
||
|
Vector3 size = bounds.size;
|
||
|
float num = (!(size.x > size.y)) ? size.y : size.x;
|
||
|
num = (bounds_MaxSize = ((!(size.z > num)) ? num : size.z));
|
||
|
cur_distance += bounds_MaxSize * 1.2f;
|
||
|
surfaceColliders = target.GetComponentsInChildren<Collider>();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void LateUpdate()
|
||
|
{
|
||
|
if ((bool)target && (bool)targetFocus)
|
||
|
{
|
||
|
if (!lastLMBState && Input.GetMouseButton(0))
|
||
|
{
|
||
|
DraggingObject = false;
|
||
|
if (surfaceColliders != null)
|
||
|
{
|
||
|
RaycastHit hitInfo = default(RaycastHit);
|
||
|
Ray ray = UnityEngine.Camera.main.ScreenPointToRay(Input.mousePosition);
|
||
|
Collider[] array = surfaceColliders;
|
||
|
foreach (Collider collider in array)
|
||
|
{
|
||
|
if (collider.Raycast(ray, out hitInfo, float.PositiveInfinity))
|
||
|
{
|
||
|
DraggingObject = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (lastLMBState && !Input.GetMouseButton(0))
|
||
|
{
|
||
|
DraggingObject = false;
|
||
|
}
|
||
|
lastLMBState = Input.GetMouseButton(0);
|
||
|
if (DraggingObject)
|
||
|
{
|
||
|
if (Input.GetMouseButton(0) && !disableSteering)
|
||
|
{
|
||
|
req_ObjxSpeed += (Input.GetAxis("Mouse X") * xObjSpeed * 0.02f - req_ObjxSpeed) * Time.deltaTime * 10f;
|
||
|
req_ObjySpeed += (Input.GetAxis("Mouse Y") * yObjSpeed * 0.02f - req_ObjySpeed) * Time.deltaTime * 10f;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
req_ObjxSpeed += (0f - req_ObjxSpeed) * Time.deltaTime * 4f;
|
||
|
req_ObjySpeed += (0f - req_ObjySpeed) * Time.deltaTime * 4f;
|
||
|
}
|
||
|
req_xSpeed += (0f - req_xSpeed) * Time.deltaTime * 4f;
|
||
|
req_ySpeed += (0f - req_ySpeed) * Time.deltaTime * 4f;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (Input.GetMouseButton(0) && !disableSteering)
|
||
|
{
|
||
|
req_xSpeed += (Input.GetAxis("Mouse X") * xSpeed * 0.02f - req_xSpeed) * Time.deltaTime * 10f;
|
||
|
req_ySpeed += (Input.GetAxis("Mouse Y") * ySpeed * 0.02f - req_ySpeed) * Time.deltaTime * 10f;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
req_xSpeed += (0f - req_xSpeed) * Time.deltaTime * 4f;
|
||
|
req_ySpeed += (0f - req_ySpeed) * Time.deltaTime * 4f;
|
||
|
}
|
||
|
req_ObjxSpeed += (0f - req_ObjxSpeed) * Time.deltaTime * 4f;
|
||
|
req_ObjySpeed += (0f - req_ObjySpeed) * Time.deltaTime * 4f;
|
||
|
}
|
||
|
distance -= Input.GetAxis("Mouse ScrollWheel") * ZoomWheelSpeed;
|
||
|
distance = Mathf.Clamp(distance, minDistance, maxDistance);
|
||
|
cur_ObjxSpeed += (req_ObjxSpeed - cur_ObjxSpeed) * Time.deltaTime * 20f;
|
||
|
cur_ObjySpeed += (req_ObjySpeed - cur_ObjySpeed) * Time.deltaTime * 20f;
|
||
|
target.transform.RotateAround(targetFocus.position, Vector3.Cross(targetFocus.position - base.transform.position, base.transform.right), 0f - cur_ObjxSpeed);
|
||
|
target.transform.RotateAround(targetFocus.position, Vector3.Cross(targetFocus.position - base.transform.position, base.transform.up), 0f - cur_ObjySpeed);
|
||
|
cur_xSpeed += (req_xSpeed - cur_xSpeed) * Time.deltaTime * 20f;
|
||
|
cur_ySpeed += (req_ySpeed - cur_ySpeed) * Time.deltaTime * 20f;
|
||
|
x += cur_xSpeed;
|
||
|
y -= cur_ySpeed;
|
||
|
y = ClampAngle(y, yMinLimit + normal_angle, yMaxLimit + normal_angle);
|
||
|
if (surfaceColliders != null)
|
||
|
{
|
||
|
RaycastHit hitInfo2 = default(RaycastHit);
|
||
|
Vector3 vector = Vector3.Normalize(targetFocus.position - base.transform.position);
|
||
|
float num = 0.01f;
|
||
|
bool flag = false;
|
||
|
Collider[] array2 = surfaceColliders;
|
||
|
foreach (Collider collider2 in array2)
|
||
|
{
|
||
|
if (collider2.Raycast(new Ray(base.transform.position - vector * bounds_MaxSize, vector), out hitInfo2, float.PositiveInfinity))
|
||
|
{
|
||
|
num = Mathf.Max(Vector3.Distance(hitInfo2.point, targetFocus.position) + distance, num);
|
||
|
flag = true;
|
||
|
}
|
||
|
}
|
||
|
if (flag)
|
||
|
{
|
||
|
cur_distance += (num - cur_distance) * Time.deltaTime * 4f;
|
||
|
}
|
||
|
}
|
||
|
Quaternion rotation = Quaternion.Euler(y, x, 0f);
|
||
|
base.transform.rotation = rotation;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private 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 set_normal_angle(float a)
|
||
|
{
|
||
|
normal_angle = a;
|
||
|
}
|
||
|
}
|
||
|
}
|