-
Notifications
You must be signed in to change notification settings - Fork 2
explain Weapon
Yoo Hyeokjin edited this page Jun 27, 2023
·
6 revisions
- Kill : 몬스터를 죽인 수
- KillCount : Weapon별 Enemy를 죽인 수
- WeaponGetTime : Weapon별 무기 획득 시간
- WeaponDamage : Weapon별 Enemy에게 가한 Damage
- Enemy.cs에 TakeDamage Method에서 입력된다.
public void TakeDamage(float damage, int weaponIndex)
{
mHealth -= damage;
GameManager.instance.WeaponDamage[weaponIndex] += damage; // 이 부분에서 해당 Weapon이 Enemy에게 입힌 Damage를 저장한다.
if (mHealth > 0)
{
StartCoroutine(KnockBack());
mAnim.SetTrigger("Hit");
Debug.Log("Hit");
if(weaponIndex == 6)
{
if(mKnockbackpower < 3)
{
mKnockbackpower++;
}
}
}
else
{
mbLive = false;
mColl.enabled = false;
mRb.simulated = false;
mSpriter.sortingOrder = 1;
mAnim.SetBool("Dead", true);
GameManager.instance.Kill++; // 이 부분에서 Enemy를 죽인 수를 저장한다.
Dead();
GameManager.instance.KillCount[weaponIndex]++; // 이 부분에서 해당 Weapon이 죽인 Enemy 수를 저장한다.
}
}
- EquipmentManagementSystem.cs에 SetNewWeapon에서 입력된다.
public void SetNewWeapon(int weaponIndex)
{
GameManager.instance.WeaponGetTime[weaponIndex] = GameManager.instance.GameTime; // 이 부분에서 처음으로 무기를 얻을 때 얻은 시간을 저장한다.
AddNewWeapon(weaponIndex);
TransWeaponIndex[weaponIndex] = Weapons.Count - 1;
Weapons.Last().WeaponDefalutSetting(weaponIndex);
GameManager.instance.WeaponSlot.GetComponent<SlotUI>().AddSlot(weaponIndex, 0);
ProcessWeaponSub(weaponIndex, Weapons.Last());
}
using UnityEngine;
public class SkillFiringSystem : MonoBehaviour
{
public GameObject[] weaponPrefabs; //무기 프리팹
public GameObject[] evolutionWeaponPrefabs; //진화 무기 프리팹
public GameObject[] Birds; // peachone, EbonyWings, 둘의 진화체에 등장하는 새
public GameObject[] Circles;
public static SkillFiringSystem instance = null;
private void Awake()
{
instance = this;
}
private void Update()
{
foreach (var weapon in GameManager.instance.EquipManageSys.Weapons)
{
weapon.Attack();
}
}
}
using UnityEngine;
using System;
using System.Linq;
public class Weapon : MonoBehaviour
{
public int WeaponIndex;
public int WeaponLevel = 1;
public int WeaponMaxLevel;
public bool BEvolution = false;
public float[] WeaponTotalStatList; // Might,Cooldown,ProjectileSpeed, Duration, Amount,AmountLimit,Piercing,Area,MaxLevel
private float[] mWeaponStats;
private void OnTriggerEnter2D(Collider2D col)
{
if (col.CompareTag("DestructibleObj"))
{
if (col.gameObject.TryGetComponent(out DestructibleObject destructible))
{
destructible.TakeDamage(WeaponTotalStatList[(int)Enums.EWeaponStat.Might], WeaponIndex);
}
}
if (col.gameObject.tag == "Monster")
{
col.gameObject.GetComponent<Enemy>().TakeDamage(WeaponTotalStatList[(int)Enums.EWeaponStat.Might], WeaponIndex);
if (WeaponIndex == 6 && BEvolution)
{
GameManager.instance.Character.RestoreHealth(1);
GameManager.instance.EvoGralicRestoreCount++;
if (GameManager.instance.EvoGralicRestoreCount == 60)
{
GameManager.instance.EvoGralicRestoreCount = 0;
WeaponTotalStatList[((int)Enums.EWeaponStat.Might)] += 1;
}
}
}
}
private void OnTriggerExit2D(Collider2D col)
{
if (col.gameObject.tag == "Boundary")
{
Destroy(this.gameObject);
}
}
public void WeaponDefalutSetting(int weaponIndex=0)
{
this.WeaponIndex = weaponIndex;
this.mWeaponStats = Enumerable.Range(0, EquipmentData.DefaultWeaponStats.GetLength(1)).Select(x => EquipmentData.DefaultWeaponStats[weaponIndex, x]).ToArray();
WeaponLevel = 1;
WeaponMaxLevel = (int)mWeaponStats[(int)Enums.EWeaponStat.MaxLevel];
WeaponTotalStatList = mWeaponStats;
AttackCalculation();
}
public void Upgrade()
{
WeaponLevel++;
foreach ((var statIndex, var data) in EquipmentData.WeaponUpgrade[WeaponIndex][WeaponLevel])
{
mWeaponStats[statIndex] += data;
}
Evolution();
}
public bool IsMaster()
{
return WeaponLevel == WeaponMaxLevel;
}
public bool IsEvoluction()
{
return BEvolution;
}
public float[] WeaponTotalStats { get { return WeaponTotalStatList; } }
public virtual void Attack() { }
public virtual void EvolutionProcess() { }
private void Evolution()
{
if (!IsMaster())
return;
var equipManageSys = GameManager.instance.EquipManageSys;
int evoPairAccIndex = EquipmentData.EvoWeaponNeedAccIndex[WeaponIndex];
if (evoPairAccIndex < 0) // 짝이 되는 악세서리의 index = -1 -> 짝이 무기인 경우
EvolutionException(equipManageSys);
else if (equipManageSys.HasAcc(evoPairAccIndex))
BEvolution = true;
if (BEvolution)
EvolutionProcess();
}
private void EvolutionException(EquipmentManagementSystem equipManageSys) // 진화에 필요한 짝이 악세서리가 아닌 무기인 경우(예시 - 비둘기, 흑비둘기)
{
var evoPairWeaponIndex = EquipmentData.EvoWeaponNeedWeaponIndex[WeaponIndex];
if (equipManageSys.HasWeapon(evoPairWeaponIndex) && equipManageSys.Weapons[equipManageSys.TransWeaponIndex[evoPairWeaponIndex]].IsMaster())
BEvolution = equipManageSys.Weapons[equipManageSys.TransWeaponIndex[evoPairWeaponIndex]].BEvolution = true;
}
//아래 계산을 한번에 하기
//ToDo: 레벨업 할때마다 갱신하는 것으로 변경
private void AttackCalculation()
{
DamageCalculation();
ProjectileSpeedCalculation();
DurationCalculation();
AttackRangeCalculation();
CooldownCalculation();
CalculateNumberOfProjectiles();
}
private void DamageCalculation()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.Might)] = mWeaponStats[((int)Enums.EWeaponStat.Might)] * GameManager.instance.CharacterStats[(int)Enums.EStat.Might];
}
private void ProjectileSpeedCalculation()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.ProjectileSpeed)] = mWeaponStats[((int)Enums.EWeaponStat.ProjectileSpeed)] * GameManager.instance.CharacterStats[(int)Enums.EStat.ProjectileSpeed];
}
private void DurationCalculation()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.Duration)] = mWeaponStats[((int)Enums.EWeaponStat.Duration)] * GameManager.instance.CharacterStats[(int)Enums.EStat.Duration];
}
private void AttackRangeCalculation()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.Area)] = mWeaponStats[((int)Enums.EWeaponStat.Area)] * GameManager.instance.CharacterStats[(int)Enums.EStat.Area];
}
private void CooldownCalculation()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.Cooldown)] = mWeaponStats[((int)Enums.EWeaponStat.Cooldown)] * GameManager.instance.CharacterStats[(int)Enums.EStat.Cooldown];
}
private void CalculateNumberOfProjectiles()
{
WeaponTotalStatList[((int)Enums.EWeaponStat.Amount)] = ((int)mWeaponStats[((int)Enums.EWeaponStat.Amount)]) + GameManager.instance.CharacterStats[(int)Enums.EStat.Amount];
}
}
using System.Collections.Generic;
using System.Linq;
using System;
using UnityEngine;
public class EquipmentManagementSystem
{
public List<Weapon> Weapons;
public List<Accessory> Accessories;
public List<int> MasteredWeapons;
public List<int> MasteredAccessories;
public int[] TransWeaponIndex; // 해당 index의 weapon이 현재 보유중인 Weapons의 몇 번째 index에 있는지 반환하는 배열, 없다면 -1 반환
public int[] TransAccessoryIndex; // 위와 같으나 Accessory에 해당
public void Set(int startingWeapon)
{
Weapons = new List<Weapon>();
Accessories = new List<Accessory>();
TransWeaponIndex = Enumerable.Repeat<int>(-1, Constants.MAX_WEAPON_NUMBER).ToArray<int>();
TransAccessoryIndex = Enumerable.Repeat<int>(-1, Constants.MAX_ACCESSORY_NUMBER).ToArray<int>();
MasteredWeapons = new List<int>();
MasteredAccessories = new List<int>();
SetNewWeapon(startingWeapon);
}
public void ApplyItem(Tuple<int, int, int> pickUp)
{
switch ((Enums.EPickUpType)pickUp.Item1)
{
case Enums.EPickUpType.Weapon:
ApplyWeapon(pickUp.Item2, pickUp.Item3);
break;
case Enums.EPickUpType.Accessory:
ApplyAccessory(pickUp.Item2, pickUp.Item3);
break;
default:
ApplyEtc(pickUp.Item2);
break;
}
}
public bool HasWeapon(int weaponIndex)
{
if (weaponIndex < 0 || weaponIndex >= Constants.MAX_WEAPON_NUMBER)
return false;
return TransWeaponIndex[weaponIndex] >= 0;
}
public bool HasAcc(int accIndex)
{
if (accIndex < 0 || accIndex >= Constants.MAX_ACCESSORY_NUMBER)
return false;
return TransAccessoryIndex[accIndex] >= 0;
}
public void SetNewWeapon(int weaponIndex)
{
GameManager.instance.WeaponGetTime[weaponIndex] = GameManager.instance.GameTime;
AddNewWeapon(weaponIndex);
TransWeaponIndex[weaponIndex] = Weapons.Count - 1;
Weapons.Last().WeaponDefalutSetting(weaponIndex);
GameManager.instance.WeaponSlot.GetComponent<SlotUI>().AddSlot(weaponIndex, 0);
ProcessWeaponSub(weaponIndex, Weapons.Last());
}
public Weapon GetWeapon(int weaponIndex)
{
if (TransWeaponIndex[weaponIndex] < 0)
Debug.Log("없는 무기 호출");
// TODO: 없는 무기 호출시 에러! 제대로 작성
Debug.Log(TransWeaponIndex[weaponIndex]);
Debug.Log(Weapons[TransWeaponIndex[weaponIndex]]);
return Weapons[TransWeaponIndex[weaponIndex]];
}
public void UpgradeWeapon(int weaponIndex)
{
Weapons[TransWeaponIndex[weaponIndex]].Upgrade();
if (Weapons[TransWeaponIndex[weaponIndex]].IsMaster())
{
MasteredWeapons.Add(weaponIndex);
}
}
public void GetAccessory(int accessoryIndex)
{
TransAccessoryIndex[accessoryIndex] = Accessories.Count;
Accessories.Add(new Accessory(accessoryIndex));
UpgradeAccessory(accessoryIndex);
GameManager.instance.AccessorySlot.GetComponent<SlotUI>().AddSlot(accessoryIndex, 1);
}
public void UpgradeAccessory(int accessoryIndex)
{
Accessories[TransAccessoryIndex[accessoryIndex]].Upgrade();
if (Accessories[TransAccessoryIndex[accessoryIndex]].IsMaster())
{
MasteredAccessories.Add(accessoryIndex);
}
}
private void ProcessWeaponSub(int weaponIndex, Weapon weapon)
{
switch(weaponIndex)
{
case 7: // peachOne
weapon.GetComponent<Peachone>().SpawnBlueBird(SkillFiringSystem.instance.Birds[0]);
break;
case 8: // ebonyWings
weapon.GetComponent<EbonyWings>().SpawnBlackBird(SkillFiringSystem.instance.Birds[1]);
break;
}
}
private void AddNewWeapon(int weaponIndex)
{
switch (weaponIndex)
{
case 0: // Whip
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<Whip>());
break;
case 1: // MagicWand
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<MagicWand>());
break;
case 2: // Knife
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<Knife>());
break;
case 3: // Cross
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<Cross>());
break;
case 4: // KingBible
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<KingBible>());
break;
case 5: // FireWand
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<FireWand>());
break;
case 6: // Garlic
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<Gralic>());
break;
case 7: // peachOne
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<Peachone>());
break;
case 8: // ebonyWings
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<EbonyWings>());
break;
case 9: // LightningRing
Weapons.Add((SkillFiringSystem.instance.weaponPrefabs[weaponIndex]).GetComponent<LightningRing>());
break;
}
}
private void ApplyWeapon(int weaponIndex, int hasWeapon)
{
if (hasWeapon == 0)
SetNewWeapon(weaponIndex);
else
UpgradeWeapon(weaponIndex);
}
private void ApplyAccessory(int accessoryIndex, int hasAccessory)
{
if (hasAccessory == 0)
GetAccessory(accessoryIndex);
else
UpgradeAccessory(accessoryIndex);
}
private void ApplyEtc(int etcIndex)
{
switch ((Enums.EEtc)etcIndex)
{
case Enums.EEtc.Food:
// TODO: 체력 회복 함수와 연결
break;
case Enums.EEtc.Money:
// TODO: 재화 획득 함수와 연결
break;
default:
break;
}
}
}