OldBlueWater/BlueWater/Assets/02.Scripts/Tycoon/TycoonPlayer.cs
2024-03-03 19:55:46 +09:00

323 lines
12 KiB
C#

using System;
using System.Collections;
using BlueWaterProject.Type;
using PixelCrushers.DialogueSystem;
using SoulGames.EasyGridBuilderPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using DialogueSystemTrigger = PixelCrushers.DialogueSystem.Wrappers.DialogueSystemTrigger;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
[RequireComponent(typeof(Rigidbody))]
public class TycoonPlayer : MonoBehaviour
{
private float characterSpeed;
private PlayerInput playerInput;
private Vector2 movementInput;
private Transform interactionTarget;
private Transform visualLook;
private Animator animator;
private Rigidbody rb;
private ProximitySelector proximitySelector;
public bool IsRuning { get; set; }
public SpriteRenderer spriteRenderer; //TODO : 나중에 스파인으로 바꾸고 삭제
public Sprite sideSprite;
public Sprite backSprite;
public Sprite frontSprite;
public Transform FoodTransform { get; set; }
[SerializeField] public GlobalValue.FoodOnHand FoodOnHand { get; set; }
[SerializeField] public SpriteRenderer FoodVisual { get; set; }
public Transform myShip;
private void Init()
{
characterSpeed = 10;
visualLook = transform.Find("SpumRabbit");
animator = visualLook.GetComponent<Animator>();
rb = GetComponent<Rigidbody>();
spriteRenderer = visualLook.GetComponent<SpriteRenderer>();
playerInput = GetComponent<PlayerInput>();
FoodTransform = transform.Find("Food");
FoodOnHand = GlobalValue.FoodOnHand.NONE;
FoodVisual = FoodTransform.transform.Find("Visual").GetComponent<SpriteRenderer>();
proximitySelector = GetComponent<ProximitySelector>();
IsRuning = false;
}
private void Awake()
{
Init();
}
private void Start()
{
}
private void FixedUpdate()
{
MoveCharacterPlayer();
}
public void OnMove(InputValue value) // WASD
{
movementInput = value.Get<Vector2>();
}
private void OnMouse0(InputValue value)
{
}
private void OnInteraction(InputValue value)
{
if (GameManager.Inst.IsBuildMode)
{
var buildListPopup = UiManager.Inst.TycoonUi.BuildListPopup;
//TODO 선택했는지 판단해야함
//Assets/EasyGridBuilder Pro/Misc Assets/Prefabs/UI Prefabs/PlaceHolderBuildable.prefab
buildListPopup.Hide();
}
}
private void OnBuildMode(InputValue value)
{
var buildListView = UiManager.Inst.TycoonUi.BuildListPopup;
if (buildListView.isVisible || GameManager.Inst.IsBuildMode)
{
buildListView.Hide();
EasyGridBuilderPro.Instance.SetGridModeBuilding();
GameManager.Inst.IsBuildMode = false;
}
else
{
buildListView.Show();
EasyGridBuilderPro.Instance.SetGridModeBuilding();
GameManager.Inst.IsBuildMode = true;
}
}
private void OnCancel(InputValue value)
{
}
private void MoveCharacterPlayer()
{
var extraGravityForce = (Physics.gravity * rb.mass) * 2f;
rb.AddForce(extraGravityForce);
var movement = Vector3.zero;
movement = transform.rotation * new Vector3(movementInput.x, 0, movementInput.y) *
(characterSpeed * Time.deltaTime);
gameObject.transform.position += movement;
var localScale = visualLook.localScale;
// 왼쪽
if (movement.x < 0)
{
localScale.x = Mathf.Abs(localScale.x);
//spriteRenderer.sprite = sideSprite;
FoodTransform.localPosition = new Vector3(-0.30f, 0.6f, -0.15f);
animator.SetBool("IsMoving", true);
}
// 오른쪽
else if (movement.x > 0)
{
localScale.x = -Mathf.Abs(localScale.x);
//spriteRenderer.sprite = sideSprite;
FoodTransform.localPosition = new Vector3(0.30f, 0.6f, -0.15f);
animator.SetBool("IsMoving", true);
}
// 뒤로
else if (movement.z > 0)
{
//spriteRenderer.sprite = backSprite;
FoodTransform.localPosition = new Vector3(0f, 0.6f, 0f);
animator.SetBool("IsMoving", true);
}
// 앞으로
else if (movement.z < 0)
{
//spriteRenderer.sprite = frontSprite;
FoodTransform.localPosition = new Vector3(0f, 0.6f, -0.25f);
animator.SetBool("IsMoving", true);
}
else
{
animator.SetBool("IsMoving", false);
}
visualLook.localScale = localScale;
// var movement = transform.rotation * new Vector3(-movementInput.y, 0, movementInput.x) * (characterSpeed * Time.deltaTime);
// rb.MovePosition(rb.position + movement);
}
private IEnumerator MoveCharacterToPosition(Vector3 position, float scaleX)
{
var elapsedTime = 0f;
var duration = 1f; // 이동에 걸리는 시간 (초)
var startingPosition = transform.position;
// 방향 즉시 변경
visualLook.localScale = new Vector3(scaleX, visualLook.localScale.y, visualLook.localScale.z);
while (elapsedTime < duration)
{
transform.position = Vector3.Lerp(startingPosition, position, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = position;
}
public void TakeKingCrab()
{
if (FoodTransform.gameObject.activeSelf) return;
FoodVisual.sprite = DataManager.Inst.kingCrabMeat;
FoodTransform.gameObject.SetActive(true);
FoodOnHand = GlobalValue.FoodOnHand.KING_CRAB;
}
public void TakeBeer()
{
if (FoodTransform.gameObject.activeSelf) return;
FoodVisual.sprite = DataManager.Inst.beer;
FoodTransform.gameObject.SetActive(true);
FoodOnHand = GlobalValue.FoodOnHand.BEER;
}
public void TakeFoodFromPlayer()
{
if (!FoodTransform.gameObject.activeSelf) return;
if (proximitySelector == null || proximitySelector.CurrentUsable == null) return;
var tycoonNpc = proximitySelector.CurrentUsable.gameObject.GetComponent<TycoonNpc>();
if (tycoonNpc != null && tycoonNpc.DoSeat)
{
switch (FoodOnHand)
{
case GlobalValue.FoodOnHand.NONE:
break;
case GlobalValue.FoodOnHand.KING_CRAB:
case GlobalValue.FoodOnHand.JELLYFISH:
case GlobalValue.FoodOnHand.ONION:
case GlobalValue.FoodOnHand.TOMATO:
case GlobalValue.FoodOnHand.SCALLION:
case GlobalValue.FoodOnHand.CLAM:
case GlobalValue.FoodOnHand.SALT:
case GlobalValue.FoodOnHand.CHILI_POWDER:
case GlobalValue.FoodOnHand.DINOSAUR_EGG:
case GlobalValue.FoodOnHand.DINOSAUR_MEAT:
tycoonNpc.IsGetFood = true;
break;
case GlobalValue.FoodOnHand.BEER:
case GlobalValue.FoodOnHand.WINE:
tycoonNpc.IsGetDrink = true;
break;
default:
throw new ArgumentOutOfRangeException();
}
FoodTransform.gameObject.SetActive(false);
FoodOnHand = GlobalValue.FoodOnHand.NONE;
}
}
public void SettingSail()
{
visualLook.gameObject.SetActive(false);
CameraManager.Inst.TycoonCamera.SetVerticalFOV(80);
proximitySelector.enabled = false;
StartCoroutine(ShipMovementAndSceneChange());
}
IEnumerator ShipMovementAndSceneChange()
{
float elapsedTime = 0;
var startingPosition = myShip.position;
var endPosition = startingPosition + transform.right * 10;
var playerPosition = transform.position;
var playerEndPosition = playerPosition + transform.right * 10;
while (elapsedTime < 3.0f)
{
myShip.position = Vector3.Lerp(startingPosition, endPosition, elapsedTime / 3.0f);
transform.position = Vector3.Lerp(playerPosition, playerEndPosition, elapsedTime / 3.0f);
elapsedTime += Time.deltaTime;
yield return null;
}
SceneManager.LoadScene("02.Ocean");
}
public void StartInteraction(Transform target)
{
// interactionTarget = target;
// interactionTarget.GetComponent<InShipNpc>()?.ChangeStateToInteraction();
//
// var targetPosition = interactionTarget.position;
// var playerPosition = transform.position;
//
// var directionToTarget = (targetPosition - playerPosition).normalized;
//
// // 캐릭터가 NPC의 왼쪽 또는 오른쪽에 있는지 확인
// var crossProduct = Vector3.Cross(directionToTarget, transform.forward).y;
//
// Vector3 desiredPosition;
// float desiredScaleX; // 캐릭터의 방
//
// if (crossProduct > 0) // 캐릭터가 NPC의 왼쪽에 있는 경우
// {
// desiredPosition = targetPosition + interactionTarget.right * 2f;
// desiredScaleX = 1f; // 오른쪽을 바라봄
// }
// else // 캐릭터가 NPC의 오른쪽에 있는 경우
// {
// desiredPosition = targetPosition + interactionTarget.right * -2f;
// desiredScaleX = -1f; // 왼쪽을 바라봄
// }
//
// // 장애물 감지
// if (Physics.Raycast(playerPosition, (desiredPosition - playerPosition).normalized, Vector3.Distance(playerPosition, desiredPosition), LayerMask.GetMask("Obstacle")))
// {
// // 장애물이 감지되면, 반대쪽으로 이동
// desiredPosition = crossProduct > 0 ? targetPosition + interactionTarget.right * -2f : targetPosition + interactionTarget.right * 2f;
// desiredScaleX = -desiredScaleX; // 방향을 반전
// }
//
// // 캐릭터를 원하는 위치와 방향으로 부드럽게 이동 및 회전
// StartCoroutine(MoveCharacterToPosition(desiredPosition, desiredScaleX));
// UiManager.Inst.InShipInteraction.gameObject.SetActive(true);
}
public void StartConversation()
{
// if (interactionTarget != null)
// {
// interactionTarget.GetComponent<DialogueSystemTrigger>().OnConversationStart(interactionTarget);
// UiManager.Inst.InShipInteraction.gameObject.SetActive(false);
// }
}
public void EndInteraction()
{
//interactionTarget.GetComponent<InShipNpc>()?.RestoreState();
}
public void EndConversation()
{
//UiManager.Inst.InShipInteraction.gameObject.SetActive(true);
}
}
}