[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현)

2023. 4. 10. 00:05·게임개발/언데드서바이벌_골드메탈_클론코딩

https://www.youtube.com/watch?v=HPJVVcRKwn0&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=10 


1. 프리팹 만들기

스프라이트 폴더의 Props의 Bullet 0 씬창에 배치

총알 담당 스크립트(Bullet) 생성

 

데미지와 관통 변수 그리고 초기화 함수 선언

public class Bullet : MonoBehaviour
{
    //프리펩 친구들은 변수 초기화를 하는게 좋다
    public float damage;
    public int per;

    public void Init(float daamage,int per)
    {
        this.damage = daamage;
        this.per = per; 
    } 

}

- this : 해당 클래스의 변수로 접근

 

스크립트를 컴포넌트로 활용 및  Box Collider 2D 추가

Is Trigger 체크

프리펩 폴더로 드래그드랍하여 프리펩 으로 등록


2. 충돌 로직 작성


Enemy 스크립트에 OnTriggerEnter2D 함수 추가

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (!collision.CompareTag("Bullet"))
            return;
        health -= collision.GetComponent<Bullet>().damage;

        if (health > 0)
        {
            // .. Live, Hit Action
        }
        else
        {
            // Dead
            Dead();
        }
    }

- OnTriggerEnter2D 매개변수의 태그를 조건으로 활용

- Bullet 컴포넌트로 접근하여 데미지를 가져와 피격 계산하기

- 남은 체력을 조건으로 피격과 사망으로 로직을 나누기

- 사망할 땐 SetActive 함수를 통한 오브젝트 비활성화(오브젝트 풀링을 썻기 때문에 파괴하면 안된다.)

    void Dead()
    {
        gameObject.SetActive(false);
    }

 


3. 근접무기 생성

근접무기 프리펩을 풀 매니저에 등록(0번 Enemy, 1번 Bullet 0)

플레이어에 Create Empty(Weapon 0) 생성

무기 생성 및 관리를 담당하는 스크립트(Weapon) 생성 후 오브젝트에 등록

 

Weapon 스크립트 무기ID, 프리펩 ID, 데미지, 개수, 속도 변수 선언

public class Weapon : MonoBehaviour
{
    public int id;
    public int prefabId;
    public float damage;
    public int count;
    public float speed;
}

 

초기화 하는 Init 함수

    public void Init()
    {
        switch (id)
        {
            case 0:
                speed = -150;
                Batch();
                break;
            default:
                break;
        }
    }

- 무기 ID에 따라 로직을 분리할 switch 문 작성

- 마이너스로 해야 시계방향으로 돈다

 

Batch(배치하는) 함수 생성

    void Batch()
    {
        for (int index = 0; index < count; index++)
        {
            Transform bullet = GameManager.instance.pool.Get(prefabId).transform;
            bullet.parent = transform;
            bullet.GetComponent<Bullet>().Init(damage, -1); // -1 is Infinity Per.
        }
    }

- 하드코딩이 아닌 prefabId 사용

- 가져온 오브젝트의 Transform을 지역변수로 저장

- parent 속성을 통해 부모 변경

- Bullet 컴포넌트 접근하여 속성 초기화 함수 호출

- -1 같은 것은 주석을 쓰면 좋다

- start에 Init 실행

    private void Start()
    {
        Init();
    }

 

무기 관리 오브젝트의 속성을 수동으로 설정

 

Update 수정(회전)

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

        // ..Test Code..
        if (Input.GetButtonDown("Jump"))
        {
            LevelUp(20, 5);
        }
    }

- Vector3.forward * -1 = Vector3.back

 

근접 무기 프리펩의 Order in Layer를 몬스터보다 높이기(3)


4. 근접무기 배치 2

회전 이후 자신의 위쪽 방향으로 이동하는 것이 포인트

 

Weapon 스크립트의 Batch 함수의 회전 Vector3 만들기

            //회전 코드
            Vector3 rotVec = Vector3.forward * 360 * index / count;
            bullet.Rotate(rotVec);
            bullet.Translate(bullet.up * 1.5f, Space.World);

- Rotate 함수로 계산된 각도 적용

- Translate 함수로 자신의 위쪽으로 이동

- 이동 방향은 Space.World 기준으로


5. 레벨에 따른 배치

 

레벨업 기능 함수 작성

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

        if(id == 0)
        {
            Batch();
        }
    }

 

테스트 레벨업 작성

        // ..Test Code..
        if (Input.GetButtonDown("Jump"))
        {
            LevelUp(20, 5);
        }

- 점프를 누르면 20데미지의 개수는 5 추가

 

문제점

1. 원하는 것 보다 더 많이 추가된 무기들

2. 위치가 잘못 된 점

 

2번 문제 Batch 함수에 위치, 회전을 초기화 하기

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

- Quaternion.identity : 쿼터니안의 초기값

 

1번 문제 해결

        for (int index = 0; index < count; index++)
        {
            Transform bullet;

            //
            if (index < transform.childCount)
            {
                bullet = transform.GetChild(index);
            }
            else
            {
                bullet = GameManager.instance.pool.Get(prefabId).transform;
                bullet.parent = transform;
            }
            
            bullet.parent = transform;
            
            ...

- 자신의 자식 오브젝트 개수 확인은 childCount 속성

- 기존 오브젝트를 먼저 활용하고 모자란 것은 풀링에서 가져오기

- bullet.parent = transform : 부모 바꾸기

 

void Batch()
    {
        for (int index = 0; index < count; index++)
        {
            Transform bullet;

            //
            if (index < transform.childCount)
            {
                bullet = transform.GetChild(index);
            }
            else
            {
                bullet = GameManager.instance.pool.Get(prefabId).transform;
                bullet.parent = transform;
            }
            
            bullet.parent = transform;

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

            //회전 코드
            Vector3 rotVec = Vector3.forward * 360 * index / count;
            bullet.Rotate(rotVec);
            bullet.Translate(bullet.up * 1.5f, Space.World);

            bullet.GetComponent<Bullet>().Init(damage, -1); // -1 is Infinity Per.
        }
    }

깃허브 올리기

Commit : ver 1.7
Description : Spinning Melee Weapon

 

https://github.com/mekain80/CloneCode_Undead_Survivor

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com

 

'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 9 (타격감🌟있는 몬스터 처치 만들기)  (0) 2023.05.06
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현)  (0) 2023.04.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기)  (0) 2023.04.09
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기)  (0) 2023.04.09
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 5 (몬스터🧟만들기)  (0) 2023.04.07
'게임개발/언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 9 (타격감🌟있는 몬스터 처치 만들기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기)
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현)
상단으로

티스토리툴바