프로그래밍 농장

유데미 스타터스 유니티 1기 취업 부트캠프 - 10주차 학습 일지 본문

STARTERS

유데미 스타터스 유니티 1기 취업 부트캠프 - 10주차 학습 일지

Tennessee201 2022. 8. 28.
728x90

이번주는 유니티 내에서 마야, 블랜더와 같은 그래픽 프로그램과 유사한 기능을 제공하는 ProBuilder에 대한 사용법과 이를 활용한 다양한 프로젝트 구현방식을 학습하였다. 

그리고 매주 교육과정을 통해 배우는 새로운 기능들을 실제로 토이프로젝트에 반영하여 진행하고 있는데, 이번주에는 Raycast를 활용하여 플레이어가 적의 일정범위 내에 접근하였을시, 적이 플레이어를 인식하고 일정기간마다 Raycast를 인식방향으로 쏴서, 총알을 발사하고 플레이어는 이를 피해 도망치는 미니게임을 구현하였다.

추가적으로는, 최근 구매한  '유니티 C# 스크립팅 마스터하기' 라는 책을 통해 같은 책을 구매한 스터디원들끼리 유니티에 대한 기본부터 심화적 개념을 다지기 위한 스터디도 격일마다 진행하고 있어서, 해당 내용까지 이번 포스팅에 정리하고자 한다. 

 


- ProBuilder

'프로빌더' 란, 포스팅 서론에서 잠시 언급하였듯이, 마야와 블랜더와 같은 그래픽 프로그램이 제공하는 기능들을 유니티 에디터상에서 어느정도 구현할수있는 기능이다. 

일단 프로빌더를 사용하기 위해서는, 유니티 에디터상에서 ProBuilder와 ProGird 총 두가지를 임포트 해주어야한다. 

위 두가지를 임포트해주게 되면, 유니티 에디터상에서 오브젝트를 생성할때 추가로 2가지 옵션이 더 생성되게된다.

절차적 셰이프를 활용한 오브젝트 생성

 

주요기능으로는, 돌출 및 삽입 / 폴리 셰이프 / 동적 사용자 인터페이스 / 씬 내 UV 컨트롤 / 절차적 셰이프 / 버텍스 컬러링  이 있다고 한다. 

돌출 및 삽입 (출처 : 유니티 코리아)

 

폴리 셰이프 (출처 : 유니티 코리아)

 

동적 사용자 인터페이스 (출처 : 유니티 코리아)

 

씬 내 uv컨트롤 (출처 : 유니티 코리아)

 

절차적 셰이프 (출처: 유니티 코리아)

 

버텍스 컬러링 (출처 : 유니티 코리아)

 

 

처음에 Probuilder를 접했을때는 단순한 오브젝트 편집등 제한적인 기능이라고 생각하였는데, 프로빌더에 대한 사용법과 후기들을 구글링해볼수록 생각보다 많은 기능을 제공하고 응용하여 활용할수있다는것을 깨달았다. 

유니티 코리아에서 한마디로 정의하는 프로빌더는 아래와 같다고 한다 .

 

ProBuilder로 오브젝트를 단시간 내에 프로토타이핑하거나
커스텀 충돌 지오메트리, 트리거 구역,내브 메시를 만들 수 있습니다!

 

아래는 유니티 코리아의 공식 홈페이지에서 제공하는 ProBuilder에 대한 활용예시이다. 

 

[유니티 기능소개] 유니티 ProBuilder(프로빌더)

유니티 프로빌더(ProBuilder) Unity 에디터에서 월드 구축하기 이제 Unity의 일부가 된 ProBuilder는...

blog.naver.com

 


10주차 토이 프로젝트 

 

포스팅 초반에 잠시 언급하였듯이, 스타터스 강의를 통해 학습한 Raycast을 활용한 미니게임을 구현하였다. 

Raycast는 현업에서도 충돌 및 인식처리를 구현할때 많이 쓰이며, collision 등의 방식보다 상대적으로는 메모리가 더 들어가지만 충분히 가벼우며, 더 확실한 방법이라고 배웠기에 실제 게임에 적용해보고싶었다. 

 

게임의 기본적인 방법은 단순하다. 플레이어가 다음블록까지 경찰의 레이더를 피해 도망가면된다. 경찰의 순찰범위에 플레이어가 잡히게되면, 경찰은 플레이어를 향해 3초마다 Raycast를 쏘며 해당 position으로 총을 발사한다. 

+ 플레이 화면 녹화가 안되어 사진으로 대체 ..ㅠ

 

아래 스크립트는 경찰(Enemy)에 대한 스크립트이며, 간단한 스크립트 설명은 주석으로 첨부하였다.

 

EnemyController.cs 

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

public class Enemy_Controller : MonoBehaviour
{
    Coroutine enumerator;


    Animator anim;
    float MaxDistance = 25f;  // Ray를 쏠 거리 

    public GameObject BulletPrefabs;
    public Transform bulletSpawn;


    RaycastHit hit;
    public GameObject Player;
    public LayerMask Layer_Player;
    [Header("근접 범위")]
    [SerializeField] [Range(1f, 4f)] float ScanDistance = 5f;

    bool isShoot;

    private void Awake()
    {
        anim = GetComponent<Animator>();
    }


    // Update is called once per frame
    void Update()
    {
        Enemy_Scan();
    }



    void  Enemy_Scan()
    {
        //Player 포지션과 Enemy 포지션 사이 값을 구함 (객체간 거리) 
        Vector3 delta = Player.transform.position - this.transform.position;
        float dist = delta.magnitude;

        //객체간 거리가 20 이하이면 Enemy가 Player 바라보기
        if (dist <= 15)
        {
            //Quaternion.LookRotation 이용하여 Quaternion 변수를 생성하고 
            //Quaternion.Slerp 이용하여 Enemy가 Player를 자연스럽게 바라보게 함
            //Quaternion rot = Quaternion.LookRotation(delta);

            transform.LookAt(Player.transform.position);
            Vector3 temp = transform.rotation.eulerAngles;
            transform.rotation = Quaternion.Euler(0, temp.y, 0);
            //transform.rotation = Quaternion.Slerp(transform.rotation, rot, 5 * Time.deltaTime);

            //Coroutine 실행하여 3초 기준으로 Player 공격
            if (enumerator == null)
                enumerator = StartCoroutine("Enemy_Shoot");

        }
        }

    IEnumerator Enemy_Shoot()
    {
       

        // 실제 레이캐스트를 사용하는 아래의 함수는 시작점과 방향을 인자로 받는다 !! 
        if (Physics.Raycast(transform.position + new Vector3(0, 0.5f, 0), Player.transform.position - transform.position, out hit, MaxDistance, Layer_Player))
        {
            //레이캐스트 디버그로 표시
            Debug.DrawRay(transform.position + new Vector3(0, 0.5f, 0), Player.transform.position - transform.position, Color.red, 1f);

            //레이캐스트에 걸린 오브젝트
            GameObject onHitTarget = hit.collider.gameObject;

            //레이캐스트에 걸린 오브젝트 tag가 Player일시(=조준완료시)
            if (onHitTarget.tag == "Player")
            {
                anim.SetTrigger("IsShoot");
                //위의 애니메이션 수행하면서 함수 실행 
                Debug.Log("발사");
                fire();
                // hit.point()

            }
        }
        yield return new WaitForSeconds(3f); // 3초마다 발사수행

        enumerator = null;
    }

    void fire()
    {
        GameObject bullet = (GameObject)Instantiate(BulletPrefabs, bulletSpawn.position, bulletSpawn.rotation);

        bullet.GetComponent<Rigidbody>().velocity = (Player.transform.position - transform.position) * 2.0f;
    }

}

 

추가적으로 플레이어의 이동과 카메라 시점전환은 아래와 같이 설정하였다. 

기존 기능구현을 하며 주로 적용하였던 리지드바디와 콜리전이 통합된 Character Controller를 사용하여 좀더 체계적인 구현방식을 사용해보았다. 카메라시점 또한 Cinematic 과 virtual cinematic을 활용하여, 시점전환에 있어 더욱 실제 게임과 같은 현실감이 있도록 구현하였다. 


- 스터디 내용

마지막으로 매주진행하고있는 스터디내용을 간략히 정리하고 포스팅을 마무리하고자 한다. 위에서 간단히 언급하였듯이, 아래의 책을 활용하여 유니티와 C# 스크립팅에 대한 스터디를 진행하고있으며 이번주에는 C# 스크립트 기본과 유니티에디터 상에서 제공하는 디버깅 기능에 대하여 학습하였다.

스터디 방식은 각자 당일 진행할 차시에 대한 예습을 간단히 수행하고, 본인이 공유할수있는 내용이나, 같이 학습해보고자 하는 내용을 가져와 진행하는 방식이다 .

이번주는 특히 디버그에 관한 내용에서 학습한 부분이 기억에 많이 남았다. 일반적으로 '디버그'라고 한다면, 에러나 경고를 콘솔창에서 확인할수있도록 하는 기능정도로 인식하고 있었는데, 생각보다 이 디버그가 매우 중요한 부분이라는것을 깨달았다. 

기존에 알고있던것과 같이, 단순히 에러체크용을 넘어, 위의 Raycast에서 보듯이, 실제로 확인을 시켜주는 기능이라고 좀 더 넓게 이해할수도있다. 

아래와 같이 Raycast를 쏜 방향과 거리에 대한 것을 사용자가 직접 Scene창에서 확인할수도 있을것이다. 

 

이 외에도 디버그는 유니티 프로그램 내에서 현재 메모리 리소스 등을 얼마나 차지하고있는지에 대한 부분도 실시간으로 제공한다. 

이 부분은 이번년도 초 주먹구구식으로 에셋을 가져다 쓰다가 유니티상 메모리가 터졌을때 본인이 문제를 해결할때 사용했던 기능인데, 당시에는 유니티버전이 달라, editor log -> 메모장에서 사용 리소스별 %수치를 확인할수있었는데, 현재는 좀더 구체화되어서 아래와 같이 업그레이드 되었다 . 

<업그레이드 된 유니티 메모리 프로파일러>

 

 

이번 한주도 다양한 학습과 이런내용들을 토이프로젝트에 실제 적용하고 이리저리 뜯어고치며 공부하다보니 어느새 금방 지나갔다.

 

어느덧 여름도 다 가고 벌써 쌀쌀해지고있는데 요즘따라 정말 시간이 빠르다고 느낀다.. 

이럴때일수록 맘을 다잡고 12월까지 열심히 부트캠프과정을 달려나가서 좋은 결실을 맺고싶다 !

 

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

 

Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea

유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.

www.udemykorea.com

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

 

#유데미, #유데미부트캠프, #취업부트캠프, #개발자부트캠프, #IT부트캠프, #부트캠프후기

728x90