*์Œ‰์ดˆ๋ณด์ฃผ์˜*

๋…ธ์…˜์— ์ผ๊ธฐ์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฑด๋ฐ

์—ฌ๋”ฐ๊ฐ€๋„ ์˜ฌ๋ ค๋ด„




๊ตฌ์ƒ



์•„์ง ํ”„๋กœํ† ํƒ€์ดํ•‘ ๋‹จ๊ณ„๋ผ ์ž์„ธํ•œ ๊ธฐํš์€ ์ ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.


Control_GrabLedge๋Š”

1. PC๊ฐ€ ๊ณต์ค‘์— ์žˆ์„ ๋•Œ

2. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ Key โ€œSpaceโ€๋ฅผ ์ž…๋ ฅํ•˜๋ฉด

3. Hand์™€ Ledge์˜ Collide ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

4. ์ฐธ์ผ ๊ฒฝ์šฐ PC๊ฐ€ Ledge์— ๋งค๋‹ฌ๋ฆฌ๊ฒŒ ๋˜๋Š”

์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.



์—ฐ๊ตฌ


์‹œ์Šคํ…œ ๊ตฌํ˜„์— ํ•„์š”ํ•œ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


PC๊ฐ€ ์ ํ”„ ์ค‘์ธ์ง€ ์ฒดํฌ

Hand์™€ Ledge๊ฐ€ Collide ์ค‘์ธ์ง€ ์ฒดํฌ

Key โ€œSpaceโ€ ์ž…๋ ฅ ์ฒดํฌ

PC๊ฐ€ ์ถ”๋ฝํ•˜๋Š” Physics ์ผ์‹œ ์ค‘์ง€ํ•˜๊ธฐ


๊ตฌํ˜„์— ๋„์›€์ด ๋ ๋งŒํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ


์„ค๊ณ„


์ผ์ฐจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋™์ž‘์„ ์ •๋ฆฌํ•œ Flow Chart์ž…๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก
โ€œPCโ€ ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ
โ€œHandโ€ PC์˜ ์ž์‹ ์˜ค๋ธŒ์ ํŠธ, Ledge์™€ Collide ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ์šฉ๋„
โ€œLedgeโ€ ๋งค๋‹ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ง€ํ˜• ๊ตฌ์กฐ๋ฌผ

๋ณ€์ˆ˜ ๋ชฉ๋ก
โ€œgravityScaleโ€ RigidBody2D ์ปดํฌ๋„ŒํŠธ์˜ ์ „์—ญ ๋ณ€์ˆ˜, ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ›๋Š” ์ค‘๋ ฅ์˜ ๋ฐฐ์ˆ˜


๊ตฌํ˜„

์šฐ์„  โ€œHandโ€์™€ โ€œLedgeโ€๋ฅผ sprite renderer๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถ‰์€์ƒ‰ ์›์ด โ€œHandโ€์ด๊ณ , ํŒŒ๋ž€์ƒ‰ ์ง์‚ฌ๊ฐํ˜•์ด โ€œLedgeโ€์ž…๋‹ˆ๋‹ค.

๋‘ ์˜ค๋ธŒ์ ํŠธ ๋ชจ๋‘ collider ์ฝคํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , โ€œHandโ€๋Š” โ€œLedgeโ€์™€ collision ์ฒดํฌ๋ฅผ ํ•ด์•ผํ•˜๋‹ˆ rigidbody2d ์ฝคํฌ๋„ŒํŠธ๋„ ๋„ฃ์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ โ€œLedgeโ€์˜ ๊ฒฝ์šฐ PC์™€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ถฉ๋Œ์„ ํ•ด์„œ๋Š” ์•ˆ ๋˜๋‹ˆ, Ledge๋ผ๋Š” ์ด๋ฆ„์˜ ๋ ˆ์ด์–ด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ํ”„๋กœ์ ํŠธ ์„ธํŒ…์—์„œ Layer collision matrix๋ฅผ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๊ฒŒ ์„ค์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด โ€œHandโ€์™€ โ€œLedgeโ€์˜ collision์„ ์ฒดํฌํ•  ๊ณ„ํš์ด๋‹ˆ, Ledge๋ผ๋Š” ์ด๋ฆ„์˜ ํƒœ๊ทธ๋„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์‚ฌ์ „ ์ค€๋น„๊ฐ€ ๋ชจ๋‘ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

public class Ledge : MonoBehaviour { public bool inLedge = false; public bool isHanging = false; private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Ledge")) { inLedge = true; } } private void OnTriggerExit2D(Collider2D collision) { if (collision.CompareTag("Ledge")) { inLedge=false; } } }
๋จผ์ € โ€œHandโ€์™€ โ€œLedgeโ€๊ฐ€ collide ์ค‘์ธ์ง€ ์ฒดํฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Boolean ๋ณ€์ˆ˜๋ช… ์ง“๋Š” ๊ฑธ ํ•œ์ฐธ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ ์—ฌ์ „ํžˆ ๋งˆ์Œ์— ๋“ค์ง€๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค.


public class GrabLedge : MonoBehaviour { private Ledge _ledge; private Ground _ground; private Controller _controller; private Rigidbody2D _body; void Start() { _ledge = GetComponentInChildren<Ledge>(); _ground = GetComponent<Ground>(); _controller = GetComponent<Controller>(); _body = GetComponent<Rigidbody2D>(); } void Update() { if(_ledge.inLedge && !_ground.OnGround) { if (_controller.input.RetrieveJumpInput()) { _ledge.isHanging = true; _body.gravityScale = 0f; Debug.Log("it's working"); } } }


๋‹ค์Œ์œผ๋กœ ์‹ค์ œ GrabLedge ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ๋ณด๋‹ˆโ€ฆ.



๋ฌธ์ œ



๋ถ„๋ช… โ€œitโ€™s workingโ€ ๋””๋ฒ„๊ทธ ๋ฉ”์„ธ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๊ฑด๋งŒ,

์–ด์งธ์„œ์ธ์ง€ gravityScale์„ 0์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์ ์šฉ์ด ์•ˆ ๋˜๋„ค์š”.


PC๊ฐ€ ์—ฌ์ „ํžˆ ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๋ช‡ ๋ฒˆ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์•„์ฃผ ์ž ๊น์ด์ง€๋งŒ ์ธ์ŠคํŽ™ํ„ฐ ์ฐฝ์—์„œ gravityScale์ด 0์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

GrabLedge ์ด์™ธ์˜ ๋ฌด์–ธ๊ฐ€ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ gravityScale์„ ๊ณ„์†ํ•ด์„œ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๊ฒ ๋„ค์š”.


์›์ธ์€ Jump.cs ์Šคํฌ๋ฆฝํŠธ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


private void FixedUpdate() { _onGround = _ground.OnGround; _velocity = _body.velocity; if (_onGround) { _jumpPhase = 0; } if (_desiredJump) { _desiredJump = false; JumpAction(); } if (_body.velocity.y > 0) { _body.gravityScale = _upwardMovementMultiplier; } else if (_body.velocity.y < 0) { _body.gravityScale = _downwardMovementMultiplier; } else if(_body.velocity.y == 0) { _body.gravityScale = _defaultGravityScale; } _body.velocity = _velocity; }

์บ๋ฆญํ„ฐ๊ฐ€ Ledge์— ๋งค๋‹ฌ๋ ค์žˆ๋˜ ๋ง๋˜, gravityScale์„ ๊ณ„์†ํ•ด์„œ ์กฐ์ •ํ•˜๊ณ  ์žˆ์—ˆ๋„ค์š”.

(์ฐธ๊ณ ๋กœ ์ œ๊ฐ€ ์ง  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊นƒํ—ˆ๋ธŒ์—์„œ ๊ธ์–ด์˜จ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.)



๋””๋ฒ„๊น…


if (!_ledge.isHanging) { if (_body.velocity.y > 0) { _body.gravityScale = _upwardMovementMultiplier; } else if (_body.velocity.y < 0) { _body.gravityScale = _downwardMovementMultiplier; } else if (_body.velocity.y == 0) { _body.gravityScale = _defaultGravityScale; } }


Jump ์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์— ์ถ”๊ฐ€๋กœ if ๋ฌธ์„ ์‚ฌ์šฉํ•ด PC๊ฐ€ ๋งค๋‹ฌ๋ ค ์žˆ์ง€ ์•Š์„ ๋•Œ๋งŒ ๋™์ž‘๋˜๊ฒŒ๋” ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.






โ€ฆโ€ฆโ€ฆโ€ฆโ€ฆ?





๋‹ค์Œ ํŽธ์— ๊ณ„์†.







์€ ๋…ธ์…˜์—์„œ ๋ฐ”๋กœ ๋ถ™ํ˜€๋„ฃ๊ธฐ๊ฐ€ ์•ˆ ๋˜๋‹ˆ ๋„˜๋ชจ ๋ถˆํŽธํ•ด์„œ ์—ฌ๋”ฐ ๋˜ ์˜ฌ๋ฆด์ง„ ๋ชฐ๊ฒ ์Œ