aha
This commit is contained in:
@ -0,0 +1,292 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
|
||||
namespace TMPro.Examples
|
||||
{
|
||||
|
||||
public class CameraController : MonoBehaviour
|
||||
{
|
||||
public enum CameraModes { Follow, Isometric, Free }
|
||||
|
||||
private Transform cameraTransform;
|
||||
private Transform dummyTarget;
|
||||
|
||||
public Transform CameraTarget;
|
||||
|
||||
public float FollowDistance = 30.0f;
|
||||
public float MaxFollowDistance = 100.0f;
|
||||
public float MinFollowDistance = 2.0f;
|
||||
|
||||
public float ElevationAngle = 30.0f;
|
||||
public float MaxElevationAngle = 85.0f;
|
||||
public float MinElevationAngle = 0f;
|
||||
|
||||
public float OrbitalAngle = 0f;
|
||||
|
||||
public CameraModes CameraMode = CameraModes.Follow;
|
||||
|
||||
public bool MovementSmoothing = true;
|
||||
public bool RotationSmoothing = false;
|
||||
private bool previousSmoothing;
|
||||
|
||||
public float MovementSmoothingValue = 25f;
|
||||
public float RotationSmoothingValue = 5.0f;
|
||||
|
||||
public float MoveSensitivity = 2.0f;
|
||||
|
||||
private Vector3 currentVelocity = Vector3.zero;
|
||||
private Vector3 desiredPosition;
|
||||
private float mouseX;
|
||||
private float mouseY;
|
||||
private Vector3 moveVector;
|
||||
private float mouseWheel;
|
||||
|
||||
// Controls for Touches on Mobile devices
|
||||
//private float prev_ZoomDelta;
|
||||
|
||||
|
||||
private const string event_SmoothingValue = "Slider - Smoothing Value";
|
||||
private const string event_FollowDistance = "Slider - Camera Zoom";
|
||||
|
||||
|
||||
void Awake()
|
||||
{
|
||||
if (QualitySettings.vSyncCount > 0)
|
||||
Application.targetFrameRate = 60;
|
||||
else
|
||||
Application.targetFrameRate = -1;
|
||||
|
||||
if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)
|
||||
Input.simulateMouseWithTouches = false;
|
||||
|
||||
cameraTransform = transform;
|
||||
previousSmoothing = MovementSmoothing;
|
||||
}
|
||||
|
||||
|
||||
// Use this for initialization
|
||||
void Start()
|
||||
{
|
||||
if (CameraTarget == null)
|
||||
{
|
||||
// If we don't have a target (assigned by the player, create a dummy in the center of the scene).
|
||||
dummyTarget = new GameObject("Camera Target").transform;
|
||||
CameraTarget = dummyTarget;
|
||||
}
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void LateUpdate()
|
||||
{
|
||||
GetPlayerInput();
|
||||
|
||||
|
||||
// Check if we still have a valid target
|
||||
if (CameraTarget != null)
|
||||
{
|
||||
if (CameraMode == CameraModes.Isometric)
|
||||
{
|
||||
desiredPosition = CameraTarget.position + Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * new Vector3(0, 0, -FollowDistance);
|
||||
}
|
||||
else if (CameraMode == CameraModes.Follow)
|
||||
{
|
||||
desiredPosition = CameraTarget.position + CameraTarget.TransformDirection(Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * (new Vector3(0, 0, -FollowDistance)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Free Camera implementation
|
||||
}
|
||||
|
||||
if (MovementSmoothing == true)
|
||||
{
|
||||
// Using Smoothing
|
||||
cameraTransform.position = Vector3.SmoothDamp(cameraTransform.position, desiredPosition, ref currentVelocity, MovementSmoothingValue * Time.fixedDeltaTime);
|
||||
//cameraTransform.position = Vector3.Lerp(cameraTransform.position, desiredPosition, Time.deltaTime * 5.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not using Smoothing
|
||||
cameraTransform.position = desiredPosition;
|
||||
}
|
||||
|
||||
if (RotationSmoothing == true)
|
||||
cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, Quaternion.LookRotation(CameraTarget.position - cameraTransform.position), RotationSmoothingValue * Time.deltaTime);
|
||||
else
|
||||
{
|
||||
cameraTransform.LookAt(CameraTarget);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GetPlayerInput()
|
||||
{
|
||||
moveVector = Vector3.zero;
|
||||
|
||||
// Check Mouse Wheel Input prior to Shift Key so we can apply multiplier on Shift for Scrolling
|
||||
mouseWheel = Input.GetAxis("Mouse ScrollWheel");
|
||||
|
||||
float touchCount = Input.touchCount;
|
||||
|
||||
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) || touchCount > 0)
|
||||
{
|
||||
mouseWheel *= 10;
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.I))
|
||||
CameraMode = CameraModes.Isometric;
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.F))
|
||||
CameraMode = CameraModes.Follow;
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.S))
|
||||
MovementSmoothing = !MovementSmoothing;
|
||||
|
||||
|
||||
// Check for right mouse button to change camera follow and elevation angle
|
||||
if (Input.GetMouseButton(1))
|
||||
{
|
||||
mouseY = Input.GetAxis("Mouse Y");
|
||||
mouseX = Input.GetAxis("Mouse X");
|
||||
|
||||
if (mouseY > 0.01f || mouseY < -0.01f)
|
||||
{
|
||||
ElevationAngle -= mouseY * MoveSensitivity;
|
||||
// Limit Elevation angle between min & max values.
|
||||
ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);
|
||||
}
|
||||
|
||||
if (mouseX > 0.01f || mouseX < -0.01f)
|
||||
{
|
||||
OrbitalAngle += mouseX * MoveSensitivity;
|
||||
if (OrbitalAngle > 360)
|
||||
OrbitalAngle -= 360;
|
||||
if (OrbitalAngle < 0)
|
||||
OrbitalAngle += 360;
|
||||
}
|
||||
}
|
||||
|
||||
// Get Input from Mobile Device
|
||||
if (touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
|
||||
{
|
||||
Vector2 deltaPosition = Input.GetTouch(0).deltaPosition;
|
||||
|
||||
// Handle elevation changes
|
||||
if (deltaPosition.y > 0.01f || deltaPosition.y < -0.01f)
|
||||
{
|
||||
ElevationAngle -= deltaPosition.y * 0.1f;
|
||||
// Limit Elevation angle between min & max values.
|
||||
ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);
|
||||
}
|
||||
|
||||
|
||||
// Handle left & right
|
||||
if (deltaPosition.x > 0.01f || deltaPosition.x < -0.01f)
|
||||
{
|
||||
OrbitalAngle += deltaPosition.x * 0.1f;
|
||||
if (OrbitalAngle > 360)
|
||||
OrbitalAngle -= 360;
|
||||
if (OrbitalAngle < 0)
|
||||
OrbitalAngle += 360;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for left mouse button to select a new CameraTarget or to reset Follow position
|
||||
if (Input.GetMouseButton(0))
|
||||
{
|
||||
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
||||
RaycastHit hit;
|
||||
|
||||
if (Physics.Raycast(ray, out hit, 300, 1 << 10 | 1 << 11 | 1 << 12 | 1 << 14))
|
||||
{
|
||||
if (hit.transform == CameraTarget)
|
||||
{
|
||||
// Reset Follow Position
|
||||
OrbitalAngle = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
CameraTarget = hit.transform;
|
||||
OrbitalAngle = 0;
|
||||
MovementSmoothing = previousSmoothing;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (Input.GetMouseButton(2))
|
||||
{
|
||||
if (dummyTarget == null)
|
||||
{
|
||||
// We need a Dummy Target to anchor the Camera
|
||||
dummyTarget = new GameObject("Camera Target").transform;
|
||||
dummyTarget.position = CameraTarget.position;
|
||||
dummyTarget.rotation = CameraTarget.rotation;
|
||||
CameraTarget = dummyTarget;
|
||||
previousSmoothing = MovementSmoothing;
|
||||
MovementSmoothing = false;
|
||||
}
|
||||
else if (dummyTarget != CameraTarget)
|
||||
{
|
||||
// Move DummyTarget to CameraTarget
|
||||
dummyTarget.position = CameraTarget.position;
|
||||
dummyTarget.rotation = CameraTarget.rotation;
|
||||
CameraTarget = dummyTarget;
|
||||
previousSmoothing = MovementSmoothing;
|
||||
MovementSmoothing = false;
|
||||
}
|
||||
|
||||
|
||||
mouseY = Input.GetAxis("Mouse Y");
|
||||
mouseX = Input.GetAxis("Mouse X");
|
||||
|
||||
moveVector = cameraTransform.TransformDirection(mouseX, mouseY, 0);
|
||||
|
||||
dummyTarget.Translate(-moveVector, Space.World);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check Pinching to Zoom in - out on Mobile device
|
||||
if (touchCount == 2)
|
||||
{
|
||||
Touch touch0 = Input.GetTouch(0);
|
||||
Touch touch1 = Input.GetTouch(1);
|
||||
|
||||
Vector2 touch0PrevPos = touch0.position - touch0.deltaPosition;
|
||||
Vector2 touch1PrevPos = touch1.position - touch1.deltaPosition;
|
||||
|
||||
float prevTouchDelta = (touch0PrevPos - touch1PrevPos).magnitude;
|
||||
float touchDelta = (touch0.position - touch1.position).magnitude;
|
||||
|
||||
float zoomDelta = prevTouchDelta - touchDelta;
|
||||
|
||||
if (zoomDelta > 0.01f || zoomDelta < -0.01f)
|
||||
{
|
||||
FollowDistance += zoomDelta * 0.25f;
|
||||
// Limit FollowDistance between min & max values.
|
||||
FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Check MouseWheel to Zoom in-out
|
||||
if (mouseWheel < -0.01f || mouseWheel > 0.01f)
|
||||
{
|
||||
|
||||
FollowDistance -= mouseWheel * 5.0f;
|
||||
// Limit FollowDistance between min & max values.
|
||||
FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user