using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TerrainCam : MonoBehaviour { public Camera cam; private Vector3 offset; public Vector3 target; public float scaleMin = 40; public float scaleMax = 60; public float scaleValue = 60; public float rotateValueX = 0; public float rotateValueY = 0; public float updownRot = 15; public Quaternion rotationTarget = Quaternion.identity; public static bool Active { get; set; } = true; private void Update() { offset = new Vector3(0, Mathf.Pow(1 - updownRot / 90, 4) * 22f, 0); Vector3 targetH = target + Vector3.up * 1000; Ray ray = new Ray(targetH, -Vector3.up * 5000); if (Physics.Raycast(ray, out var hit, 10000, 1 << 8)) { target = hit.point; } else { target = new Vector3(0, 10, 0); } float mouseX = SInput.GetAxis("Mouse X"); float mouseY = SInput.GetAxis("Mouse Y"); if ((Input.GetMouseButton(0) && !SInput.IsTouch2AndControlRot) && Active) { float mv = (scaleValue - scaleMin) / scaleMax + 0.3f; target += cam.transform.right * -mouseX * 1100 * Time.deltaTime * mv; target += transform.forward * -mouseY * 1100 * Time.deltaTime * mv; } transform.position = Vector3.Lerp(transform.position, target + offset, Time.deltaTime * 3); if (Active) { float msw = SInput.GetAxis("Mouse ScrollWheel"); scaleValue -= msw * 7500 * Time.deltaTime; scaleValue = Mathf.Clamp(scaleValue, scaleMin, scaleMax); } float centerOffset = -16; cam.transform.localPosition = Vector3.Lerp(cam.transform.localPosition, new Vector3(0, Mathf.Tan(updownRot * Mathf.PI / 180), -1).normalized * scaleValue * 2f, Time.deltaTime * 6); if ((Input.GetMouseButton(1) || SInput.IsTouch2AndControlRot) && Active) { if (rotateValueY * mouseX < 0) rotateValueY = 0; rotateValueY += Time.deltaTime * mouseX * 20; rotateValueY = Mathf.Clamp(rotateValueY, -8, 8); updownRot -= Time.deltaTime * mouseY * 200; updownRot = Mathf.Clamp(updownRot, 15, 80); if (rotateValueX * mouseY < 0) rotateValueX = 0; rotateValueX += Time.deltaTime * -mouseY * 200; rotateValueX = Mathf.Clamp(rotateValueX, -8, 8); } rotateValueY = Mathf.Lerp(rotateValueY, 0, Time.deltaTime * 3f); rotateValueX = Mathf.Lerp(rotateValueX, 0, Time.deltaTime * 3f); if (rotateValueY != 0) { Quaternion rot = Quaternion.Euler(0, rotateValueY * Time.deltaTime * 60, 0); rotationTarget *= rot; transform.localRotation *= rot; } //if (rotateValueX != 0) //{ // updownRot += rotateValueX; // updownRot = Mathf.Clamp(updownRot, 0.0f, 89.5f); //} transform.localRotation = Quaternion.Lerp(transform.localRotation, rotationTarget, Time.deltaTime * 6); cam.transform.localRotation = Quaternion.Lerp(cam.transform.localRotation, Quaternion.Euler(new Vector3(updownRot, 0, 0)), Time.deltaTime * 6); } public void Set(Vector3 target, Vector3 rotationTarget, float scaleValue, float updownRot) { this.target = target; this.updownRot = updownRot; this.rotationTarget = Quaternion.Euler(rotationTarget); this.scaleValue = scaleValue; } public void Set(Vector3 target, Quaternion rotationTarget, float scaleValue, float updownRot) { this.target = target; this.updownRot = updownRot; this.rotationTarget = rotationTarget; this.scaleValue = scaleValue; } public void SetLook(Vector3 target, float scaleValue) { this.target = target; this.scaleValue = scaleValue; } }