Unity 投掷色子 判断哪一面朝上

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
// 一个为摇色子服务的脚本
// 色子朝上的面默认为世界空间的正方向,只用1,2,3来定义世界空间
// 的向量,比如1代表世界的上,2代表右,3代表前
//public delegate void RollCompleteEvent(object sender, int faceUp);
// 这个类代表一个六面色子的行为. 当这个类加载的时候,色子会以机
//作加载在空中。
// 当色子停下后 event RollComplete 会被激活
public class TouZi : MonoBehaviour
{
	#region "Events"
	public event Func<object,int,int> RollComplete;
	#endregion
	#region "Private Members"
	//色子可能的朝向
	//Vector3.up           1(+) or 6(-)
	//Vector3.right,       2(+) or 5(-)
	//Vector3.forward];    3(+) or 4(-)
	Vector3[] _sides = {Vector3.up, Vector3.right, -Vector3.forward };
	//声明isSleeping变量为否,即开始加载rigidbody给色子
	private bool _isSleeping = false;
	#endregion
	#region "Private Methods"

	private Rigidbody rigidbody;
	
//寻找色子哪个面朝上,将结果返回
	private int WhichIsUp()
	{
		//定义maxY为负无穷
		float maxY = float.NegativeInfinity;
		int result = -1;
		for(int i=0; i < 3; i++) {
   
			//转换物体朝向到世界空间
			Vector3 worldSpace = transform.TransformDirection(_sides[i]); 
			// 测试哪面的y值更高 测正方向的面 1(+) 2(+) 3(+)
			if(worldSpace.y > maxY)
			{
				result = i+1;
				maxY = worldSpace.y;
			}
			// 测试反方向的面 6(-) 5(-) 4(-)
			if(-worldSpace.y > maxY)
			{
				result = 6-i;
				maxY=-worldSpace.y;
			}
		}
		return result;
	}
// 查看色子是否停止滚动,使rigidbody睡眠,即暂停
	private bool IsAtRest()
	{
		_isSleeping = rigidbody.IsSleeping();
		return _isSleeping;
	}
	#endregion
	#region "Unity Called Methods/Events"
	private void Start ()
	{
		rigidbody = GetComponent<Rigidbody>();
		// 以随机的方法投掷色子
		rigidbody.AddRelativeTorque(Vector3.up * ((UnityEngine.Random.value * 20) + 10));
		rigidbody.AddRelativeTorque(Vector3.forward * ((UnityEngine.Random.value * 20) + 10));
		rigidbody.AddRelativeTorque(Vector3.right * ((UnityEngine.Random.value * 20) + 10));
		rigidbody.AddRelativeForce(Vector3.up * ((UnityEngine.Random.value * 120) + 30));
		rigidbody.AddRelativeForce(Vector3.left * ((UnityEngine.Random.value * 170) + 30));
	}
	private void Update ()
	{
		// 仅仅投掷得到结果1次
		if(!_isSleeping)
		{
			if(IsAtRest())
			{
				if(RollComplete != null)
					RollComplete(this,WhichIsUp());
			}
		}

		if (Input.GetKeyDown(KeyCode.A))
		{
			Debug.Log(WhichIsUp());
		}
	}
	#endregion
}

转载http://www.manew.com/thread-9215-1-1.html

思路2
根据哪一面的法线与v3.up角度小,利用排序得出哪一个最小,就是哪一个朝上,六个面的法线为tranform.forward、tranform.up、transform.right、-tranform.forward、-tranform.up、-transform.right要与色子面对应

思路3
一个空物体,下面六个面,抛完之后,判断哪一个y值最大,哪一面就朝上

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中实现投掷手榴弹,可以按照以下骤进行: 1. 创建手榴弹模型:首先,你需要创建一个手榴弹的模型,可以使用Unity内置的3D模型,或者导入自己的模型。 2. 添加物理组件:给手榴弹添加刚体(Rigidbody)组件,以实现物理模拟。确保勾选启用重力(Geavity)选项,以便手榴弹受到重力的影响。 3. 编写投掷逻辑:创建一个脚本来处理手榴弹的投掷逻辑。在脚本中,你可以通过添加力(ApplyForce)或者施加推力(AddForce)的方式,给手榴弹一个初始的速度和方向。 4. 触发投掷:在游戏中的某个事件或者按键触发的回调函数中,调用投掷逻辑的方法,从而实现手榴弹的投掷。 下面是一个简单的示例代码,实现了手榴弹的投掷逻辑: ```c# using UnityEngine; public class GrenadeThrow : MonoBehaviour { public GameObject grenadePrefab; // 手榴弹预制体 public Transform spawnPoint; // 投掷点 public float throwForce = 10f; // 投掷力量 void Update() { if (Input.GetMouseButtonDown(0)) // 当鼠标左键按下时触发投掷 { ThrowGrenade(); } } void ThrowGrenade() { GameObject grenade = Instantiate(grenadePrefab, spawnPoint.position, spawnPoint.rotation); Rigidbody grenadeRigidbody = grenade.GetComponent<Rigidbody>(); grenadeRigidbody.AddForce(spawnPoint.forward * throwForce, ForceMode.Impulse); } } ``` 在这个示例中,我们使用了一个鼠标左键点击事件来触发投掷手榴弹的操作。你可以根据自己的需求修改代码,例如添加投掷动画、爆炸效果等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值