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

김산나

[멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 1월 23일 회고록 - 1945 아이템, 유도 본문

Unity Engine

[멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 1월 23일 회고록 - 1945 아이템, 유도

김산나 2026. 1. 23. 17:36

2026_01_23 강의 요약본

 

- 아이템 구현

- 유도탄 구현

 

1. 아이템 구현

아이템의 구현 목표는 다음과 같다.

- 적 사망 시 드랍

- 플레이어와 충돌 시 삭제

- 플레이어와 충돌 시 플레이어 공격 Up

- 카메라 뷰포트 경계에 닿으면 반대방향으로 튕기

- PowerUp 이펙트

 

먼저 아이템 오브젝트를 생성한다.

어제 배운대로 아틀라스로 나눈 프레임을 모두 선택해서 Hierarchy 창에 끌어오면

간단한 애니메이션이 적용된 오브젝트가 생성된다.

여기에 RigidBody2D(중력 제거하는 거 잊지 마시고), Collider 2D를 추가.

 

어제 배운 코드대로 아이템의 이동범위를 제한하는 방식으로 해도 되지만, 이번에는 기둥을 세워서 막는 방법을 선택해 보았다.

아이템의 코드는 다음과 같다.

using UnityEngine;

public class Item : MonoBehaviour
{
    //아이템 가속 속도
    public float ItemvelocityX = 200f;
    public float ItemvelocityY = -100f;
    Rigidbody2D rig = null;


    void Start()
    {
        rig = GetComponent<Rigidbody2D>();
        rig.AddForce(new Vector3(ItemvelocityX, -ItemvelocityY, 0f));
    }
}

 

그냥 물리 관련 내용만 적어두었다.

참고로 벽에 부딪혀 튕겨야 하기 때문에 IsTrigger는 체크 해제해 두어야 함.

 

튕기는 기능은 물리 재질 (2D)를 사용한다.

 

이름을 적당히(Bounce) 짓고, Friction(마찰)은 0, Bounciness(튕김)은 1로 설정한다.

마찰이 0이면 좀 비현실적인 움직임이 나온다. 입사각, 반사각이 초기 그대로 쭉 유지되는 느낌..?

아무튼 이 재질을

콜라이더에 달아주면 된다.

그리고 벽에 부딪히면 각도가 돌아갈 건데, 이 오브젝트는 회전하지 않고 가로 그대로 왔다갔다 할 예정이기에 

이거 세팅해 줘야 함.

z축으로 돌아가지 않게 해주는 옵션.

 

 

+ Layer

운이 개 좋아서 아이템이 여럿 뜬다면, 아이템끼리 부딪칠 수 있지 않을까?

근데 아이템끼리는 피해갔으면 좋겠다.

이런 경우에는 태그, 레이어 기능을 사용하면 좋다.

 

 

왼쪽은 충돌 물체를 인식하기 위해 썼던 태그이다. 그 옆에 있는 게 레이어.

이 레이어를 특정하고

 

 

이러면 아이템 레이어에 있는 친구들끼리는 충돌하지 않게 된다.

 

 

+ 오브젝트 배열

플레이어가 아이템을 먹어 PowerUp을 하게 되면 총알 이미지, 데미지를 다르게 하고 싶다.

이런 경우에 어떻게 설정을 해야 할까?

 

먼저 투사체 프리팹을 추가할 투사체만큼 복사하고, 스텟 조정 + 이미지 변경 + 콜라이더 범위 세팅만 해서 다시 Original 프리팹으로 만든다.

그러면 새로운 총알 장전 완료.

원래라면 

public GameObject bullet;

 

이런 식으로 총알 오브젝트를 선언했는데, 이번에는 여러 개가 들어갈 것이기 때문에

public GameObject[] bullet;

 

대괄호 하나 추가한다. 배열 생성하는 마법의 대괄호~

 

그럼 이제 인스펙터 창에 Bullet왼쪽에 작은 세모가 생긴다.

펼친 모습. 총 네 단계를 세팅해 주었다.

 

코드에서 제어를 해봅시다.

 

public class Player : MonoBehaviour

void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.CompareTag("ItemPower"))
        {
            power += 1;
            
            if(power >=3)
            {
                power = 3;
            }
            Debug.Log($"power: {power}");
            //파워업 글자 생성
            GameObject go = Instantiate(powerUpEffect, transform.position, Quaternion.identity);
            Destroy(go, 1);

            Destroy(collision.gameObject);
        }

 

트리거 함수에 태그를 추적해 충돌 시 power을 업 시켜준다.

 

    void Shoot()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(bullet[power], pos.position, quaternion.identity);            
        }
    }

 

Shoot함수를 수정한다. 거의 동일한데 bullet에 배열 번호가 들어간다.

power값이 곧 총알의 종류기 때문에 바로 넣으면 됨.EZ

 

다음 총알로 바뀐 걸 볼 수 있다.

 

 

+ [SerializeField]

이건 private변수도 인스펙터에 띄워주는 기능을 한다.

 

    [SerializeField]
    private GameObject itemPower;

private지만 인스펙터 창에서 정상적으로 확인 수정 가능하다.

 

 

 

+ [Header("헤더이름")]

인스펙터 창에서 가독성 좋게 분류하는 코드이다.

정확히는 제목을 달아준다. 가령

    [Header("아이템 오브젝트")]
    [SerializeField]
    private GameObject itemPower;
    [SerializeField]
    private GameObject itemBomb;

 

이렇게 넣어주면

 

 

이렇게 깔쌈하게 묶어준다.

 


 

2. 유도탄 구현

 

시원하게 코드 먼저 까보자

using UnityEngine;

public class Homing : MonoBehaviour
{

    // A - B 벡터는
    // A를 바라보는 벡터가 나온다

    // B - A 벡터
    // B를 바라보는 벡터

    public GameObject target;
    public float spd = 3f;
    Vector2 dir;
    Vector2 dirNo;


    void Start()
    {
        // 플레이어 태그로 찾기
        target = GameObject.FindGameObjectWithTag("Player");

        // A를 바라보는 벡터 플레이어 - 투사체
        dir = target.transform.position - transform.position;

        // 방향 벡터만 구하기 - 단위 벡터 정규화.
        dirNo = dir.normalized;

        // 업데이트에 넣으면 계속 유도
    }

    void Update()
    {
        transform.Translate(dirNo*spd*Time.deltaTime);
    }

        private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {

            //미사일 지우기
            Destroy(gameObject);
        }

    }

    void OnBecameInvisible()
    {
        Destroy(gameObject);
    }

}

 

플레이어의 위치를 향하는 방향을 어떻게 구하나요?

기벡을 안 한 사람은 모를 수도 있는데, 의외로 간단하다.

 

https://m.blog.naver.com/nowedu1/220754491852

 

벡터의 뺄셈 - 초등학생도 이해할 수 있다

벡터, 고등학생들에게 그리 반가운 단원은 아니죠? 배우기도 전에 이미 전해들은 악명에 의해 주눅들기도 ...

blog.naver.com

초딩컷을 높여주신 선생님의 설명에 따르면

 

 

B가 A로 향하는 벡터값을 구하고 싶다면

(원점에서 A로 향하는 벡터값) - (원점에서 B로 향하는 벡터값)이라고 한다.

유니티는 벡터값을 사용하기 때문에 이 공식을 그대로 사용하면 된다.

 

    void Start()
    {
        // 플레이어 태그로 찾기
        target = GameObject.FindGameObjectWithTag("Player");

        // A를 바라보는 벡터 플레이어 - 투사체
        dir = target.transform.position - transform.position;

        // 방향 벡터만 구하기 - 단위 벡터 정규화.
        dirNo = dir.normalized;

        // 업데이트에 넣으면 계속 유도
    }

 

오브젝트 생성 시 플레이어 태그의 오브젝트를 찾는다.

dir 변수에 타겟 벡터 - 현재 오브젝트의 벡터값을 담으면, 타겟이 오브젝트로 향하는 벡터값이 나오는 거임.

 

 

dirNo = dir.normalized;

 

그리고 그 값을 정규화(단위 벡터로 정리)한다.

 

시작할 때 한 번 계산해서 그 방향대로 가는 거라, 정확히는 완전 유도는 아니고 초기 1회만 유저 방향으로 가는 유도탄이 완성.

만약 저 계산식을 Update함수에 넣으면 계속 유도되는 유도탄이 될 수 있다.

 

나머지는 다른 mBullet 코드, 세팅이 동일하다.

 

 

 

+

 

는 이거로 쉽게 가능하다

Vector3.MoveTowards(pos, target, speed * Time.deltaTime);

 

MoveTowards...

암튼 이론을 배우면 쓸데가 있으니...


 

// 목표

1. 몬스터1,2 스폰만들기
2. 보스 Waring메세지 + 카메라 쉐이크
3. 보스 원형미사일 360방향 발사
4. 플레이어 레이저 UI 기를모으면 레이저나가기
5. 필살기
6. 보스 머리쪽 애니메이션마다 미사일발사 프레임별로 애니메이션 이벤트
7.텍스트메쉬프로
8. 조이스틱 에셋사용하기 모바일 버튼활용
9. 빌드
10. 출시

 

생각해 보니 오늘 금요일이다...

주말에 일부 기능을 구현해야겠다.

 

주말에 해볼 것 - 2, 3, 4 + 뒤끝 강의듣기

 

화이팅

 

 

===========================================================

 

아이템 두 개 처먹는 버그를 고쳤다 !

유도탄 사용법을 알게 되었다 !

기타 등등 알게 되었다 !