using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private Item netItem; public bool ForceLocal; public bool IsLocal { get { return ForceLocal || (netItem != null && netItem.IsLocal); } } private UIHookup uiHookup; private CharacterController charControl; private PlayerFade playerFade; private Vector3 fadeSpot; private Camera playerFadeCam; // Start is called before the first frame update void Awake() { netItem = GetComponentInChildren<Item>(); castLight = transform.Find("CastLight").gameObject; uiHookup = FindObjectOfType<UIHookup>(); if (ForceLocal) { StartLocal(); } } public GameObject PlayerMesh; private GameObject castLight; private float bottomOffset; void StartLocal() { castLight.SetActive(true); charControl = GetComponentInChildren<CharacterController>(); charControl.enabled = true; bottomOffset = -charControl.center.y + charControl.height * 0.5f; playerFade = FindObjectOfType<PlayerFade>(); if (playerFade != null) { playerFadeCam = playerFade.GetComponent<Camera>(); fadeSpot = transform.position; if (playerFadeCam != null) { // shift instantly in the XZ plane playerFadeCam.transform.position = SlowFollowXZ(transform.position, playerFadeCam.transform.position, 1); } } } void StartRemote() { if (PlayerMesh != null) { foreach (MeshRenderer mr in PlayerMesh.GetComponentsInChildren<MeshRenderer>()) { if (mr.sharedMaterial.name == "Player") { Material m = mr.material; m.DisableKeyword("_EMISSION"); m.globalIlluminationFlags = MaterialGlobalIlluminationFlags.EmissiveIsBlack; m.SetColor("_EmissionColor", Color.black); } } } } public float Speed; private List<Touch> touches = new List<Touch>(); public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; private float viewRadius = 4; public float CamFollowAmount = 0.9f; public float SpotFollowAmount = 0.95f; private Vector3 SlowFollowXZ(Vector3 target, Vector3 current, float factor) { Vector2 currentXZ = new Vector2(current.x, current.z); Vector2 targetXZ = new Vector2(target.x, target.z); float followThisFrame = 1 - Mathf.Pow(1 - factor, Time.deltaTime); Vector2 newCurrentXZ = targetXZ * followThisFrame + currentXZ * (1 - followThisFrame); current.x = newCurrentXZ.x; current.z = newCurrentXZ.y; return current; } // Update is called once per frame void Update() { if (IsLocal && charControl != null) { RaycastHit hit; if (Physics.Raycast(new Ray(transform.position, Vector3.down), out hit, 10f)) { Vector3 pos = transform.position; pos.y = hit.point.y + (bottomOffset + 0.01f); transform.position = pos; } Vector3 wantMove = new Vector3(); if (Input.GetKey(KeyCode.UpArrow)) { wantMove.z += 1; } if (Input.GetKey(KeyCode.DownArrow)) { wantMove.z -= 1; } if (Input.GetKey(KeyCode.RightArrow)) { wantMove.x += 1; } if (Input.GetKey(KeyCode.LeftArrow)) { wantMove.x -= 1; } wantMove.Normalize(); if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) { float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; touches.Clear(); touches.AddRange(Input.touches); if (Input.GetMouseButton(0)) { touches.Add(new Touch { position = Input.mousePosition }); } foreach (Touch touch in touches) { Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); } } } if (playerFade != null && playerFadeCam != null) { Vector3 playerScreen3 = playerFadeCam.WorldToScreenPoint(fadeSpot); Vector3 edgeScreen3 = playerFadeCam.WorldToScreenPoint(fadeSpot + playerFadeCam.transform.right * viewRadius); Vector2 playerScreen2 = new Vector2(playerScreen3.x / playerFadeCam.pixelWidth, playerScreen3.y / playerFadeCam.pixelHeight); Vector2 edgeScreen2 = new Vector2(edgeScreen3.x / playerFadeCam.pixelWidth, edgeScreen3.y / playerFadeCam.pixelHeight); float radius = (edgeScreen2 - playerScreen2).magnitude; playerFade.SetFadeParams(radius, playerScreen2); Vector3 camPos = playerFadeCam.transform.position; Vector2 camXZ = new Vector2(camPos.x, camPos.z); Vector2 playerXZ = new Vector2(transform.position.x, transform.position.z); float followThisFrame = 1 - Mathf.Pow(1 - CamFollowAmount, Time.deltaTime); Vector2 newCamXZ = playerXZ * followThisFrame + camXZ * (1 - followThisFrame); camPos.x = newCamXZ.x; camPos.z = newCamXZ.y; playerFadeCam.transform.position = SlowFollowXZ(transform.position, playerFadeCam.transform.position, SpotFollowAmount); fadeSpot = SlowFollowXZ(transform.position, fadeSpot, CamFollowAmount); } if (wantMove.sqrMagnitude > 0) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; CollisionFlags flags = charControl.Move(wantMove); } } } }