반응형
SMALL
구조는 잡았지만 생각보다 추가해야할 부분이 많았다.
우선 아이콘을 위한 아틀라스 매니저와 플레이어 스탯 데이터를 저장할 info 매니저를 같이 만들게 되었다.
인벤토리 스탯창을 제외하고 다른 스크립트에서 유저의 능력치를 가져올수 있게 하기 위해서다.
구현사항은 아래와 같다.
- 인포 매니저를 통한 캐릭터 능력치 관리 (및 데이터 저장 및 불러오기)
- 아틀라스 매니저를 통한 스킬, 무기 아이콘 관리 (인벤토리의 장비 아이콘 또한 관리 예정)
인포매니저와 아틀라스 매니저를 만드는데 시간을 많이 들였기 때문에 무기 info 만 만들고 나머지는 기능 구현에 좀더 할애해야 할듯 하다.
스크립트
UIInventoryDirector
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIInventoryDirector : MonoBehaviour
{
[SerializeField]
private Button btnStatInventory;
[SerializeField]
private UIStatInventory statInventory;
private void Awake()
{
// 초기설정
this.btnStatInventory.onClick.AddListener(() =>
{
this.statInventory.gameObject.SetActive(true);
});
//스탯 인벤토리 이니셜라이징
this.statInventory.Init();
}
}
UIStatInventory
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIStatInventory : MonoBehaviour
{
[SerializeField]
private UIStat stat;
[SerializeField]
private UIInventory inventory;
[SerializeField]
private Button btnInventoryDim;
[SerializeField]
private Button btnInventoryClose;
public void Init()
{
// 초기 설정
this.btnInventoryDim.onClick.AddListener(() =>
{
this.gameObject.SetActive(false);
});
this.btnInventoryClose.onClick.AddListener(() =>
{
this.gameObject.SetActive(false);
});
//인벤토리 스탯창 이니셜라이징
this.stat.Init();
this.inventory.Init();
//초기 설정
this.gameObject.SetActive(false);
}
}
UIStat
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIStat : MonoBehaviour
{
[SerializeField]
private UIPlayerStats playerStats;
[SerializeField]
private UIWeaponCharacteristic weaponCharacteristic;
public void Init()
{
//초기 설정
this.playerStats.Init();
this.weaponCharacteristic.Init();
}
}
UIPlayerStats
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class UIPlayerStats : MonoBehaviour
{
[SerializeField]
private Text txtBattleRate;
[SerializeField]
private Text txtPowerStat;
[SerializeField]
private Text txtFireRateStat;
[SerializeField]
private Text txtCriticalHitChance;
[SerializeField]
private Text txtCriticalHitAmount;
public void Init()
{
string path = string.Format("{0}/stat_info.json", Application.persistentDataPath);
if(File.Exists(path))
{
PlayerStatInfoManager.instance.LoadStatInfo();
}
else
{
PlayerStatInfoManager.instance.SaveStatInfo();
}
// 플레이어 스탯 업데이트
this.UpdateBattleRate();
}
/// <summary>
/// 플레이어 스탯 업데이트 메서드 (플레이어 스탯 변경시 호출해줘야 해야합니다)
/// </summary>
public void UpdateBattleRate()
{
this.txtBattleRate.text = string.Format("전투력 : {0}",PlayerStatInfoManager.instance.BattleRate);
this.txtPowerStat.text = string.Format("공격력 : {0}", PlayerStatInfoManager.instance.PowerStat);
this.txtFireRateStat.text = string.Format("공격속도 : {0}", PlayerStatInfoManager.instance.FireRateStat);
this.txtCriticalHitChance.text = string.Format("치명타 확률 : {0}", PlayerStatInfoManager.instance.CriticalHitChance);
this.txtCriticalHitAmount.text = string.Format("치명타 피해 : {0}", PlayerStatInfoManager.instance.CriticalHitAmount);
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
PlayerStatInfoManager.instance.IncreasePowerStat(10);
this.UpdateBattleRate();
}
}
}
UIWeaponCharacteristic
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIWeaponCharacteristic : MonoBehaviour
{
[SerializeField]
private Text txtWeaponProficiency;
[SerializeField]
private Slider WeaponProficiencySlider;
[SerializeField]
private Text txtWeaponProficiencySlider;
[SerializeField]
private Image imgWeapon_Icon;
[SerializeField]
private Image WeaponSkill1_Icon;
[SerializeField]
private Image WeaponSkill2_Icon;
[SerializeField]
private Image WeaponSkill3_Icon;
[SerializeField]
private Text txtBulletAmount;
[SerializeField]
private Text txtPenetrate;
[SerializeField]
private Text txtkNockBackCharacteristic;
[SerializeField]
private Text txtkMovespeedCharacteristic;
[SerializeField]
private Text txtDashRecover;
[SerializeField]
private UIWeaponSkillPopUp skillPopUp;
private string currentWeaponName = "AK47";
public float currentWeaponProficiencyValue = 0.1f;
public int MaxWeaponProficiencyValue = 1;
public void Init()
{
this.SetWeaponIcon(this.currentWeaponName);
this.SetWeaponProficiency();
this.SetWeaponCharactoristic();
}
// 무기 숙련도 표시입니다. 지금은 필드로 해놨는데 무기 info 매니저를 만들면 거기에서 실시간으로 가져오는 걸로 해야겠습니다.
public void SetWeaponProficiency()
{
this.txtWeaponProficiency.text = string.Format("숙련도 : {0}", this.currentWeaponProficiencyValue);
this.WeaponProficiencySlider.value = this.currentWeaponProficiencyValue;
this.txtWeaponProficiencySlider.text = string.Format("{0}/{1}", this.currentWeaponProficiencyValue*100, this.MaxWeaponProficiencyValue);
}
// 무기 특성 또한 무기Info 매니저에서 값을 공유하는 걸로 해야겠습니다.
public void SetWeaponCharactoristic()
{
this.txtBulletAmount.text = string.Format("총알 갯수 : {0}", 1);
this.txtPenetrate.text = string.Format("관통력 : {0}", 1);
this.txtkNockBackCharacteristic.text = string.Format("넉백 : {0}", 1);
this.txtkMovespeedCharacteristic.text = string.Format("이동속도 : {0}", 1);
this.txtDashRecover.text = string.Format("대시 회복 : {0}", 1);
}
//아틀라스 매니저에서 현재 무기에 맞는 아이콘을 가져와 셋팅 합니다.( 스킬셋은 자동으로 해당 무기에 맞게 변경됩니다. )
public void SetWeaponIcon(string name)
{
this.imgWeapon_Icon.sprite = AtlasManager.instance.GetAtlasByName("UIWeaponIcon").GetSprite(name);
this.currentWeaponName = name;
this.SetSkillIcon();
}
// 스킬 아이콘 셋팅
public void SetSkillIcon()
{
if(this.currentWeaponName == "AK47")
{
this.WeaponSkill1_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("fire_spell");
this.WeaponSkill2_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("fortify_spell");
this.WeaponSkill3_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("fire_spell_2");
}
else if(this.currentWeaponName == "AWP")
{
this.WeaponSkill1_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("blinding_light_spell");
this.WeaponSkill2_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("counterspell");
this.WeaponSkill3_Icon.sprite = AtlasManager.instance.GetAtlasByName("UISkillIcon").GetSprite("lightning_spell");
}
}
}
AtlasManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class AtlasManager : MonoBehaviour
{
public static AtlasManager instance;
public SpriteAtlas UIWeaponIconAtlas;
public SpriteAtlas UISkillIconAtlas;
public Dictionary<string, SpriteAtlas> dicIconAtals = new Dictionary<string, SpriteAtlas>();
public void Awake()
{
instance = this;
var WeaponIconatlasName = UIWeaponIconAtlas.name.Replace("Atlas","");
var SkillIconatlasName = UISkillIconAtlas.name.Replace("Atlas","");
this.dicIconAtals.Add(WeaponIconatlasName, UIWeaponIconAtlas);
this.dicIconAtals.Add(SkillIconatlasName, UISkillIconAtlas);
}
public SpriteAtlas GetAtlasByName(string name)
{
return this.dicIconAtals[name];
}
}
PlayerStatInfoManager
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
public class PlayerStatInfoManager
{
public static readonly PlayerStatInfoManager instance = new PlayerStatInfoManager();
private StatInfo statinfo = new StatInfo();
public PlayerStatInfoManager() { }
// 전역으로 가져올수 있는 플레이어 스탯 프로퍼티
public int BattleRate{
get { return (PowerStat + FireRateStat + CriticalHitAmount + CriticalHitChance); }
}
public int PowerStat { get { return this.statinfo.powerStat; } }
public int FireRateStat { get { return this.statinfo.fireRateStat; } }
public int CriticalHitAmount { get { return this.statinfo.criticalHitAmount; } }
public int CriticalHitChance { get { return this.statinfo.criticalHitChance; } }
// 플레이어 스탯 초기화 메서드 (테스트 하실때 사용하시면 됩니다.)
public void InitStats()
{
this.statinfo.powerStat = 10;
this.statinfo.fireRateStat = 10;
this.statinfo.criticalHitAmount = 10;
this.statinfo.criticalHitChance = 10;
}
// 스탯 증가 메서드 + 자동 저장
public void IncreasePowerStat(int amount)
{
this.statinfo.powerStat += amount;
this.SaveStatInfo();
}
public void IncreaseFireRateStat(int amount)
{
this.statinfo.fireRateStat += amount;
this.SaveStatInfo();
}
public void IncreaseCriticalHitAmount(int amount)
{
this.statinfo.criticalHitAmount += amount;
this.SaveStatInfo();
}
public void IncreaseCriticalHitChance(int amount)
{
this.statinfo.criticalHitChance += amount;
this.SaveStatInfo();
}
public void LoadStatInfo()
{
string path = string.Format("{0}/stat_info.json", Application.persistentDataPath);
string json = File.ReadAllText(path);
this.statinfo = JsonConvert.DeserializeObject<StatInfo>(json);
Debug.Log("데이터 로드 완료");
}
public void SaveStatInfo()
{
string path = string.Format("{0}/stat_info.json", Application.persistentDataPath);
string json = JsonConvert.SerializeObject(statinfo);
File.WriteAllText(path, json);
Debug.Log("데이터 저장 완료");
}
}
StatInfo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StatInfo
{
// 플레이어의 스탯 변수
public int powerStat = 10;
public int fireRateStat = 10;
public int criticalHitAmount = 10;
public int criticalHitChance = 10;
}
인벤토리는 아직 제작전으로 어서 기능 구현부터 해야겠다...
반응형
LIST
'프로젝트 > 건즈앤 레이첼스' 카테고리의 다른 글
[GPGS] 구글 개발자 등록 방법 (1) | 2023.04.11 |
---|---|
[유니티 프로젝트] 인벤토리 스탯창 구현 .2 - 유저 스탯창 마무리 (0) | 2023.04.10 |
[유니티 프로젝트] A* 알고리즘을 이용한 맵 생성 (로직 변경) (0) | 2023.04.05 |
[유니티 프로젝트] 옵션 UI .3 (0) | 2023.04.03 |
[유니티 프로젝트] 옵션 UI .2 (1) | 2023.04.02 |