323 lines
12 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|