|
|
|
|
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<DropItemShadow> shadows;
|
|
|
|
|
[Space(10)]
|
|
|
|
|
public ItemData item;
|
|
|
|
|
[Space(10)]
|
|
|
|
|
public bool PRODUCT = false;//상점 아이템
|
|
|
|
|
|
|
|
|
|
Rigidbody rigidbody;
|
|
|
|
|
Collider col;
|
|
|
|
|
Vector3 pos;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 해당 아이템을 처음으로 드랍 했습니다.
|
|
|
|
|
/// 테이블에서 해당 아이템을 새로 생성합니다.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="data"></param>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 보유 중이던 아이템을 드랍 했습니다.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item"></param>
|
|
|
|
|
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<Rigidbody>();
|
|
|
|
|
|
|
|
|
|
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<GameObject, DropItem> 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<Collider>();
|
|
|
|
|
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<Collider>();
|
|
|
|
|
col.enabled = true;
|
|
|
|
|
|
|
|
|
|
if (OnApply != null)
|
|
|
|
|
OnApply();
|
|
|
|
|
}
|
|
|
|
|
}
|