Coder Social home page Coder Social logo

200229_unity-skill_unity's Introduction

Unity-Skill (Unity2D, Unity3D)

1. 목적

Unity 엔진과, 유튜브 강좌를 이용해서 게임에 활용할 12가지의 Unity 스킬을 학습한다.


2. 개발 범위

  • Object Pooling (오브젝트 풀링)

  • HP Bar (HP 막대)

  • Explosion Debris (폭발 파편)

  • Infinite Background (무한 배경)

  • Texture Scrolling (텍스쳐 스크롤링)

  • Camera Shaking (카메라 흔들림)

  • Parabola Shoot (포물선 발사)

  • Camera Zoom & Move (카메라 줌 & 이동)

  • Auto Turret (오토 터렛)

  • Missile (미사일 발사)

  • N * Jump (N단 점프)

  • AI Patrol (AI 순찰)


3. 개발 환경

  • Unity 2019.2.9f1 Personal
  • Visual Studio 2019

4. 주요 구현부

4.1. 오브젝트 풀링


* 설명
- 오브젝트 풀링으로 쓸 객체 변수를 선언한다.
- 객체를 저장시킬 풀(큐)를 생성한다.
- 객체를 생성한 뒤, 시작과 동시에 풀(큐)에 저장한다.


* 설명
- 사용한 객체를 풀(큐)에 반납시키는 함수를 생성한다.
- 풀(큐)에서 객체를 빌려오는 함수를 생성한다.


* 설명
- 미리 풀(큐)에 저장된 객체를 꺼낸다.


* 설명
- 활성화 될때마다 폭발하듯 날아가도록 하는 함수 (AddExplosionForce()) 이용해서 폭발 구현
- 1초마다 생성된 큐브를 풀(큐)에 반납시켜 효율성을 높인다.

4.2. HP 막대


* 설명
- 생성되는 몬스터 위치와 HP Bar를 담을 리스트를 각각 선언한다.
- 메인 카메라 변수를 선언한다.


* 설명
- 게임 오브젝트 배열을 선언하고, "Player" 태그를 찾아 저장한다.
- 게임 오브젝트 배열의 개수만큼 몬스터 위치 리스트에 오브젝트 위치를 저장한다.
- 몬스터 위치에 HP Bar 프리펩을 생성하고, 생성된 객체는 HP Bar 리스트에 추가한다.


* 설명
- HP Bar가 몬스터 머리 위를 계속 따라다니도록 WorldToScreenPoint() 함수를 이용해, 매 프레임마다 업데이트 해준다.

4.3. 폭발 파편


* 설명
- 파편 프리펩을 담을 변수를 선언한다.
- 파편이 날아갈 세기를 결정해주는 변수를 선언한다.
- 파편이 날아갈 위치에 영향을 주는 변수를 선언한다.


* 설명
- 파편 프리펩을 자기 자신의 위치로 생성한다.
- 자식 객체 큐브들의 RigidBody를 배열에 넣는다.
- 모든 큐브들을 AddExplosionForce() 함수를 이용해 폭발시킨다.


* 설명
- 좌클릭 입력 시, 클릭한 카메라 마우스 좌표에서 Ray를 발사한다.
- Ray에 닿은 객체의 Explosion() 함수를 호출한다.

4.4. 무한 배경


* 설명
- 배경을 담을 변수를 선언한다.
- 스크롤 속도 변수를 선언한다.
- 카메라 왼쪽 너머의 X 좌표를 선언하고, 다시 등장시킬 X 좌표를 선언한다.


* 설명
- 배경의 이미지 가로 사이즈를 저장하고, 이미지 길이만큼 벗어나면 사라지도록 한다.
- 총 배경의 길이 = 이미지 길이 * 갯수


* 설명
- 배경이 1초에 m_speed 속도만큼 왼쪽으로 이동한다.
- 배경이 왼쪽 너머로 사라지면 오른쪽 너머로 다시 등장시킨다.

4.5. 텍스쳐 스크롤링


* 설명
- 이동시킬 방향과 스피드를 경정할 벡터 변수를 선언한다.
- Matetial 정보가 담긴 변수를 선언하고, 시작과 동시에 생성한다.
- 매 프레임마다 Material Offset을 m_offset 변수의 값만큼 이동시킨다.

4.6. 카메라 흔들림


* 설명
- 카메라의 흔들림 세기를 결정짓는 변수를 선언한다.
- 카메라의 방향을 결정하는 변수를 선언한다.
- 카메라의 초기값을 저장할 Quaternion 변수를 선언한다.


* 설명
- 카메라의 오일러 초기값을 지정한다.
- 벡터의 축 마다 랜덤값을 부여한다.
- 흔들림 값 = 초기값 + 랜덤값
- 흔들림 값을 Quaternion으로 변환한다.
- 목적값까지 움직일때까지 while()문을 통해 반복한다. (이 과정이 반복되며 랜덤하게 흔들림) (RotateTowards() 함수 이용)


* 설명
- 초기값으로 자연스럽게 되돌리는 함수를 구현한다. (RotateTowards() 함수 이용)

4.7. 포물선 발사


* 설명
- 화살 프리펩, 화살 Transform 변수를 선언한다.
- Main 카메라를 생성 및 정의한다.


* 설명
- 스크린상의 마우스 좌표를 게임상의 2D좌표로 치환한다. (ScreenToWorldPoint() 함수 이용)
- 활이 마우스를 바라보는 방향 = 활 좌표 - 월드 상의 마우스 좌표
- 활의 x축(오른쪽)을 바라볼 방향으로 설정한다. 즉, 월드 공간에서 Transform의 빨간색 축을 바뀐 방향으로 설정한다.
- 좌클릭 입력 시, 발사하는 함수를 구현한다.
- 활 위치에 화살 프리펩 생성하고, 날아가는 속력을 x축 * 10으로 지정한다.


* 설명
- 화살이 날아가면서 계속 그 정보를 업데이트하고, 영향을 받도록 한다.
- velocity 벡터에는 속도와 방향 정보가 담겨져있다.

4.8. 카메라 줌 & 이동


* 설명
- 카메라 줌의 속도, 줌의 한계 위치값 변수를 선언한다.


* 설명
- 마우스 휠을 앞으로 굴리면 -1, 뒤로 굴리면 1을 반환한다. (GetAxis("Mouse ScrollWheel"))
- Zoom In & Out 시, 카메라 y값이 한계값보다 작아지거나, 커지면 함수를 종료한다.
- 카메라 위치 = 카메라 위치 + (정면벡터 * 방향 * 스피드)
- 마우스 휠 클릭 시, 상하좌우로 마우스를 움직이면 카메라의 위치도 따라 움직인다.

4.9. 오토 터렛


* 설명
- 객체 주변의 Collider를 검출한다. (OverlapSphere() 함수 이용)
- 가장 긴 길이를 기준으로 가장 짧은 거리를 검출한다.


* 설명
- 가장 짧은 거리의 좌표를 바라보는 회전값을 저장한다. (LookRotation() 함수 이용)
- 터렛을 계속 회전시킨다. (RotateTowards() 함수 이용)
- 오일러값에서 y축만 반영되게 수정한뒤 Quaternion으로 변환한다.
- 터렛이 조준해야하는 최종 방향을 저장하고, 총알을 발사한다.

4.10. 미사일 발사


* 설명
- 미사일 프리펩, 발사될 위치 변수를 선언한다.
- 스페이스바를 누르면 미사일이 생성되고, 위로 퉁 날아간다.


* 설명
- 주변 반경 100m 내의 특정 콜라이더를 검출한다. (OverlapSphere() 함수 이용)
- 검출된 것들 중 하나를 랜덤으로 표적 설정한다.


* 설명
- 미사일 velocity의 y값이 0 이하가 될 때까지 대기하도록한다.
- 만약 검출하지 못하는 경우, 미사일을 파괴한다.


* 설명
- 표적이 있으면 미사일을 위로 가속한다.
- 미사일의 방향과 거리를 산출한다. (표적 위치 - 미사일 위치) -> 거리는 필요없으므로, 방향만 사용한다. (normalized)
- y축을 Lerp() 함수를 이용해 부드럽게 꺾는다.


* 설명
- 미사일이 태그가 "Enemy"인 콜라이더와 충돌하면 해당 미사일과 Enemy를 파괴한다.

4.11. N단 점프


* 설명
- 점프 세기, 점프 가능 횟수, 현재 점프 시도 횟수 변수를 선언한다.
- Ray의 거리를 저장해주는 변수를 선언하고, 플레이어의 발밑 거리를 저장한다. (플레이어의 발밑 = Collider y축 절반 크기)


* 설명
- 스페이스 바 입력 시, 위로 점프를 하고, 점프 시도 횟수를 증가한다.
- 발 밑에 땅이 있는지 체크한다.
- y축 속도가 0 미만이면 -> 아래로 Ray를 쏜다. -> 닿은 오브젝트의 태그가 "Ground"이면 현재 점프 시도 횟수를 초기화한다.

4.12. AI 순찰


* 설명
- AI의 속도가 0이 되면, 다음 지역을 정찰한다.
- 마지막 인덱스에서 처음 인덱스로 다시 리셋한다.


* 설명
- SetTarget() -> 위험을 감지하면, 기존의 순찰을 취소하고, 타겟을 지정한다.
- RemoveTarget() -> 위험을 감지가 해제되면, 지정한 타겟을 취소하고, 순찰을 실행한다.


* 설명
- 위험지역으로 달려갈 Enemy를 태그를 이용해 검출한다. (OnTriggerEnter() & OnTriggerExit() 오버라이딩)


* 설명
- 적이 등장했다면, 적의 위치로 AI를 이동시킨다.

5. 참고

200229_unity-skill_unity's People

Contributors

jeongwonseok avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.