using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; [System.Serializable] public class DropItemData { public string idx; [Space(10)] [OnlyRead] public int value = 1; public int minValue = 1; public int maxValue = 1; [Space(10)] public int dropRate = 1000; public int Get() { int random1 = Random.Range(0, 1001); //Debug.LogWarning($"{random1} < dropRate"); value = random1 < dropRate ? Random.Range(minValue, maxValue + 1) : 0; return value; } static public DropItemData Create(string idx, int value) { DropItemData data = new DropItemData(); data.idx = idx; data.value = value; return data; } } [System.Serializable] public class DropItemShadow { public string type = "default"; public Projector projector; } public class DropItem : MonoBehaviour { public SpriteRenderer sprite; public Material matDefault; public Material matOutLine; public ShaderControlValue scvShine; public Material matShine; public ShaderControlValue scvHit; public Material matHit; public TextMeshPro text; [Space(10)] Projector projector; public List shadows; [Space(10)] public ItemData item; [Space(10)] public bool PRODUCT = false;//상점 아이템 Rigidbody rigidbody; Collider col; Vector3 pos; /// /// 해당 아이템을 처음으로 드랍 했습니다. /// 테이블에서 해당 아이템을 새로 생성합니다. /// /// public void Drop_First(DropItemData data, bool LOCK = false) { this.LOCK = LOCK; item = ItemData.Copy(DataManager.Instance.dataItem.Search(data.idx), data.value); OnInitialized(); if(this.LOCK) Invoke("LockRelease", 1f); } /// /// 보유 중이던 아이템을 드랍 했습니다. /// /// public void Drop_Again(ItemData item) { LOCK = true; //this.item = item; this.item = ItemData.Copy(item, 1); OnInitialized(); Invoke("LockRelease", 1f); } public void OnInitialized(bool PRODUCT = false) { this.PRODUCT = PRODUCT; text.text = $"{item.price}"; text.gameObject.SetActive(PRODUCT); //sprite.sprite = SpriteManager.Instance.SpriteGet($"AtlasIngame", $"item{item.idx}"); sprite.sprite = SpriteManager.Instance.SpriteGet($"Item/item{item.idx}"); sprite.gameObject.SetActive(true); switch (item.type) { case "Weapon": case "Armor": case "Accessory": sprite.material = matOutLine; break; case "Pickup": case "Use": sprite.material = matShine; scvShine.Init(matShine, true, true); scvShine.gameObject.SetActive(true); break; default: sprite.material = matDefault; break; } if (0 < shadows.Count) { if (projector != null) projector.gameObject.SetActive(false); DropItemShadow shadow = shadows.Find(a => a.type.Equals(item.type)); projector = shadow == null ? shadows[0].projector : shadow.projector; projector.gameObject.SetActive(true); } if (rigidbody == null) rigidbody = GetComponent(); if (rigidbody != null) { pos = transform.position; Vector3 pos2 = Util.PointCreate(0.1f, 0.5f); pos += pos2; pos.y = 2f; transform.position = pos; pos = Util.PointCreate(30f, 100f); pos.y = 450; rigidbody.constraints = RigidbodyConstraints.None; rigidbody.freezeRotation = true; rigidbody.AddForce(pos); } DropSound(item.type); } private void OnDisable() { //OnGain = null; //LOCK = true; //item = null; scvShine.gameObject.SetActive(false); } public bool SOUND = true; public void DropSound(string type) { if (SOUND) { SoundPlayer sp = SoundManager.Instance.PrefabGet($"Sound/SFX item_drop_{type.ToLower()}"); if (sp != null) SoundManager.Instance.EffectPlay(sp.gameObject); } } [Space(10)] public bool LOCK = false; void LockRelease() { LOCK = false; } public System.Action OnGain; //private void OnCollisionEnter(Collision collision) //{ // if (LOCK) // return; // if (OnGain != null) // OnGain(collision.gameObject, this); //} private void OnTriggerEnter(Collider other) { if (LOCK) return; if (OnGain != null) OnGain(other.gameObject, this); } public Animation anim; public System.Action OnApply; public void OnAnimaionStart(System.Action OnApply) { if (col == null) col = GetComponent(); rigidbody.velocity = Vector3.zero; col.enabled = false; rigidbody.constraints = RigidbodyConstraints.FreezePositionY; rigidbody.freezeRotation = true; sprite.material = matHit; scvHit.Init(matHit, true); scvHit.gameObject.SetActive(true); anim.Play(); this.OnApply = OnApply; } public void OnAnimationEnd() { if (col == null) col = GetComponent(); col.enabled = true; if (OnApply != null) OnApply(); } }