CapersProject/Assets/02.Scripts/Ui/Tycoon/IndicatorUi.cs
Nam Tae Gun d7010a279b 타이쿤 추가 업데이트 내용
+ 화면 밖에서 손님이 요구하는 중일 때, Indicator를 통해서 Ui 표시
+ Open, Closed Ui 추가 및 기능 연결
+ 테이블 찾는 로직 변경 (전부 랜덤) - 기존에는 항상 같은 순서로 자리를 채움
+ 통계용 데이터 CustomerVisitInfo 추가 (추후에 통계Ui 생길 때 연결)
+ 대화 조건 변경
+ 일부 가구들 상호작용 조건 변경

+ Outline shader Render Face(Front -> Both 변경 - Front면 x축 뒤집는 경우 안나옴)
+ GraphicMaterialOverride를 사용하는 경우, 에디터에서 전체화면 등 특정 상황에서 material이 사라지는 버그 수정
+ InteractionFuniture Open, Closed 공통 기능으로 병합
2024-07-22 09:42:29 +09:00

93 lines
3.5 KiB
C#

using System.Collections.Generic;
using BlueWater.Npcs.Customers;
using BlueWater.Tycoons;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Uis
{
public class IndicatorUi : MonoBehaviour
{
[SerializeField, Required]
private GameObject _uiIndicator;
[SerializeField]
private Vector2 _widthPadding;
[SerializeField]
private Vector2 _heightPadding;
private RectTransform _canvasRectTransform;
private CustomerManager _customerManager;
private Camera _mainCamera;
private Dictionary<Customer, GameObject> _customerindicators = new();
private int _screenWidth;
private int _screenHeight;
private void Start()
{
_canvasRectTransform = GetComponent<RectTransform>();
_customerManager = CustomerManager.Instance;
_mainCamera = TycoonCameraManager.Instance.MainCamera;
_customerManager.OnInstantiateCustomer += AddUiIndicator;
}
private void OnDestroy()
{
_customerManager.OnInstantiateCustomer -= AddUiIndicator;
}
private void LateUpdate()
{
_screenWidth = Screen.width;
_screenHeight = Screen.height;
foreach (var element in _customerindicators)
{
var customer = element.Key;
var indicator = element.Value;
if (!customer)
{
_customerindicators.Remove(customer);
Destroy(indicator.gameObject);
return;
}
var target = customer.FoodBalloonUi.transform;
var screenPosition = _mainCamera.WorldToScreenPoint(target.position);
if (!target.gameObject.activeSelf)
{
indicator.SetActive(false);
continue;
}
if (screenPosition.z > 0 && screenPosition.x > 0 && screenPosition.x < _screenWidth && screenPosition.y > 0 && screenPosition.y < _screenHeight)
{
indicator.SetActive(false);
}
else
{
indicator.SetActive(true);
var clampedScreenPosition = screenPosition;
clampedScreenPosition.x = Mathf.Clamp(screenPosition.x, 0f + _widthPadding.x, _screenWidth - _widthPadding.y);
clampedScreenPosition.y = Mathf.Clamp(screenPosition.y, 0f + _heightPadding.x, _screenHeight - _heightPadding.y);
RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvasRectTransform, clampedScreenPosition, _mainCamera, out var localPoint);
indicator.transform.localPosition = localPoint;
var cameraCenterPosition = new Vector3(_screenWidth * 0.5f, _screenHeight * 0.5f, screenPosition.z);
var direction = (screenPosition - cameraCenterPosition).normalized;
var angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
indicator.transform.localRotation = Quaternion.Euler(0f, 0f, angle - 90f);
}
}
}
private void AddUiIndicator(Customer customer)
{
var newUiIndicator = Instantiate(_uiIndicator, transform);
newUiIndicator.SetActive(false);
_customerindicators.Add(customer, newUiIndicator);
}
}
}