개발일기
유니티#6 ScriptableObject 본문

//SkillData.cs
using UnityEngine;
[CreateAssetMenu(fileName = "SkillData", menuName = "SkillData", order = 0)]
public class SkillData : ScriptableObject {
public string skillName;
public KeyCode skillKey = KeyCode.F;
public float coolDownTime=3f;
public Vector3 skillPositionOffset=new Vector3 (0f,0f,0f);
public Vector3 skillScaleOffset=new Vector3 (1f,1f,1f);
public RuntimeAnimatorController skillAnimatorController;
}
스크립트로 작성할 수 있는 클래스 개체 같은 거
이 객체를 생성해놓고 거기에다 써놓으면 굳이 플레이어 오브젝트 컴포넌트에서 설정해줄 필요가 없다.
이걸 활용하면 스킬들을 리스트로 갖다가 관리하기에도 쉽다.
// 기존 선언
// public KeyCode skillKey = KeyCode.F;
// public float coolDownTime=3f;
// public Vector3 skillPositionOffset=new Vector3 (0f,0f,0f);
// public Vector3 skillScaleOffset=new Vector3 (1f,1f,1f);
// public RuntimeAnimatorController skillAnimatorController;
// private PlayerMove playerMove;
// private float currentTime;
// private float lastTime;
// 개선 후
public SkillData[] skillDataArray;
private float[] lastSkillTimes;
private PlayerMove playerMove;
private float currentTime;
덕지 덕지 많이도 선언하고 입력받던걸 4줄로 줄여준다.
리스트로 선언했으면 반복해줘야 하는 법

//PlayerSkill.cs void Start()
// 무결성 검사
if (playerMove == null) {
Debug.LogError("PlayerMove Script is null!");
return;
}
if (skillDataArray == null || skillDataArray.Length == 0)
{
Debug.LogError("No Skill Data assigned!");
return;
}
lastSkillTimes = new float[skillDataArray.Length];
// lastSkillTimes 초기화
for (int i = 0; i < lastSkillTimes.Length; i++)
{
lastSkillTimes[i] = Time.time;
}
무결성검사도 skillDataArray의 길이를 확인하는 방식으로 바꾸고, 한 스크립트에서 많은 스킬들을 동시다발적으로 관리하게 되었으므로 lastSkillTime도 어레이로 정리해준다.
//PlayerSkill.cs void Update()
for (int i = 0; i < skillDataArray.Length; i++)
{
// 키다운 감지
if (!Input.GetKeyDown(skillDataArray[i].skillKey)) {continue;}
// Debug.Log($"{skillDataArray[i].skillName} 사용됨");
// 시간 계산
currentTime=Time.time;
if (currentTime - lastSkillTimes[i] <= skillDataArray[i].coolDownTime) {
Debug.Log($"Skill '{skillDataArray[i].skillName}' is on cooldown!");
continue;
}
lastSkillTimes[i]=Time.time;
UseSkill(skillDataArray[i]);
}
이거야!!!!!!1내가 바라던게 이거야!!!!!!!!!!!!!!!!!
UseSkill은 원래 아무것도 안 받다가, 특정 하나의 스킬 데이터를 받아서 쓰도록 만들게 되었다. 그에 따라 사용하는 변수도 앞에 skillData.가 붙게되었고.
참고로 저기서 return 썼다가는 반복을 다 안 돌고 처음 것만 확인하게 되어버리니까 주의하자.
이제 진짜 남은 거
- skillController.cs 만들어서 적용시키기
- 충돌 잘 되는지 확인하기
- Gizmos 설정하기
다른 거
- Enemy HP 만들기
- UI와 설정창 만들기
- 스킬 봉인, 해금 아이템 만들기
'Unity' 카테고리의 다른 글
| 유니티#8 스프라이트 반복 (0) | 2024.12.27 |
|---|---|
| 유니티#7 colliderObject (0) | 2024.12.27 |
| 유니티#5 private 변수 참조 (0) | 2024.12.26 |
| 유니티#4 스크립트 정리 (2) | 2024.12.26 |
| 유니티#3 early return, 모듈화 초입 (4) | 2024.12.25 |