์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๊ณ ์ด๋ค ๋ฉด์ด ๋์๋์ง ์ถ๋ ฅํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ง๋ ค๊ณ ํ๋๋ฐ ์๊ฐ๋ณด๋ค ์ฝ์ง ์๋ค์
์ ์๊ฐ์๋ 1.์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ๋ค 2.์ฃผ์ฌ์๊ฐ ๊ตด๋ฌ๊ฐ๋ค 3.์ฃผ์ฌ์๊ฐ ์ ์งํ๋ค 4.์ด๋ค๋ฉด์ด ๋์๋์ง ํ๋ณํ๋คย
์ด๋ฐ ํ๋ฆ์ผ๋ก ๊ตฌํํด ๋ณด๋ ค๊ณ ํ๋๋ฐ ๊ตด๋ฌ๊ฐ๊ธฐ๋งํ๊ณ ์ด๋ค๋ฉด์ด ๋์๋์ง ํ๋ณํ๊ฒ ์ถ๋ ฅ์ดย ์๋ฉ๋๋ค..
๋ ํํ๋ฉด์ ๋ฌผ์ด๋ณผ ์ฌ๋์ด ์์ด ์ฌ๋ ค๋ด ๋๋คย
์ ๊ฐ ์ฝ๋ฃจํด์ ์ค๋ ์ฒ์ ์จ๋ด์ ๊ฑฐ๊ธฐ์ ์ค๋ฅ๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค
using UnityEngine;
public class DiceRoll : MonoBehaviour
{
ย ย
ย private Rigidbody rb;
ย ย private bool isRolling = false;
ย ย
ย ย void Start()
ย ย {
ย ย ย ย rb = GetComponent<Rigidbody>();
ย ย }
ย ย void Update()
ย ย {
ย ย ย ย if (Input.GetKeyDown(KeyCode.Space) && !isRolling)
ย ย ย ย {
ย ย ย ย ย ย StartCoroutine(RollDice());
ย ย ย ย }
ย ย ย ย if( Input.GetKeyDown(KeyCode.Tab))
ย ย ย ย {
ย ย ย ย ย ย RepositionDice();
ย ย ย ย }
ย ย ย ย
ย ย }
ย ย void OnCollisionEnter(Collision collision)
ย ย {
ย ย ย ย if (collision.gameObject.CompareTag("Ground"))
ย ย ย ย {
ย ย ย ย ย ย isRolling = false;
ย ย ย ย ย ย
ย ย ย ย }
ย ย }
ย ย IEnumerator RollDice()
ย ย {
ย ย ย ย isRolling = true;
ย ย ย ย transform.rotation = Random.rotation;
ย ย ย ย rb.AddForce(new Vector3(Random.Range(100,200),Random.Range(300,500),Random.Range(100,200)) * 1.2f); // ๋ฌด์์ ๋ฐฉํฅ์ผ๋ก ํ์ ๊ฐํจ
ย ย ย ย rb.AddTorque(Random.onUnitSphere * 50f);
ย ย ย ย yield return new WaitUntil(() => CheckDiceStop());
ย ย ย ย CheckCurrentFace();
ย ย ย ย
ย ย }
ย ย bool CheckDiceStop(){
ย ย ย ย bool IsStop = false;
ย ย ย ย if(rb.velocity == Vector3.zero){
ย ย ย ย ย ย IsStop = true;
ย ย ย ย }
ย ย ย ย return IsStop;
ย ย }
ย ย void CheckCurrentFace()
ย ย { ย
ย ย ย ย
ย ย ย ย Vector3 diceUp = transform.up;
ย ย ย ย Vector3 diceForward = transform.forward;
ย ย ย ย Vector3 diceRight = transform.right;
ย ย ย ย if (Vector3.Dot(diceUp, Vector3.up) > 0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("3์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย else if (Vector3.Dot(diceUp, Vector3.down) < -0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("2์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย else if (Vector3.Dot(diceForward, Vector3.forward) > 0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("6์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย else if (Vector3.Dot(diceForward, Vector3.back) < -0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("1์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย else if (Vector3.Dot(diceRight, Vector3.right) > 0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("5์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย else if (Vector3.Dot(diceRight, Vector3.right) < -0.99f)
ย ย ย ย {
ย ย ย ย ย ย Debug.Log("4์ด ์๋ฅผ ํฅํ๊ณ ์์ต๋๋ค.");
ย ย ย ย }
ย ย ย ย ย ย
ย ย ย ย
ย ย }
ย ย void RepositionDice(){
ย ย ย ย transform.position = new Vector3(0,0,0);
ย ย ย ย
ย ย }
}
์ฃผ์ฌ์๊ฐ ๋ฉ์ท๋์ง์ ๋ํ ํ๋ณ์ zero๋ ๊ฐ์์ง๋ก ๋ณด๊ณ ์๋๋ฐ ์ค์ ๋ก ์ฃผ์ฌ์๊ฐ ๋ฉ์ถ๊ธดํด? ์ ๋ฐ๋ ์ด์์ธ์ง ์๋๋ฉด ์ ์ด์ ์ฃผ์ฌ์๊ฐ ์๋ฉ์ถ๋๊ฑด์ง ์์์ผ ํ ๊ฑฐ ๊ฐ์๋ฐ
์ด ๊ธ ์ฌ๋ฆฌ๊ณ ๊ณ์ ๋ง์ง์ ๋๊ณ ์์๋๋ฐ ์ด ๋ถ๋ถ๋ ๋ฌธ์ ๊ฐ ์์๋ค์. velocity์ฌ์ ํฌ๋ฌผ์ ์ด๋ ๊ทธ๋ํ ์ ๊ผญ๋๊ธฐ์์ ์๋ ฅ์ด 0 ์ธ์ค ์์๋๋ฐ ์ด๋ค ๋ฌธ์ ๊ฐ ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๋ ์๋๊ฐ 0์ผ๋ก ๋ํ๋์์ด์ ๊ณต์ค์์ ์ ์งํ๋ค๋ผ๊ณ ๊ฒฐ๊ณผ๊ฐ ๋์์๋ค์. ๋กํ!
IEnumerator RollDice() ์ด ํจ์์์ CheckDiceStop์ด ํ๋ฒ๋ง ํธ์ถ๋๊ณ ๊ทธ ์๋ฆฌ์์ ์ฐ๋ ๋๊ฐ ๋ฉ์ถฐ์์ํ ๋ฐ, ๋ฐ๋ณต๋ฌธ์ ์จ์ ์ฒดํฌ๋ฅผ ๊ณ์ํ๋๋ก ์์ ํด์ผํจ
yield return new WaitUntil(() => CheckDiceStop()); ์ด๋ ๊ฒ ๋์ด ์์ผ๋ฉด ์์์ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋๊ฑฐ ์๋?
์~ ๊ทธ๋ฌ๋ค. ๋ด๊ฐ ์๋ชป์์๊ตฌ๋ง. ใ ใ ์ด์ฉ์ง ๋ณ์๋ ๊ฐ์ง๊ฐ ๋๋๋ฐ, ํจ์๋ ์ ์๋๋ ์ถ์๋ค...ใ
WaitUntil ์ชฝ์ // ์ฃผ์ฌ์๊ฐ ๋ฉ์ถ ๋๊น์ง ๋ฃจํ ์คํ while (isRolling) { // ์ฃผ์ฌ์๊ฐ ๋ฉ์ถ์๋์ง ์ฒดํฌ if (CheckDiceStop()) { // ๋ฉ์ถ์๋ค๋ฉด ๋ฃจํ ์ข ๋ฃ ๋ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ isRolling = false; CheckCurrentFace(); } // ์งง์ ์ง์ฐ ํ์ ๋ค์ ์ฒดํฌ (๋๋ฌด ์์ฃผ ์ฒดํฌํ์ง ์๋๋ก) yield return new WaitForSeconds(0.1f); } ์ด๋ฐ์์ด๋ฉด ๋์ง์์๊น?
๋ง๋จธ๋ฆฌ ์ง๋ฌธ์ผ๋ก ๋ฐ๊ฟ์ค
๋๋ ์ด๋ณด๊ธดํ๋ฐ ๊ทธ๋ฅ 6๋ฉด์ ๋ค ๋ ์ด์บ์คํธ ์๊ฒํ๊ณ ๋ฐ๋ฅ๋ฉด ๋ฟ๋์ชฝ์ ๋ ์ด์บ์คํธ๊ฐ ์ธ์ํ๊ฒํ๋ฉด ์๋๋ ค๋ ์ด์ฐจํผ ๋ฐ๋ํธ ์ซ์๋ ์ ํด์ ธ์์ผ๋๊น
์ง๊ธ ๋ฒกํฐ ์ฐ์ฐ์์ ๋ญ๊ฐ ์๋๊ฑฐ ๊ฐ์๋ฐ
๋ฒกํฐ ์ฐ์ฐ๋ ๋ฌธ์ ๊ฐ ์ข ์์๋ค์
์ด๋ฐ๊ฑด ๋ฐ๋๋ก์ง์ผ ํธํจ
๋จผ์ ๊ฒฐ๊ณผ๋ฅผ ์ ํด๋๊ณ ๊ทธ๊ฑฐ๋๋ก ๋์ค๊ฒ ๊ตด๋ฌ๊ฐ๋ ์ฃผ์ฌ์๋ฅผ์ง๋ผ
์ด๋ฐ๋ฐฉ๋ฒ์ด ์๋์ค ๋ชฐ๋๋คใ ใ ใ
๊ฐ๋ฐ์ 20๋ ์ฐจ ํ์ด์กฐ์ธํด์ค ์ด๊ฑฐ aiํํ ๋ฌผ์ด๋ณด๋ฉด 30์ด๋ฉดํด๊ฒฐํจ ์ฌ๊ธฐ์ ์๊ฐ๋ญ๋นํ์ง๋ง์