Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발일기

유니티#6 ScriptableObject 본문

Unity

유니티#6 ScriptableObject

kimjw7815 2024. 12. 26. 22:09

//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