개발일기
유니티#7 colliderObject 본문

//PlayerSkill.cs void UseSkill(SkillData skillData)
// colliderObject
GameObject colliderObject = new GameObject(skillData.skillName+" collider");
colliderObject.transform.parent = skillObject.transform;
colliderObject.transform.localPosition = skillData.colliderPositionOffset;
BoxCollider2D collider = colliderObject.AddComponent<BoxCollider2D>();
Vector2 spriteSize = spriteRenderer.sprite.bounds.size;
collider.size = new Vector2(spriteSize.x * skillData.skillScaleOffset.x, spriteSize.y * skillData.skillScaleOffset.y);
collider.isTrigger = true;
SkillEffectHandler skillEffectHandler=colliderObject.AddComponent<SkillEffectHandler>();
skillEffectHandler.ActivateSkill(skillData.skillName);
parent 설정, spriteSize 가져오기 (spriteRenderer), isTrigger
//SkillHandler.cs
using System;
using UnityEngine;
using System.Collections.Generic; // Dictionary를 사용하기 위해 필요
public class SkillHandler : MonoBehaviour
{
// 스킬 효과를 담을 델리게이트 리스트
private Dictionary<string, Action<Collider2D>> skillEffects = new Dictionary<string, Action<Collider2D>>();
private string currentSkillName;
private PlayerMove playerMove;
private void Start()
{
playerMove=GameObject.FindWithTag("Player").GetComponent<PlayerMove>();
}
private void Update()
{
}
public void ActivateSkill(string skillName)
{
currentSkillName = skillName;
Debug.Log($"{currentSkillName} activated!");
}
private void OnTriggerEnter2D(Collider2D other) {
if (string.IsNullOrEmpty(currentSkillName))
{
Debug.LogError("Current skill name is null or empty!");
return;
}
if (!other.gameObject.CompareTag("Enemy")) {
return;
}
Debug.Log($"Trigger on {other.gameObject.name}");
Rigidbody2D rb=other.gameObject.GetComponent<Rigidbody2D>();
Enemy enemy=other.gameObject.GetComponent<Enemy>();
rb.AddForce(new Vector3(5f*(playerMove.GetDirection()?1:-1),5f,0f),ForceMode2D.Impulse);
enemy.TakeDamage(20f);
Debug.Log($"Forced on {other.gameObject.name}");
}
}
isTrigger=true;니까 OnCollisionEnter2D가 아니라 OnTriggerEnter2D 쓰는 거 유의할 것
이제 스킬마다 델리게이트 리스트만 담아줘갖고 다 다르게 설정할 수 있게 하고 그거를 갖다가 skillData에서 설정할 수 있게 하면 아주 원더풀하겠지요
근데 그거 처리도 OnTrigger2D에서 해줘야하는데
따로 함수 써야겠다
참고로 이제 그냥 colliderObject 보면 되서 Gizmos 쓸 필요가 없어졌음
//Enemy.cs
public void TakeDamage(float damage) {
hp-=damage;
if (hp<=0) {
Destroy(gameObject);
}
}
참고로 Enemy에 TakeDamage는 요렇게. hp는 public float
hp바 구현은 미래의 내가 해줄거야
해야할 거
- 스킬 델리게이트 리스트 만들어주기
다른 거
- Enemy HP바 만들기
- UI와 설정창 만들기
- 스킬 봉인, 해금 아이템 만들기+스킬 업그레이드
'Unity' 카테고리의 다른 글
| 유니티#9 델리게이트 리스트, Awake, OverlapBoxAll (1) | 2024.12.28 |
|---|---|
| 유니티#8 스프라이트 반복 (0) | 2024.12.27 |
| 유니티#6 ScriptableObject (0) | 2024.12.26 |
| 유니티#5 private 변수 참조 (0) | 2024.12.26 |
| 유니티#4 스크립트 정리 (2) | 2024.12.26 |