Newer
Older
BlackoutClient / Assets / Player / Player.cs
@Mark Mark on 2 Feb 2020 6 KB Work on graphics
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);
            }

            
        }
    }
}