7de8817eda8376a167b9f68b12d21a1d8fa564f2df96ab


# RPG

1. ํšƒ๋ถˆ ์˜ค๋ธŒ์ ํŠธ ์ถ”๊ฐ€ ( ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žˆ๋Š” ํฐ ์˜ค๋ธŒ์ ํŠธ - ์‚ฌ์ด์ฆˆ๊ฐ€ 1x์•„๋‹Œ ์˜ค๋ธŒ์ ํŠธ)

2. ์บ๋ฆญํ„ฐ ์—ฌ๋Ÿฌ์ข… ์ถ”๊ฐ€

3. ์›”๋“œ๋งต ๋งˆ์„/์„ฑ/๋™๊ตด ๋“ฑ ์—ฌ๋Ÿฌ์นธ ์ฐจ์ง€ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ถ”๊ฐ€ ( ์œ„์น˜ ์ €์žฅ์€ ์ขŒ์ƒ๋‹จ ๊ธฐ์ค€, ์ž…๊ตฌ ๊ธฐ์ค€์€ ๋งˆ์šฐ์Šค ์ปค์„œ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ - hover์ž˜ ๋˜์–ด์•ผํ•จ )


# ์„œ๋ฐ”์ด๋ฒŒ๋ฅ˜

1. ์บ๋ฆญํ„ฐ 1์ข… ์  1์ข… ์ถ”๊ฐ€

2. wasd ๋ฐ ๋ฐฉํ–ฅํ‚ค ์ด๋™ ์ถ”๊ฐ€, ๊ฐ€์ƒ ์กฐ์ด์Šคํ‹ฑ ์ถ”๊ฐ€

3. ์  ์ด๋™์†๋„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๋”ฐ๋ผ์˜ค๊ธฐ ๊ธฐ๋Šฅ

4. ์  ์•„๊ตฐ hp ์ถ”๊ฐ€

5. ๋‹จ์ˆœ ๋ฏธ์‚ฌ์ผ 1์ข… ์ถ”๊ฐ€ ( ๊ธฐ๋ณธ ๊ณต๊ฒฉ๋ ฅ 5 )


--

๋ฌธ์ œ...

๊ณ ๋„์—”์ง„์˜ ๊ฒฝ์šฐ ๋‚ฑ๊ฐœ ํŒŒ์ผ์„ ๋„ฃ๋Š” ๊ฒฝ์šฐ๋Š” ์• ๋‹ˆ๋ฉ”์ดํ‹ฐ๋“œ ํ…์Šค์ณ๊ฐ€ ๋˜์ง€๋งŒ

์•„ํ‹€๋ผ์Šค ํ…์Šค์ณ ( ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ์—์„œ ์ž˜๋ผ์„œ ์ผ๋ถ€ ํ…์Šค์ณ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)

ํƒ€์ผ์…‹์— ์• ๋‹ˆ๋ฉ”์ดํ‹ฐ๋“œ ํ…์Šค์ณ๋กœ ๋ฌถ๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ( github์—๋„ ์ด์Šˆ๋งŒ ์žˆ๊ณ  ํ•ด๊ฒฐ๋ฒ•์€ ์—†์Œ)


๊ฒฐ๊ตญ ๋ฐฉ๋ฒ•์€ 2D์šฉ ๋งคํ„ฐ๋ฆฌ์–ผ์„ ๋งŒ๋“ค๊ณ  ์…ฐ์ด๋”๋กœ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํ•œํ”„๋ ˆ์ž„์”ฉ ๋„˜๊ฒจ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•ด์ค˜์•ผ๋จ


์ด๊ฒŒ ์•„๋‹ˆ๋ฉด ๊ฒŒ์ž„ ๋กœ์ง์ƒ์—์„œ ํ”„๋ ˆ์ž„์„ ํ•˜๋‚˜์”ฉ ๋„˜๊ฒจ์•ผ ๋˜๋Š”๋ฐ ๊ทธ๋Ÿฌ๋ฉด ๊ด€๋ฆฌ์ƒ ๋ถˆํŽธํ• ๊ฑฐ ๊ฐ™์•„์„œ

ํƒ€ํ”„๋กœ์ ํŠธ ์…ฐ์ด๋” ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ๊ฐ€์ ธ๋‹ค์”€


TEXTURE_PIXEL_SIZE์ธ๊ฐ€ ํ•˜๋Š” ํ…์Šค์ณ ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๋Š” ์…ฐ์ด๋” ๋‚ด๋ถ€ ์˜ˆ์•ฝ์–ด๋Š” ์•ˆ๋จนํžˆ๋Š”๊ฑฐ ๊ฐ™์•„์„œ


๋งต์นฉ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปค์Šคํ…€ ํƒ€์ผ์…‹ ์ฝ”๋“œ์ƒ์—์„œ SetShaderParam ์„ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ…์Šค์ณ์˜ ํฌ๊ธฐ๋ฅผ ๋„ฃ์–ด์คŒ


๊ทธ๋‹ˆ๊นŒ ๋™์ž‘์€ํ•จ


๋ฌธ์ œ๋Š” ์›€์งค์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ํšƒ๋ถˆ ๋งต์นฉ ๊ฒฝ๊ณ„์„ ์— ์•ฝ๊ฐ„ ์ค„์ด ๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฌด์Šจ ๋ฌธ์ œ์ธ์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๊ฒ ์Œ

(์•ฝ๊ฐ„ ์˜์‹ฌ๋˜๋Š”๊ฑด float๊ฐ’์œผ๋กœ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋‹ˆ๊นŒ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๊ทธ๋Ÿฐ๊ฑฐ ์•„๋‹Œ๊ฐ€ ์‹ถ์€๋ฐ. ์ž…๋ ฅ๊ฐ’์„ texture๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž…๋ ฅ๊ฐ’์„ vec2๋กœ ๋ฐ›๋Š”๊ฑฐ ๊ฐ™์•„์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Œ)

ํ•จ์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค๋„ ์ฐพ๊ธฐ ์–ด๋ ต๊ณ ... (์•„๋งˆ gles์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์•Œ์•„์•ผ ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€ ์‹ถ์Œ, ์ฑ…์„ ํ•˜๋‚˜ ์‚ฌ์„œ ๋ด์•ผ๋˜๋‚˜)


๊ทธ์™ธ์— ์›”๋“œ๋งต ํฐ์‚ฌ์ด์ฆˆ ๋งต์นฉ์€ ์ž˜ ๋™์ž‘ํ•จ


์ž…๊ตฌ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์€ ์ด๋™ ๋ถˆ๊ฐ€๋กœ ์„ธํŒ…ํ•˜๋Š”๊ฑด ์˜์—ญ๊ถŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๋„ฃ์„๊ฑฐ๋‹ˆ๊นŒ ์˜ค๋Š˜์€ ์Šคํ‚ตํ•ด๋„ ๋จ


ํšƒ๋ถˆ์˜ ๊ฒฝ์šฐ ๊ฐ€๋กœ 1 ์„ธ๋กœ 2์‚ฌ์ด์ฆˆ ํฐ ๋งต์นฉ์œผ๋กœ ํ•  ์˜ˆ์ •์ด์—ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ํ”ฝ์…€์ด ์ž‘์•„์„œ ์„ธ๋กœ 32๋ณด๋‹ค๋Š” ํฌ๊ณ  40ํ”ฝ์…€๋ณด๋‹ค๋Š” ์ž‘์€๊ฑฐ๋ผ

์œ„์น˜ ์žก๊ธฐ๊ฐ€ ์• ๋งคํ•œ ๋“ฏ( ์‚ด์ง ๋„ํŠธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ๋ ์ˆ˜๋„ ์žˆ๊ฒ ์Œ)


ํšƒ๋ถˆ ๊ตฌ๊ฐ„์— ์•ŒํŒŒ์ปท์•„์›ƒ์ธ๊ฐ€ ํ•˜๋Š”๊ฑธ๋กœ 2D๊ด‘์›ํšจ๊ณผ๋„ ๋„ฃ์–ด์•ผ ๋˜๋‹ˆ๊นŒ ๊ณ ๋„๊ฐค์— ์˜ฌ๋ผ์™”์—ˆ๋˜ (๊ณ ๋„์šฉ ์…ฐ์ด๋” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋Š”) 3๋งŒ์›์งœ๋ฆฌ ์ฑ…์„ ์‚ฌ์•ผ๋ ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Œ




์ž‘์—…๋๋‚˜๊ณ  ๋‚˜๋‹ˆ ์„œ๋ฐ”์ด๋ฒŒ๋ฅ˜ํ•˜๊ณ 

๋„ํŠธ ์ฐ์„ ์‹œ๊ฐ„์ด ์—†๋Š”๋ฐ... ๋ชจ๋ฅด๊ฒ ๋‹ค


๋‚ด์ผ ํ•ด์•ผ์ง€


ใ……ใ„ฑ



--- ์…ฐ์ด๋” ์ฝ”๋“œ --


shader_type canvas_item;

render_mode unshaded;


uniform sampler2D frames: hint_albedo;

uniform float count; // 4

uniform float duration; // 0.3f

uniform float textureWidth; // 1024

uniform float xInTex; // 18

uniform float yInTex; // 4, not use

uniform float chipSizeWidth; // 32


void fragment() {

float startX = xInTex / (textureWidth / chipSizeWidth);

float width = chipSizeWidth / textureWidth;

float frame = floor(mod(TIME, count * duration) / duration);

float offset = floor((UV.x - startX) / width);

COLOR = texture(frames, UV + vec2((mod(offset + frame, count) - offset) * width, 0));

}