using NUnit.Framework.Interfaces; using System; using UnityEngine; public class WorldItem : MonoBehaviour { // 실제 아이템 데이터 (강화 수치, 수량 등을 포함) public ItemInstance ItemInstance; private GameObject ModelPrefab; //월드 좌표는 사용하지 않는다 (복잡한 구조를 쉽게 가져오기 위해 Prefab으로 선언) private BoxCollider _boxCollider; private float _rotationSpeed; // 회전 속도 private float _bounceAmplitude; // 오르내리는 높이 private float _bounceFrequency; // 오르내리는 속도 private Vector3 _startPos; private void Awake() { _boxCollider = GetComponent(); if (_boxCollider == null) _boxCollider = gameObject.AddComponent(); if (_boxCollider != null) _boxCollider.isTrigger = true; } private void Start() { _rotationSpeed = GameManager.Instance.ItemRotationSpeed; _bounceAmplitude = GameManager.Instance.ItemBounceAmplitude; _bounceFrequency = GameManager.Instance.ItemBounceFrequency; _startPos = transform.position; } private void Update() { // Y축을 기준으로 매 프레임 회전 transform.Rotate(Vector3.up * _rotationSpeed * Time.deltaTime); // 위아래로 둥둥 떠있는 듯한 느낌 float newY = _startPos.y + Mathf.Sin(Time.time * _bounceFrequency) * _bounceAmplitude; transform.position = new Vector3(_startPos.x, newY, _startPos.z); } // 아이템 데이터를 이 오브젝트에 주입하는 메서드 public void SetItem(ItemInstance instance) { ItemInstance = instance; // 기존 모델 지우기 foreach (Transform child in transform) Destroy(child.gameObject); if (instance.Data != null) { ModelPrefab = Instantiate(instance.Data.PrefabVisible, transform); //원본데이터에서 복제하여 자식으로 배치 ModelPrefab.transform.localPosition = Vector3.zero; ModelPrefab.transform.localRotation = Quaternion.identity; ModelPrefab.transform.localScale = instance.Data.WorldScale; ModelPrefab.transform.localRotation = Quaternion.Euler(instance.Data.WorldRotation); // 2. [핵심] 데이터에 저장된 값을 그대로 콜라이더에 주입 if (_boxCollider != null) { _boxCollider.center = instance.Data.ColliderCenter; _boxCollider.size = instance.Data.ColliderSize; } } gameObject.layer = LayerMask.NameToLayer("Item"); } // 플레이어가 아이템을 획득할 때 호출 public void PickUp() { GameManager.Instance.Inventory.AddItem(this.ItemInstance); PlayPickupEffect(); Destroy(gameObject); } private void PlayPickupEffect() { // 이펙트 프리팹을 소환하거나 소리를 재생 Debug.Log($"{ItemInstance.Data.ItemName} 획득 이펙트 재생!"); } private void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { PickUp(); } } }