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
관리 메뉴

개발일기

유니티#7 colliderObject 본문

Unity

유니티#7 colliderObject

kimjw7815 2024. 12. 27. 11:53

충돌 감지+넉백

//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와 설정창 만들기
  • 스킬 봉인, 해금 아이템 만들기+스킬 업그레이드