카테고리 없음

24-09-05 개인 프로젝트 : Geometry Survivor 05

몰록 2024. 9. 5. 20:51

일단 유튜브 강의를 따라하기로 해봤다. 

 

 

오늘 구현한 내용은 회전하는 구체(근접무기) 구현과 적과의 충돌시 체력이 깎이는 판정이다.

 

 

Orb Script

먼저 무기(Orb) 스크립트다. damage와 per(관통력?)을 선언해주고 Init으로 매개 변수를 만들어준다.

 

그리고 적이 무기와 충돌했을때 생기는 일을 만들어주자

 

Enemy Script

OnTriggerEnter2D를 사용해서 충돌 판정을 만들고 if문으로 그것이 Weapon 태그의 콜라이더인지를 검사를 해준다.

Weapon이 아닐 경우에 실행되지 않도록 해줬다.

 

Enemy Script

이제 Weapon일 경우엔 Enemy의 health 값에 Orb의 damage만큼 빼주게 해도록 했다.

 

Enemy Script

이제 health값에 따른 리액션을 만들어줬는데 health가 0이하가 될 경우에 사라지도록(Dead) 했다. 죽는 함수가 Destroy가 아니라 SetActive(false)인 이유는 오브젝트 풀링을 사용하기 때문. PoolManager를 통해 새로운 Enemy를 생성할때 비활성화된 개체가 남아있으면 그걸 가져오도록 하기 때문에 리소스를 아낄수 있는 메소드가 된다.

 

 

이제 이 무기를 자동으로 배치해줄 시간. 이건 더욱 복잡하다.

 

Orbit Script

 

Orb를 자식으로 두고 배치,회전시킬 오브젝트 Orbit을 만들었다. 그 뒤에 필요한 함수들을 선언해줬는데..

 

id 개념을 사용하기 시작했다. Orb가 한종류 이상이 될수 있기 때문에 id별로 다르게 배치,회전시키도록 하는것이다.

 

이하 Orbit 전문

더보기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Orbit : MonoBehaviour
{

    public int id;
    public int prefabId;
    public float damage;
    public int count;
    public float speed;

    private void Start()
    {
        Init();
    }

    void Update()
    {
        switch (id)
        {
            case 0:
                transform.Rotate(Vector3.back * speed * Time.deltaTime);


                break;
            default:
                break;
        }

        // test
        if (Input.GetButtonDown("Jump"))
        {
            LevelUp(1,1);
        }

    }

    public void LevelUp(float damage, int count)
    {
        this.damage = damage;
        this.count += count;

        if (id == 0)
            Batch();


    }

    public void Init()
    {
        switch (id)
        {
            case 0:

                speed = 150;
                Batch();



                break;
            default:
                break;
        }
    }

    void Batch()
    {
        for (int index=0; index < count; index++)
        {
            Transform Orb;
                
            if(index < transform.childCount)
            {
                Orb = transform.GetChild(index);
            }
            else
            {
                Orb = GameManager.Instance.pool.Get(prefabId).transform;
                Orb.parent = transform;
            }

            Orb.localPosition = Vector3.zero;
            Orb.localRotation = Quaternion.identity;

            Vector3 rotVec = Vector3.forward * 360 * index / count;

            Orb.Rotate(rotVec);
            Orb.Translate(Orb.up * 2f, Space.World);
            Orb.GetComponent<Orb>().Init(damage, -1); // -1 is Infinit Per
        }
    }

}