Post

Tanks #1

Tanks #1

๐Ÿคref.

  1. Unity Learn Tanks
  2. Unity Documentation

โœจUnity info
๋ณธ ํŠœํ† ๋ฆฌ์–ผ ๋ฌธ์„œ์˜ ์œ ๋‹ˆํ‹ฐ ๋ฒ„์ „์€ 5.2 v์ด๋‚˜, 2021.3.8f1 v์œผ๋กœ ์‹ค์Šต ํ›„ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.



โš™๏ธScene Setup


1. Layout๊ณผ Scene ์„ค์ •

image

๊ฐ view๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋„๋ก Layout์„ 2 by 3์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. ๋ง๋ถ™์—ฌ Inspector view์˜ ์œ„์น˜์— console view๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค. Hierarchy view์— Main Camera์™€ Directional Light๊ฐ€ ๊ธฐ๋ณธ ์˜ค๋ธŒ์ ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํ–ฅํ›„ ์ถ”๊ฐ€ํ•  Level ํ”„๋ฆฌํŒน์— lighting setup์ด ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, directional light๋Š” ์‚ญ์ œํ•ด ์ค€๋‹ค.


image

๊ฒŒ์ž„ ๋ฌด๋Œ€๊ฐ€ ๋  LevelArt ํ”„๋ฆฌํŒน


โœ๏ธ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ Œ๋”

image

LevelArt ํ”„๋ฆฌํŒน์„ Hierarchy view๋กœ ์ž„ํฌํŠธํ–ˆ์„ ๋•Œ ํ”„๋ฆฌํŒน์˜ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ๋ถ„ํ™์ƒ‰์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ URP Core์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ๋ Œ๋”๋ง ๊ณผ์ •์„ ํ•œ ๋ฒˆ ๋” ๊ฑฐ์น˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋””ํดํŠธ ๋ Œ๋”๋กœ ์ƒ์„ฑํ–ˆ์œผ๋ฏ€๋กœ, ํ…œํ”Œ๋ฆฟ์„ URP๋กœ ๋ณ€๊ฒฝํ•˜๋‹ˆ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, [Window] -> [Rendering] -> [Render Pipeline Converter] -> [Built-in to URP]๋ฅผ ์„ ํƒํ•œ ํ›„ Material Upgrade๋ฅผ ์ฒดํฌํ•ด ์• ์…‹์„ convertํ•ด๋ณด์ž.

Unity Doc ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ

  • ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ ์ •๋ฆฌ



2. Lighting

[Window] -> [Rendering] -> [Lighting]์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

Light ์„ ํƒ ์‹œ ๋œจ๋Š” ํŒจ๋„

Auto Generate์˜ ์ฒดํฌ ํ‘œ์‹œ๋ฅผ ํ•ด์ œํ•ด์ค€๋‹ค. (์›€์ง์ž„๋งˆ๋‹ค ๊ทธ๋ฆผ์ž ๋“ฑ์„ ๋‹ค์‹œ bakeํ•˜๋Š” setup์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด๋†“์•˜๋‹ค๊ณ  ํ•œ๋‹ค.)

  • Auto Generate: Unity์˜ ์กฐ๋ช…์„ ์ž๋™์œผ๋กœ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ  ์”ฌ ๋‚ด์˜ ์˜ค๋ธŒ์ ํŠธ์˜ ํ˜•ํƒœ ํ˜น์€ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ


image

๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Realtime GI๋งŒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ Baked GI ์˜ต์…˜์€ ํ•ด์ œํ•ด๋‘”๋‹ค. realtime lighting์„ ์‚ฌ์šฉํ•˜๋ฉด ํฌํƒ„์„ ๋ฐœ์‚ฌํ•  ๋•Œ Scene์„ ๋ฐํ˜€์ฃผ๋Š” ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์›€์ง์ด๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๊ด‘์›์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Realtime Lighting์€ ํ™œ์„ฑํ™”ํ–ˆ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Baked๋Š” ๋น„ํ™œ์„ฑํ™”ํ•ด๋‘์ž!

  • Realtime: ์›€์ง์ด๋Š” ๊ฐ์ฒด์—๊ฒŒ ํ–ฅํ•˜๋Š” ์กฐ๋ช…์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐ
  • Baked: ์ฃผ๋กœ ํ’๊ฒฝ์ด๋‚˜ ์ •์  ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™์ด ์›€์ง์ด์ง€ ์•Š๋Š” ์‚ฌ๋ฌผ์— ๋Œ€ํ•œ ์กฐ๋ช…์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ
  • Mixed: Realtime๊ณผ Baked๋ฅผ ๊ฒฐํ•ฉ
    • ๋ฒ ์ดํฌ๋œ ์กฐ๋ช…๋ณด๋‹ค ๋งŽ์€ ๋Ÿฐํƒ€์ž„ ๊ณ„์‚ฐ, ์‹ค์‹œ๊ฐ„ ์กฐ๋ช…๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ•„์š”


image

Directional Light ์˜ค๋ธŒ์ ํŠธ ์™ธ์—๋„ ์กฐ๋ช…์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค ! Environment Lightingํ”„๋กœํผํ‹ฐ์˜ Source๋ฅผ ์กฐ์ •ํ•ด ์ฃผ๋ณ€๊ด‘์„ ์กฐ์ •ํ•ด๋ณด์ž. ์ฃผ๋ณ€๊ด‘ ์กฐ์ •์„ ๋งˆ์น˜๋ฉด Generate Lighting ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ด์ค€๋‹ค.

  • Source: ์ฃผ๋ณ€๊ด‘. ์”ฌ ์ „์ฒด์— ํผ์ ธ ์žˆ์œผ๋‚˜ ํŠน์ • ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ด‘์›์ง€๊ฐ€ ๋˜์ง€๋Š” ์•Š์Œ (default: Skybox)
    • Color: ๋ชจ๋“  ์ฃผ๋ณ€๊ด‘์— ๊ท ์ผํ•œ ์ƒ‰์ƒ ์ ์šฉ
    • Gradient: ํ•˜๋Š˜, ์ง€ํ‰์„ , ์ง€๋ฉด์— ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฃผ๋ณ€๊ด‘์„ ์„ค์ •ํ•œ ํ›„ ๋ธ”๋ Œ๋“œ
    • Skybox: ์—ฌ๋Ÿฌ ๊ฐ๋„์—์„œ ๋น„์ถ”๋Š” ์ฃผ๋ณ€๊ด‘, Gradient ๋ณด๋‹ค ์ •ํ™•ํ•œ ํšจ๊ณผ



3. Camera Setup

image

Main Camera ์˜ค๋ธŒ์ ํŠธ์˜ ๊ธฐ๋ณธ position๊ฐ’์œผ๋กœ๋Š” LevelArt์˜ ๊ฑด๋ฌผ ๋ชจ๋ธ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Position๊ณผ Rotation์„ ์กฐ์ •ํ•ด ํ•œ ๋ˆˆ์— ๊ฒŒ์ž„ ๋งต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋˜, ์นด๋ฉ”๋ผ์˜ Projection ํ”„๋กœํผํ‹ฐ๋ฅผ Projection์—์„œ Orthographic์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋ณ€๊ฒฝ ํ›„ Scene view์™€ Game view์—์„œ ์šฐ๊ทธ๋Ÿฌ์ง„ ํ˜•ํƒœ์˜ ํ‰๋ฉด ๋งต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค !

์™œ ์šฐ๊ทธ๋Ÿฌ์ง„ ์‹œ์•ผ๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜ ?

zoom์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์›๊ทผ๊ฐ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์ •ํ™•ํ•œ ์ขŒํ‘œ๊ณ„ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


  • Projection: ์นด๋ฉ”๋ผ์˜ ์›๊ทผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์„ฑ๋Šฅ

    • Perspective: ์นด๋ฉ”๋ผ์˜ ์›๊ทผ๊ฐ์„ ๊ทธ๋Œ€๋กœ ์ ์šฉ

    • Orthographic: ์›๊ทผ๊ฐ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ท ์ผํ•˜๊ฒŒ ๋ Œ๋”๋ง

      (๊ฑฐ๋ฆฌ์— ๋”ฐ๋ฅธ scale์˜ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค. Camera ์˜ค๋ธŒ์ ํŠธ์˜ zoom ํ”„๋กœํผํ‹ฐ๋ฅผ ์กฐ์ ˆํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)


image

zoomout์„ ํ–ˆ์„ ๊ฒฝ์šฐ, ์—ฌ๋ฐฑ ํ™”๋ฉด์— ๊ทธ๋ผ๋ฐ์ด์…˜์ด ๋ณด์ด๋Š” Skybox ๋Œ€์‹  ์ง€์ •ํ•œ ์ƒ‰์˜ ๋ฐฐ๊ฒฝ์ด ๋ณด์ด๋„๋ก camera ์ปดํฌ๋„ŒํŠธ์˜ Background Type ํ”„๋กœํผํ‹ฐ๋ฅผ Solid color( RGB: (80, 60, 50) )๋กœ ๋ฐ”๊พธ์–ด์ค€๋‹ค.



โš™๏ธTank Creation & Control


1. Layers

image

Tank ์˜ค๋ธŒ์ ํŠธ์˜ Layer๋ฅผ Player๋กœ ์„ค์ •ํ•œ๋‹ค. ๋‘ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์„œ๋กœ ๊ณต๊ฒฉํ•  ๋•Œ, ๊ฑด๋ฌผ์ด๋‚˜ ๋•…์„ ์ œ์™ธํ•œ ํƒฑํฌ๋งŒ ํญํŒŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • Layer: ์นด๋ฉ”๋ผ๊ฐ€ ์ผ๋ถ€ ์”ฌ๋งŒ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜, ์ฝœ๋ผ์ด๋”๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

image

์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ๋ ˆ์ด์–ด ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€ ์ฐฝ์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ํƒฑํฌ์˜ ๊ฐ€์žฅ ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์ธ ๋ถ€๋ถ„๋งŒ ์ถฉ๋Œํ•˜๋ฉด ๋˜๋ฏ€๋กœ, No, this object only๋ฅผ ํด๋ฆญํ•ด์ค€๋‹ค.



2. Audio

image

๊ฒŒ์ž„์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ, ํƒฑํฌ์˜ ์—”์ง„์€ ํ•ญ์ƒ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ฏ€๋กœ EngineIdle ํด๋ฆฝ์„ ์„ค์ •ํ•œ ํ›„, Loop ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค. ์ดํ›„ ์˜ค๋””์˜ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•œ ํ›„, ์˜ค๋””์˜ค ์†Œ์Šค์— ์žฌ์ƒํ•  ํŠน์ • ์˜ค๋””์˜ค ํด๋ฆฝ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์žฌ์ƒ ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ๋ชจ๋‘ ํ•ด์ œํ•ด์ค€๋‹ค.


์ดํ›„ ๊ฒŒ์ž„ ๋งค๋‹ˆ์ € ์˜ค๋ธŒ์ ํŠธ์— ์˜ํ•ด์„œ ํƒฑํฌ๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ”„๋ฆฌํŒนํ™”ํ•œ๋‹ค. (Scene์— ๋‹จ์ˆœ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋‚จ์•„์žˆ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.) ํ”„๋ฆฌํŒน์œผ๋กœ ์—ฌ๋Ÿฌ ๋Œ€์˜ ํƒฑํฌ๋ฅผ ์ƒ์„ฑํ•ด ๋ฉ€ํ‹ฐ ํ”Œ๋ ˆ์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.



3. 3D Mesh

ezgif com-gif-maker (8)

DustTrail ๋ชจ๋ธ์„ ๋“œ๋ž˜๊ทธํ–ˆ์„ ๋•Œ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ

image

ํƒฑํฌ๊ฐ€ ์›€์ง์ผ ๋•Œ ํƒฑํฌ ์˜ค๋ธŒ์ ํŠธ ์ฃผ๋ณ€์— ๋จผ์ง€๊ฐ€ ๋‚ ๋ฆฌ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฐœ์ƒํ•˜๋„๋ก DustTrail ๋ชจ๋ธ์„ ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋“œ๋ž˜๊ทธํ•œ๋‹ค.

image

image

Simulation Space ํ”„๋กœํผํ‹ฐ๋ฅผ World๋กœ ์„ค์ •ํ•œ ํ›„, Emission์„ Distance๋กœ ์ง€์ •ํ•ด ์ฃผ์–ด ์ด๋™๊ฑฐ๋ฆฌ๋งˆ๋‹ค ์ž…์ž๊ฐ€ ๋ฐฉ์ถœํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • Rate over Distance: ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉ์ถœ๋˜๋Š” ์ž…์ž์˜ ์ˆ˜


image

์ž…์ž๋“ค์˜ ์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€์˜ size์™€ Lifetime. Size over Lifetime ํ”„๋กœํผํ‹ฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


ํƒฑํฌ์˜ ํŠธ๋ž™(๋ฐ”ํ€ด์˜ ์—ด)๋งˆ๋‹ค ๋จผ์ง€๊ฐ€ ๋‚ ๋ฆฌ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ, DustTrail์„ ๋ณต์‚ฌํ•ด LeftDustTrail๊ณผ RightDustTrail์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. (^D)

  • LeftDustTrail์˜ Position: ( -0.5, 0, -0.75 )
  • RightDustTrail์˜ Position: ( 0.5, 0, -0.75 )



4. TankMovement.cs

์˜ค๋””์˜ค ์„ค์ •, ์ „ํ›„ ์ด๋™, turn ์„ค์ •

  • m_: ๋ฉค๋ฒ„ ๋ณ€์ˆ˜.
    • ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ์ด๋‚˜ ์—๋””ํ„ฐ์—์„œ ๊ฒŒ์ž„์„ ๋””์ž์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณ€์ˆ˜๋Š” ๋Œ€๋ถ€๋ถ„ private์œผ๋กœ ์„ ์–ธํ•œ๋‹ค. (๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์„ฑ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง)
    • public์œผ๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒฝ์šฐ: ์†๋„, ํšŒ์ „ ์†๋„, ๊ฒŒ์ž„ ๋‚ด ๋™์ž‘ ์กฐ์ •


  • m_PlayerNumber: ํ”Œ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ.
    • tank manager๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํƒฑํฌ๊ฐ€ ์žˆ๊ณ , ์–ด๋–ค ์กฐ์ž‘์ด ์–ด๋–ค ํƒฑํฌ์— ํ• ๋‹น๋˜๋Š” ๊ฒƒ์ธ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ๋งŒ์•ฝ tank1์ด ์ด๊ฒผ์„ ๊ฒฝ์šฐ UI์— ํ”Œ๋ ˆ์ด์–ด 1์ด ์ด๊ฒผ์Œ์„ ์•Œ๋ฆฌ๊ฑฐ๋‚˜, 1์— ํ•ด๋‹นํ•˜๋Š” ์ž…๋ ฅ ํ‚ค๋“ค์ด tank1์„ ์กฐ์ข…
      • Input Manager์—์„œ๋„ ์›€์ง์ž„์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ํ”Œ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ž‘๋™ ๋ฐฉ์‹ ๊ฐ„๋žตํ™” ๊ฐ€๋Šฅ
  • m_Speed: ํƒฑํฌ์˜ ์†๋„
  • m_TurnSpeed: ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ํšŒ์ „ ๊ฐ๋„
  • m_MovementAudio: ์—”์ง„ ๋™์ž‘ ์†Œ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋””์˜ค ์†Œ์Šค
    • ์ƒํ™ฉ๋งˆ๋‹ค ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ์˜ค๋””์˜ค ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์šด์ „ํ•  ๋•Œ์™€ ์ •์ง€ํ•  ๋•Œ ๋‹ค๋ฅธ ํด๋ฆฝ ์žฌ์ƒ ๊ฐ€๋Šฅ
  • m_PitchRange: ์Œ ๋†’์ด ๋ฒ”์œ„. ์ดํ›„ ๋žœ๋ค๊ฐ’์„ ๋„ฃ์–ด ํƒฑํฌ๋งˆ๋‹ค ์—”์ง„ ์†Œ๋ฆฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•จ


image

  • Input Manager์˜ ์ž…๋ ฅ ํ‚ค๊ฐ’์„ ๋ฌธ์ž์—ด์œผ๋กœ ๋ฐ›๊ธฐ ์œ„ํ•ด m_MovementAxisName๊ณผ m_TurnAxisName ๋ชจ๋‘ String์œผ๋กœ ์„ ์–ธ
    • m_MovementAxisName ์ˆ˜ํ‰ axis
    • m_TurnAxisName: ์ˆ˜์ง axis
  • m_Rigidbody: ํƒฑํฌ์˜ ์ฐจ์ฒด๋ฅผ ์›€์ง์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • m_MovementInputValue, m_TurnInputValue: ์‹ค์ œ๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•˜์„ ๋•Œ์˜ ๊ฐ’
    • ๋ณ€์ˆ˜์— ์ž…๋ ฅ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ํ™œ์šฉ ๊ฐ€๋Šฅ
  • m_OriginalPitch: ์›๋ณธ ์†Œ๋ฆฌ์˜ ๋†’๋‚ฎ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Œ๋†’์ด ๋ณ€๊ฒฝ
    • ๋†’๋‚ฎ์ด ๊ธฐ์ค€์ด ํ˜„์žฌ pitch๊ฐ€ ๋˜๋ฉด ์—”์ง„ ํšจ๊ณผ์Œ์ด ๊ณ„์† ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Œ


4.1. Awake()

  • OnEnable(): ๊ฒŒ์ž„ ์‹œ์ž‘ ํ›„ Awake()์™€ Update() ๋ฉ”์„œ๋“œ ์‚ฌ์ด์— ํ˜ธ์ถœ
    • .isKinematic = false: ํƒฑํฌ์˜ rigidbody๊ฐ€ Kinematic์„ ๋”ฐ๋ฅด์ง€ ์•Š๋„๋ก ํ•จ
      • isKinematic: true์‹œ ๊ฐ•์ฒด๊ฐ€ ์šด๋™ํ•™์˜ ์˜ํ–ฅ๋งŒ์„ ๋ฐ›์Œ. ๋ฌผ๋ฆฌํ•™ ๊ณ„์‚ฐ ๋ฌด์‹œ
      • ๊ฐ•์ฒด๊ฐ€ ์šด๋™ํ•™์„ ๋”ฐ๋ฅผ ๊ฒฝ์šฐ ์ด๋™ํ•˜๋Š”๋ฐ ๋ฌธ์ œ ๋ฐœ์ƒ
  • OnDisable(): ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•  ๋•Œ ํ˜ธ์ถœ
    • .isKinematic = true: ํƒฑํฌ๊ฐ€ ํญ๋ฐœํ•  ๋•Œ๋Š”(๊ฒŒ์ž„ ์ข…๋ฃŒ) ๋”์ด์ƒ ํƒฑํฌ์— ํž˜์ด ๊ฐ€ํ•ด์ง€์ง€ ์•Š๋„๋ก ์šด๋™ํ•™ ์‚ฌ์šฉ


4.2. Start(), Update()

  • m_MovementAxisName, m_TurnAxisName: ๊ฐ๊ฐ ์ˆ˜ํ‰, ์ˆ˜์ง ์ด๋™ ์ถ•์— m_PlayerNumber ๋ณ€์ˆ˜๋ฅผ ๊ฒฐํ•ฉํ•ด Input Manager๊ฐ€ ์–ด๋Š ํ”Œ๋ ˆ์ด์–ด์˜ ์ด๋™๊ฐ’์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  • m_OriginalPitch: ์ด๋™ ํšจ๊ณผ์Œ์˜ ์›๋ณธ ์Œ์—ญ๋Œ€ ์ €์žฅ

image

Audio Source ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœํผํ‹ฐ (Pitch)

์˜ค๋””์˜ค ํด๋ฆฝ์ด ์Šคํฌ๋ฆฝํŠธ์— ํ• ๋‹น๋˜๋ฉด Pitch ๊ฐ’์„ ์–ป๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค!


  • Update(): ๋ชจ๋“  ํ”„๋ ˆ์ž„ ์‹คํ–‰
    • Input.GetAxis(): Input Manager์—์„œ ์ž…๋ ฅ๊ฐ’ ํ• ๋‹น
      • ํ”„๋ ˆ์ž„ update๋งˆ๋‹ค ์ž…๋ ฅ๊ฐ’์ด ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ, Update()๋ฉ”์„œ๋“œ์—์„œ Input์„ ๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•จ
      • ์ธ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ String ๋ณ€์ˆ˜
    • EngineAudio(); ๋ชจ๋“  ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ์—์„œ ์„ ์–ธ


4.3. EngineAudio()

  • ์กฐ๊ฑด๋ฌธ if()
    • ์ˆ˜ํ‰, ์ˆ˜์ง ์ด๋™๊ฐ’์ด ๋ชจ๋‘ $\vert 0.1 \vert$ ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ, ์›€์ง์ด์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ
    • MovementAudio.clip์ด EngineDriving์ด๋ผ๋ฉด EngineIdling์œผ๋กœ ๋ณ€๊ฒฝ
    • Audio pitch๊ฐ’์„ OriginalPitch ์— ๊ธฐ๋ฐ˜ํ•œ PitchRange ๋‚ด์—์„œ Random์œผ๋กœ ์ €์žฅ
  • else๋ฌธ์—์„œ๋Š” Audio clip์„ Idle์—์„œ Driving์œผ๋กœ ๋ณ€๊ฒฝ


4.4. FixedUpdate()

  • FixedUpdate(): ๋ Œ๋”๋ง๋œ ๋ชจ๋“  ํ”„๋ ˆ์ž„์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ๋ฌผ๋ฆฌ step๋“ค์„ ์‹คํ–‰
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌผ๋ฆฌ ๊ธฐ๋Šฅ(์ด๋™, ํšŒ์ „ ๋“ฑ)์„ FixedUpdate ํ•จ์ˆ˜์— ํ˜ธ์ถœ


Move()

  • ํƒฑํฌ๊ฐ€ ์›€์ง์ผ Vector ์ขŒํ‘œ ๊ณ„์‚ฐ ๋ฉ”์„œ๋“œ
  • transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime
    • ์ •๋ฐฉํ–ฅ ๋ฒกํ„ฐ์™€ ์ž…๋ ฅ๊ฐ’์„ ๊ณฑํ•ด ์ž…๋ ฅ๋Ÿ‰์— ๋”ฐ๋ผ ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ ์กฐ์ •
      • ์ž…๋ ฅ๊ฐ’์ด $1$์ผ ๊ฒฝ์šฐ ์•ž์œผ๋กœ ์ด๋™, $-1$์ผ ๊ฒฝ์šฐ ๋’ค๋กœ ์ด๋™
    • ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ด๋™ํ•  ์†๋„์™€ 1ํ”„๋ ˆ์ž„ ๋‹น ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ณฑํ•ด ํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ ์ƒ๊ด€์—†์ด ์ด๋™ ์†๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ„์‚ฐ
  • MovePosition()
    • Rigidbody ๊ฐ•์ฒด์— ์›€์ง์ž„์„ ์ ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ํ˜„์žฌ Rigidbody๊ฐ’๊ณผ ์ด๋™๊ฐ’์„ ๊ฐ€์‚ฐ


Turn()

  • m_TurnInputValue * m_TurnSpeed * Time.deltaTime: ํ”„๋ ˆ์ž„ ๋‹น ํšŒ์ „๋Ÿ‰ ๊ณ„์‚ฐ
    • ํšŒ์ „๋Ÿ‰์„ ์•Œ๊ธฐ ์œ„ํ•ด vector ๋Œ€์‹  float ์‚ฌ์šฉ
  • Quaternion.Euler: ์œ ๋‹ˆํ‹ฐ์—์„œ ํšŒ์ „์„ ๋‹ค๋ฃจ๋Š” ๊ฐ๋„๊ณ„. float๊ฐ’์„ ๋ณ€ํ™˜์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•จ
    • y์ถ•์— ํšŒ์ „๋Ÿ‰ ์ง€์ •
  • MoveRotation()
    • ๊ฐ•์ฒด์˜ rotation๊ฐ’์— turnRotation์„ ๊ณฑํ•ด์ฃผ์–ด ํšŒ์ „ ์ •๋„๋ฅผ ์ ์šฉ

ezgif com-gif-maker (9)

y์ถ• rotation์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, ํƒฑํฌ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.



5. ์Šคํฌ๋ฆฝํŠธ ์ ์šฉ

image

public ๋ณ€์ˆ˜(ํ”„๋กœํผํ‹ฐ)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋Œ€์ž…ํ•ด Tank๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์™„์„ฑํ•œ๋‹ค.


ezgif com-gif-maker (10)

๊ฒฐ๊ณผ ํ™”๋ฉด

This post is licensed under CC BY 4.0 by the author.

ยฉ yejin. Some rights reserved.