PInformation
PInformation의 역할
- 프로그램에서 변경되는 능력치들에 대한 정보를 가지고 있는다.
- 매니저에 PInformation를 넘겨줘서 능력치를 증/감 시킨다
필요한 변수들 선언
using UnityEngine;
public class PInformation : MonoBehaviour
{
private bool isProgramBeingAdded = false;
public string ProgramName;
public string Explanation;
public string PowerExplanation;
public int AddCoin = 0;
public int HPHeal = 0;
public int AttackPower = 0;
public float AttackSpeed = 0;
public float MoveSpeed = 0;
public float BulletSpeed = 0;
[Header("퍼센트 증가")]
public float AttackPerUp = 0;
public float AttackSpeedPerUp = 0;
public float MoveSpeedPerUp = 0;
public float bulletSpeedPerUp = 0;
[Header("퍼센트 만큼감소")]
public float AttackPerDown = 0;
public float AttackSpeedPerDown = 0;
public float MoveSpeedPerDown = 0;
public float bulletSpeedPerDown = 0;
[Header("퍼센트로 설정")]
public float SetAttackPer = 0;
public float SetAttackSpeedPer = 0;
public float SetMoveSpeedPer = 0;
public float SetbulletSpeedPer = 0;
[Header("총알크기변경")]
public float BulletScalePerUP = 0;
public float BulletScalePerDown = 0;
public float SetBulletScalePer = 0;
public bool IsUsable = true;
public bool IsDeletable = true;
// Image Setting
public SpriteRenderer spriteRenderer;
public string spriteSheetName; // 이미지 이름
public int spriteIndex; // 이미지 내 번호
...
}
GameObject에서 PInformation 스크립트를 할당하고, 수치값을 입력해 원하는 프로그램을 자유롭게 만들 수 있도록 했다.
거의 모든 변수가 능력치에 대한 수치 변동값으로 사용된다.
기본 함수(Start, Update)
using UnityEngine;
public class PInformation : MonoBehaviour
{
...
// Start is called before the first frame update
void Start()
{
SetSprite(spriteSheetName, spriteIndex);
}
// Update is called once per frame
void Update()
{
}
...
}
Start()
프로그램의 이미지를 설정해 주는 함수를 호출한다.
OnTrigger 함수
using UnityEngine;
public class PInformation : MonoBehaviour
{
...
private void OnTriggerEnter2D(Collider2D other)
{
// 충돌한 오브젝트가 Player 인 경우에만 이벤트 처리
if (!isProgramBeingAdded)
{
if (other.CompareTag("Player"))
{
isProgramBeingAdded = true;
if (ProgramManager.Instance != null)
{
ProgramManager.Instance.AddProgramList(this);
}
else
{
Debug.LogError("ProgramManager instance not found.");
}
Destroy(gameObject);
}
}
}
...
}
프로그램이 여러 번 추가되는 것을 방지하기 위해 가장 처음 isProgramBegineAdded를 사용하여 체크했다.
이후 프로그램 매니저에 PInformation을 추가했다.
Sprite 설정 함수
using UnityEngine;
public class PInformation : MonoBehaviour
{
...
public void SetSprite(string spriteSheetName, int spriteIndex)
{
Sprite[] sprites = Resources.LoadAll<Sprite>(spriteSheetName);
if (sprites != null && spriteIndex >= 0 && spriteIndex < sprites.Length)
{
spriteRenderer.sprite = sprites[spriteIndex];
}
else
{
Debug.LogError("Sprite not found or invalid index.");
}
}
}
여러 장의 이미지가 한 이미지로 합쳐진 이미지에서 인덱싱을 통해 이미지를 추출해 할당해 준다.
ProgramManager
Program Manager의 역할
- PInformation 리스트를 관리한다.
- 새로운 프로그램이 들어왔을 경우 능력치를 변화시킨다.
- 프로그램이 삭제되었을 경우 능력치를 다시 복구한다.
필요한 변수들 선언
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class ProgramManager : MonoBehaviour
{
public static ProgramManager Instance;
private PoolingManager PInstance;
private StatusManager statusManager;
private Weapon weapon;
// 내가 가지고 있는 프로그램 리스트
public List<PInformation> ProgramList = new List<PInformation>();
[Header("어택이펙트 관련")]
[SerializeField]
Material bulletMa;
[SerializeField]
Material monBulletMa;
[SerializeField]
float interval;
[Header("유니티 관련")]
[SerializeField]
Weapon playerWeapon;
...
}
기본 함수(Start, Update, OnDisable)
using System.Collections.Generic;
using UnityEngine;
public class ProgramManager : MonoBehaviour
{
....
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
PInstance = PoolingManager.Instance;
}
private void OnDisable()
{
if (bulletMa != null)
{
Color playerColor = bulletMa.color;
playerColor.a = 1f; // 알파값 수정
bulletMa.color = playerColor; // 색상에 알파값 반영
}
if (monBulletMa != null)
{
Color monsterColor = monBulletMa.color;
monsterColor.a = 1f; // 알파값 수정
monBulletMa.color = monsterColor; // 색상에 알파값 반영
}
}
...
}
총알 속도와 관련된 수치들을 조절해야 하므로 PoolingManager를 가져와서 할당해 줬다.
OnDisable 함수는 다른 팀원이 작성한 부분이라 정확히 무슨 기능인지 모르겠다.
AddProgramList, RemoveProgramList
using System.Collections.Generic;
using UnityEngine;
public class ProgramManager : MonoBehaviour
{
....
public void AddProgramList(PInformation NewProgram)
{
ProgramList.Add(NewProgram);
Player player = GameObject.FindWithTag("Player").GetComponent<Player>();
statusManager = StatusManager.Instance;
if (statusManager == null)
{
Debug.Log("statusManager is not find");
return;
}
if (NewProgram.AddCoin != 0)
{
statusManager.CoinUp(NewProgram.AddCoin);
}
if (NewProgram.HPHeal != 0)
{
statusManager.Heal(NewProgram.HPHeal);
}
if (NewProgram.AttackPower != 0)
{
if (PInstance != null)
{
//PInstance.RefreshBulletDamage(NewProgram.AttackPower);
statusManager.AttackPower += NewProgram.AttackPower;
}
}
if (NewProgram.AttackSpeed != 0)
{
if (player != null)
{
weapon = player.GetWeapon();
if (weapon != null)
{
statusManager.AttackSpeed += NewProgram.AttackSpeed;
//weapon.SetAttackSpeed(NewProgram.AttackSpeed);
}
}
}
if (NewProgram.MoveSpeed != 0)
{
statusManager.SetSpeed(NewProgram.MoveSpeed);
}
if (NewProgram.BulletSpeed != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed += NewProgram.BulletSpeed;
}
}
//퍼센트 만큼 올리기
if (NewProgram.AttackPerUp != 0)
{
if (PInstance != null)
{
statusManager.AttackPower += statusManager.AttackPower*NewProgram.AttackPerUp;
}
}
if (NewProgram.AttackSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed += statusManager.AttackSpeed * NewProgram.AttackSpeedPerUp;
}
}
if (NewProgram.MoveSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed += statusManager.MoveSpeed * NewProgram.MoveSpeedPerUp;
}
}
if (NewProgram.bulletSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed += statusManager.BulletSpeed * NewProgram.bulletSpeedPerUp;
}
}
//퍼센트만큼 깎기
if (NewProgram.AttackPerDown != 0)
{
if (PInstance != null)
{
statusManager.AttackPower *= ( 1 - NewProgram.AttackPerDown);
}
}
if (NewProgram.AttackSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed *= (1 - NewProgram.AttackSpeedPerDown);
}
}
if (NewProgram.MoveSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed *= (1 - NewProgram.MoveSpeedPerDown);
}
}
if (NewProgram.bulletSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed *= (1 - NewProgram.bulletSpeedPerDown);
}
}
//퍼센트로 만들기
if (NewProgram.SetAttackPer != 0)
{
if (PInstance != null)
{
statusManager.AttackPower *= NewProgram.SetAttackPer;
}
}
if (NewProgram.SetAttackSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed *= NewProgram.SetAttackSpeedPer;
}
}
if (NewProgram.SetMoveSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed *= NewProgram.SetMoveSpeedPer;
}
}
if (NewProgram.SetbulletSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed *= NewProgram.SetbulletSpeedPer;
}
}
//총알크기 변경
if (NewProgram.BulletScalePerUP != 0)
{
switch (playerWeapon.weaponType)
{
case Weapon.WeaponType.BasicWeapon:
Bullet changeBullet = PInstance.bulletList[0].GetComponent<Bullet>();
// 기존 크기에 BulletScalePerUP 비율만큼 크기를 증가
Vector3 currentScale = changeBullet.transform.localScale;
float scaleFactor = 1 + NewProgram.BulletScalePerUP; // 1 + 0.2 => 1.2배
changeBullet.transform.localScale = new Vector3(
currentScale.x * scaleFactor,
currentScale.y * scaleFactor,
currentScale.z * scaleFactor
);
PInstance.ReMakeBullet(0);
break;
}
}
if (NewProgram.BulletScalePerDown != 0)
{
switch (playerWeapon.weaponType)
{
case Weapon.WeaponType.BasicWeapon:
Bullet changeBullet = PInstance.bulletList[0].GetComponent<Bullet>();
// 기존 크기에 BulletScalePerUP 비율만큼 크기를 증가
Vector3 currentScale = changeBullet.transform.localScale;
float scaleFactor = 1 - NewProgram.BulletScalePerDown; // 1 + 0.2 => 1.2배
changeBullet.transform.localScale = new Vector3(
currentScale.x * scaleFactor,
currentScale.y * scaleFactor,
currentScale.z * scaleFactor
);
PInstance.ReMakeBullet(0);
break;
}
}
if (NewProgram.SetBulletScalePer != 0)
{
switch (playerWeapon.weaponType)
{
case Weapon.WeaponType.BasicWeapon:
Bullet changeBullet = PInstance.bulletList[0].GetComponent<Bullet>();
// 기존 크기에 BulletScalePerUP 비율만큼 크기를 증가
Vector3 currentScale = changeBullet.transform.localScale;
float scaleFactor = NewProgram.SetBulletScalePer;
changeBullet.transform.localScale = new Vector3(
currentScale.x * scaleFactor,
currentScale.y * scaleFactor,
currentScale.z * scaleFactor
);
PInstance.ReMakeBullet(0);
break;
}
}
//알파값 바꿔서 변경하기
if (NewProgram.ProgramName =="어택 이펙트")
{
if (bulletMa != null)
{
Color playerColor = bulletMa.color;
playerColor.a = 0.4f; // 알파값 수정
bulletMa.color = playerColor; // 색상에 알파값 반영
}
if (monBulletMa != null)
{
Color monsterColor = monBulletMa.color;
monsterColor.a = 0.2f; // 알파값 수정
monBulletMa.color = monsterColor; // 색상에 알파값 반영
}
}
// Debug.Log("AddProgram");
}
public void RemoveProgram(int ProgramNumber)
{
Player player = GameObject.FindWithTag("Player").GetComponent<Player>();
statusManager = StatusManager.Instance;
if (statusManager == null)
{
Debug.Log("statusManager is not find");
return;
}
if (ProgramList[ProgramNumber].AttackPower != 0)
{
if (Instance != null)
{
statusManager.AttackPower -= ProgramList[ProgramNumber].AttackPower;
}
}
if (ProgramList[ProgramNumber].AttackSpeed != 0)
{
if (player != null)
{
weapon = player.GetWeapon();
if (weapon != null)
{
weapon.SetAttackSpeed(-ProgramList[ProgramNumber].AttackSpeed);
}
}
}
if (ProgramList[ProgramNumber].MoveSpeed != 0)
{
statusManager.SetSpeed(-ProgramList[ProgramNumber].MoveSpeed);
}
if (ProgramList[ProgramNumber].BulletSpeed != 0)
{
if (Instance != null)
{
statusManager.BulletSpeed -= ProgramList[ProgramNumber].BulletSpeed;
}
}
//퍼센트 올린만큼 내리기
if (ProgramList[ProgramNumber].AttackPerUp != 0)
{
if (PInstance != null)
{
statusManager.AttackPower -= statusManager.AttackPower * ProgramList[ProgramNumber].AttackPerUp;
}
}
if (ProgramList[ProgramNumber].AttackSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed -= statusManager.AttackSpeed * ProgramList[ProgramNumber].AttackSpeedPerUp;
}
}
if (ProgramList[ProgramNumber].MoveSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed -= statusManager.MoveSpeed * ProgramList[ProgramNumber].MoveSpeedPerUp;
}
}
if (ProgramList[ProgramNumber].bulletSpeedPerUp != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed -= statusManager.BulletSpeed * ProgramList[ProgramNumber].bulletSpeedPerUp;
}
}
//퍼센트 내린만큼 올리기
if (ProgramList[ProgramNumber].AttackPerDown != 0)
{
if (PInstance != null)
{
statusManager.AttackPower /= (1 - ProgramList[ProgramNumber].AttackPerDown);
}
}
if (ProgramList[ProgramNumber].AttackSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed /= (1 - ProgramList[ProgramNumber].AttackSpeedPerDown);
}
}
if (ProgramList[ProgramNumber].MoveSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed /= (1 - ProgramList[ProgramNumber].MoveSpeedPerDown);
}
}
if (ProgramList[ProgramNumber].bulletSpeedPerDown != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed /= (1 - ProgramList[ProgramNumber].bulletSpeedPerDown);
}
}
//퍼센트 된거 돌리기
if (ProgramList[ProgramNumber].SetAttackPer != 0)
{
if (PInstance != null)
{
statusManager.AttackPower /= ProgramList[ProgramNumber].SetAttackPer;
}
}
if (ProgramList[ProgramNumber].SetAttackSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.AttackSpeed /= ProgramList[ProgramNumber].SetAttackSpeedPer;
}
}
if (ProgramList[ProgramNumber].SetbulletSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.BulletSpeed /= ProgramList[ProgramNumber].SetbulletSpeedPer;
}
}
if (ProgramList[ProgramNumber].SetMoveSpeedPer != 0)
{
if (PInstance != null)
{
statusManager.MoveSpeed /= ProgramList[ProgramNumber].SetMoveSpeedPer;
}
}
if (ProgramList[ProgramNumber].ProgramName == "어택 이펙트")
{
if (bulletMa != null)
{
Color playerColor = bulletMa.color;
playerColor.a = 1f; // 알파값 수정
bulletMa.color = playerColor; // 색상에 알파값 반영
}
if (monBulletMa != null)
{
Color monsterColor = monBulletMa.color;
monsterColor.a = 1f; // 알파값 수정
monBulletMa.color = monsterColor; // 색상에 알파값 반영
}
}
ProgramList.RemoveAt(ProgramNumber);
}
}
단순히 수치 값이 0이 아니면 값을 더하고 뺀다.
내가 담당했던 수치들은 단순 연산만 하면 되므로 기존 값에 +해주는 방식으로 구현했다.
각각의 함수에서 퍼센트 관련 주석 이후는 다른 팀원이 구현했다.
참고 사항
UI DownLoad
[Unity] UI 3 : DownLoad
UI DownLoadUI DownLoad의 역할설치한 프로그램들을 나열해 준다.나열된 프로그램을 클릭하면 오른쪽에 이미지, 프로그램 이름, 설명, 변경되는 능력치가 나온다.제거 버튼을 누르면 해당 프로그램이
gdoo.tistory.com
여기서 가지고 있는 PInformation List로 DownLoad UI에서 가져다 쓴다.
마무리하며..
포스팅하면서 보니까 굳이 0인 것을 체크할 필요가 있나 싶다.이후에 무조건 +연산을 해주는 방식으로 구현하면 덜 복잡하고 단순해질 것 같다.
'Unity > Hackers Window' 카테고리의 다른 글
[Unity] Item, ItemManager : (아이템, 인벤토리) (0) | 2024.11.27 |
---|---|
[Unity] UI 8 : ProgramInstall (0) | 2024.11.25 |
[Unity] UI 5, 7 - NetWork, Help (1) | 2024.11.24 |
[Unity] UI 6 : Control(환경설정 UI) (1) | 2024.11.23 |
[Unity] UI 3 : MyDocument(Inventory UI) (0) | 2024.11.22 |