์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๊ณ  ์–ด๋–ค ๋ฉด์ด ๋‚˜์™”๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋„ค์š”


์ œ ์ƒ๊ฐ์—๋Š” 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);
ย  ย  ย  ย 
ย  ย  }
}