骰子模型
在网上搜索骰子模型,很容易就能找到
预制件
1.导入的骰子拖入到场景,如果是预制件变体直接取消,直接重新做一个骰子预制件
2.给骰子加上6个名字是数字的空物体,以便判断顶面,坐标尽量放在每个面的居中位置
3.给骰子添加刚体和Box Collider
脚本
public class DiceController : MonoBehaviour
{
public float MinOffsetX;
public float MaxOffsetX;
public float MinOffsetZ;
public float MaxOffsetZ;
public float MinForce;
public float MaxForce;
public float StartReadPointsTimer;
public int Points { get; private set; }
List<Transform> _faces = new List<Transform>(); //用List应对多面骰
Rigidbody _rigdbody;
private void Start()
{
_rigdbody = GetComponent<Rigidbody>();
_rigdbody.isKinematic = true;
Points = -1;
foreach(Transform face in transform)
{
_faces.Add(face);
}
}
private void Update()
{
if(Input.GetKeyDown("t"))
{
Throw();
}
if(Input.GetKeyDown("r"))
{
Debug.Log(Points);
}
}
public void Throw()
{
//随机旋转
transform.rotation = Quaternion.Euler
(
Random.Range(0f, 360f),
Random.Range(0f, 360f),
Random.Range(0f, 360f)
);
//随机位置偏移和投骰子的力度
float randomX = Random.Range(MinOffsetX, MaxOffsetX);
float randomZ = Random.Range(MinOffsetZ, MaxOffsetZ);
float randomForce = Random.Range(MinForce, MaxForce);
_rigdbody.isKinematic = false;
_rigdbody.AddForce(randomX, -randomForce, randomZ);
//指定的秒数过后执行读取骰子点数的函数
Invoke(nameof(ReadPoints), StartReadPointsTimer);
}
public void ReadPoints()
{
_rigdbody.isKinematic = true;
Transform topface = _faces[0];
foreach (Transform face in _faces)
{
if (face.transform.position.y > topface.transform.position.y)
{
topface = face;
}
}
Points = int.Parse(topface.name);
}
}
按下T键投掷骰子
按下R键读取骰子的值,如果为-1表示骰子还没有投掷完成