[Bounce Game] ๐ฅ ๋ฏธ๋๊ฒ์ ๋ง๋ค๊ธฐ 2
1. ๊ธฐ๋ณธ ํ๋ฉด ๊ตฌ์ฑํ๊ธฐ
์ด์ ๊ณผ ๊ฐ์ด Bounce Ball
์ด๋ผ๋ ํ์์ผ๋ก ๊ฒ์์ ๋ง๋ ๋ค.
๋์ ์ด๋ฒ์๋ 2D๋ก ๊ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
์ดํ 2D sprite
๋ฅผ ์์ฑํ ์์ ์ด ์ํ๋ Asset
์ ๋ฃ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ ๊ณต๊ณผ ๋
์ ๊ตฌํํด์ค๋ค.
์ด๋ ํ๋์ ๋ ์ ํฌ๊ธฐ๋ฅผ (1, 1)๋ก ์ง์ ํ์ฌ ์ฌ๋ฌ๊ฐ์ ๋ธ๋ญ์ผ๋ก ๋ ์ ๋ฐฐ์นํ๊ธฐ๋ก ํ์๋ค.
์ดํ ๋
์๋ Box Collider 2D
๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ ๊ณต์๋ Rigidbody 2D
์ Circle Collider 2D
๋ฅผ ์ถ๊ฐํด์ค๋ค.
๋ํ Player
์ Floor
ํ๊ทธ๋ฅผ ๋ง๋ค์ด์ ๋ฃ์ด์ค๋ค.
2. Jump์ ์ด๋ ๊ตฌํํ๊ธฐ
์ ํ์ ํ๋ ์ด์ด ์ด๋์ ๊ตฌํํ๊ธฐ ์ํ์ฌ ์ Bounce_Player
๋ผ๋ Script๋ฅผ ๋ง๋ ํ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
Rigidbody2D rigid;
bool _isJump;
public float JumpPower;
public float limit_speed;
void Start()
{
limit_speed = 5;
JumpPower = 3;
_isJump = true;
rigid = GetComponent<Rigidbody2D>();
}
void Update()
{
PlayerMove();
StartCoroutine(Jump());
}
void PlayerMove()
{
float h = Input.GetAxis("Horizontal");
rigid.AddForce(Vector2.right * 10 * h * Time.deltaTime, ForceMode2D.Impulse);
if (rigid.velocity.x > limit_speed)
{
rigid.velocity = new Vector2(limit_speed, rigid.velocity.y);
}
else if (rigid.velocity.x < -limit_speed)
{
rigid.velocity = new Vector2(-limit_speed, rigid.velocity.y);
}
}
IEnumerator Jump()
{
if (_isJump == false)
{
rigid.AddForce(Vector2.up * JumpPower, ForceMode2D.Impulse);
print("jump");
_isJump = true;
yield return null;
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.CompareTag("Floor")){
_isJump = false;
rigid.velocity = rigid.velocity / 2;
}
}
ํ์ง๋ง ์ด ์ฝ๋์๋ ํ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค. ๋ฐ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ ๋ฐฐ์น๋ ๋ฐ๋ฅ์ ๋ฟ๊ธฐ๋ง ํด๋ ์ ํ๊ฐ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ฏธ์ธํ๊ฒ FloorTop
์ด๋ผ๋ Sprite
๋ฅผ ๋ง๋ค๊ณ ํฌ๋ช
๋๋ฅผ 0์ผ๋ก ๋ฐ๊พผํ OnCollisionEnter2D
์ฝ๋์ CompareTag
๋ฅผ FloorTop
์ผ๋ก ๋ฐ๊พธ์ด ์ฃผ์๋ค.
3. Camera ์ด๋
๋งต์ ์ด๋ํ๋๋ฐ ์นด๋ฉ๋ผ๊ฐ ์ ์ง๋์ด ์์ผ๋ฉด ๋งต ์ฌ์ด์ฆ์ ์ ์ฝ์ ๋ฐ์์ ์นด๋ฉ๋ผ ๋ฌด๋ธ ๊ด๋ จ๋์ด Script
๋ฅผ ๋ง๋ค์ด ์ค๋ค.
์ Bounce Camera
Script๋ฅผ ๋ง๋ ํ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ค๋ค.
public GameObject player;
Vector3 target;
Vector3 velo;
void Start()
{
velo = Vector2.zero;
StartCoroutine(CameraMove());
}
IEnumerator CameraMove()
{
while (true)
{
target = player.GetComponent<Transform>().position + Vector3.back * 10;
transform.position = Vector3.SmoothDamp(transform.position, target, ref velo, 1f);
yield return null;
}
}
4. ์ฌ๋ฌ๊ฐ์ง ์ํธ์์ฉ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
๊ฒ์์์ ์ฌ์ฉํ ์ฌ๋ฌ๊ฐ์ง ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค.
์ด์ค WeakFloor
์ Jump
์๋ ์ถ๊ฐ์ ์ผ๋ก Top
์ ์ถ๊ฐํด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์ค๋ธ์ ํธ๊ฐ์ ์ํธ์์ฉ์ ์ถ๊ฐํด ์ฃผ์๋ค.
Rigidbody2D rigid;
bool _isJump;
public float JumpPower;
public float Instance_JumpPower;
public float limit_speed;
public Vector2 Start_Point;
void Start()
{
limit_speed = 5;
JumpPower = 3;
Instance_JumpPower = JumpPower;
_isJump = true;
rigid = GetComponent<Rigidbody2D>();
Start_Point = new Vector2(0, 5);
}
IEnumerator Jump()
{
if (_isJump == false)
{
rigid.AddForce(Vector2.up * Instance_JumpPower, ForceMode2D.Impulse);
_isJump = true;
Instance_JumpPower = JumpPower;
yield return null;
}
if (transform.position.y < -5)
{
Die();
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.CompareTag("FloorTop"))
{
_isJump = false;
rigid.velocity = rigid.velocity / 2;
}
else if (collision.collider.CompareTag("WeakFloorTop"))
{
_isJump = false;
rigid.velocity = rigid.velocity / 2;
}
else if (collision.collider.CompareTag("JumpTop"))
{
_isJump = false;
rigid.velocity = rigid.velocity / 2;
Instance_JumpPower = JumpPower * 1.5f;
}
else if (collision.collider.CompareTag("ThornTop") || collision.collider.CompareTag("Monster"))
{
Death();
}
else if (collision.collider.CompareTag("Coin"))
{
}
else if (collision.collider.CompareTag("Portal"))
{
Clear();
}
}
void Death()
{
rigid.velocity = rigid.velocity * 0;
transform.position = Start_Point;
}
void Clear()
{
}
๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋๋ ๋ชจ์ต์ด๋ค.
์ง๊ธ๊น์ง๋ ์ค๋ธ์ ํธ์ ๋ฟ์ผ๋ฉด ํ๋ ์ด์ด์ ์ํ์ ๋ํด์ ์กฐ์ ํ์๋ค.
๋ค์์ ์ค๋ธ์ ํธ๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ์ด๋ํ๋ ๋ฑ๋ ๊ตฌํํ ๊ฒ์ด๋ค.
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐