最近在做飞行棋项目,实现了一个投掷骰子的小功能。其中使用的Uniy自带的物理碰撞产生随机点数的功能。

设计要点:

  1. 利用Unity自带的物理系统进行投掷,与周围环境进行碰撞,增加随机性。
  2. 利用触发器判断点数。

模型结构:

  1. 骰子模型,挂上刚体组件(Rigidbody),挂上碰撞体(BoxCollider),创建挂载TouZi.cs脚本。
  2. 在骰子六个面分别放置一个空物体,挂上触发器(BoxCollider 勾选上 IsTrigger 选项,PS:我用的SphereCollider),创建挂载TouZi_Point.cs 脚本。
  3. 设置墙壁和地面约束骰子的位置,防止乱跳。

部分脚本:

TouZi_Point.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum PointType
{One = 1, Two, Three, Four, Five, Six, None
}public class TouZi_Point : MonoBehaviour
{public PointType selfType;public PointType OppositeType = PointType.None;private void OnTriggerStay(Collider other){if (other.tag == "Ground"){OppositeType = 7 - selfType;}}private void OnTriggerExit(Collider other){OppositeType = PointType.None;}public void ResetOpposite(){OppositeType = PointType.None;}/// <summary>/// 数学计算的方式/// </summary>/// <returns></returns>public float GetDot(){//Debug.Log(Vector3.Dot(Vector3.up, transform.up)+"    "+ selfType);return Vector3.Dot(Vector3.up, transform.up);}
}

比较简单不作介绍了


TouZi.cs


using System;
using System.Collections;
using System.Collections.Generic;
using HLCFrame_TouZi;
using UnityEngine;public class TouZi : MonoBehaviour
{/// <summary>/// 当骰子静止时,调用的回调。/// </summary>public event EventHandler<PointType> PointTypeCallback;[Range(10, 20)]public float explosionForce = 1;[Range(1, 10)]public float torque = 1;private bool waiting = false;private Rigidbody rig;[SerializeField]private PointType currentType = PointType.None;[SerializeField]private List<TouZi_Point> touZi_Points = new List<TouZi_Point>();private void Awake(){rig = GetComponent<Rigidbody>();}IEnumerator WaitSelfStop(){yield return new WaitForSeconds(1);while (rig.velocity.sqrMagnitude > 0.001){yield return null;}PointTypeCallback?.Invoke(this, GetCurrentType());StopAllCoroutines();waiting = false;}public void Throw(){if (waiting){return;}waiting = true;for (int i = 0; i < touZi_Points.Count; i++){touZi_Points[i].ResetOpposite();}currentType = PointType.None;rig.AddExplosionForce(explosionForce, transform.position - new Vector3(0, 0.5f, 0), 1, 0, ForceMode.Impulse);rig.AddTorque(UnityEngine.Random.onUnitSphere * torque, ForceMode.Impulse);StartCoroutine("WaitSelfStop");}public PointType GetCurrentType(){for (int i = 0; i < touZi_Points.Count; i++){if (touZi_Points[i].OppositeType != PointType.None){currentType = touZi_Points[i].OppositeType;break;}}return currentType;}///以下是 数学计算的方式,正确率 得到了提升 而且不消耗性能//float dot = 0, dot1 = 0;//private PointType GetCurrentType()//{//    dot = touZi_Points[0].GetDot();//    currentType = touZi_Points[0].selfType;//    for (int i = 0; i < touZi_Points.Count - 1; i++)//    {//        dot1 = touZi_Points[i + 1].GetDot();//        if (dot < dot1)//        {//            dot = dot1;//           currentType = touZi_Points[i + 1].selfType;//        }//    }//    return currentType;// }}

其中,

  1. 外界给 PointTypeCallback 注册回调。
  2. Throw方法供外界调用,开始抛骰子,在骰子模型下方加一个爆炸力,把它炸起来,同时给一个随机扭矩,让它朝着一个随机方向旋转起来。
  3. 开启协程等待骰子停下来。
  4. 执行回调,GetCurrentType() 方法遍历子物体,找到朝上的一面的点数,将结果传给注册的回调。

还有一种方法判断骰子朝上的点数,就是判断骰子xyz三个轴和世界的xyz三个轴的数学关系。经过测试,在效率和容错上,是优于物理碰撞检测的。有兴趣的可以自己研究一下。还可以省掉TouZiPoint这个脚本。


数学计算的方式我已经添加进去了,但是,我没有省掉 TouZiPoint 这个脚本,各个面上的空物体的 Y轴正方向,向上垂直自己附属的面,这样计算 自己的UP 和 Vector3.Up 的Dot 就行,最后判断各个 Dot 的大小,越大的 就越接近,直接取这个 touzipoint 的selfType 属性就行了.

【Unity-实现小功能-001】骰子功能相关推荐

  1. 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗

    文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...

  2. 黯然微信小程序杂记(三):微信小程序实现倒计时功能 附讲解教学 附源码

    黯然微信小程序杂记(三):微信小程序实现倒计时功能 附超详细注释 附源码 一.功能描述 二.界面展示 三.test.wxml代码 四.test.js代码(注释很详细 很易懂) CSDN私信我,有关微信 ...

  3. 字节跳动小程序接入支付功能

    我个人博客文章地址:字节跳动小程序接入支付功能 这个文章只是我做完支付后的总结,尽量写的简单易懂,也是方便自己以后忘了看一眼就能懂

  4. 微信小程序服务(功能)直达是什么?有什么作用?

    微信小程序开放服务(功能)直达入口 就在前天也就是9月28日,微信发文宣布服务(功能)直达开放,这一能力将让用户更便捷地找到所需服务,拉近商家与用户的距离.通过微信里面的搜一搜功能区搜索某一种产品或者 ...

  5. 小程序“自定义关键词”功能的常见问答

    我们知道小程序可以通过线下扫码.公众号.好友分享.长按小程序码.搜索小程序名称来找到,现在又多了一个新方式--小程序后台新增自定义关键词功能:已发布小程序的开发者,可提交最多10个与小程序业务相关的关 ...

  6. 小程序助手多功能微信小程序反编译工具

    介绍: 小程序助手多功能微信小程序反编译工具,软件采用 VS 2017 编译,需安装.net 4.0 或以上版本方可运行,理论上 win7 .win10及以上系统 x86 x64 运行正常,条件有限未 ...

  7. 微信小程序实战 购物车功能

    代码地址如下: http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com ...

  8. 有赞“小程序订阅消息”功能上线 支持商家主动推送「活动通知」

    12月7日消息,有赞微商城"小程序订阅消息"功能正式上线,设置领券.订单.签到等多个场景的授权,并支持商家主动推送营销活动类「活动通知」给消费者.目前,此功能已支持食品.服饰鞋包. ...

  9. 微信回应 WeTool 被封事件;支付宝小程序开放直播功能;Raspberry Pi 4 发布 8GB 版本| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦 ...

  10. 微信小程序实现语音识别功能

    原标题:微信小程序实现语音识别功能 使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语 ...

最新文章

  1. scala-04For与Function进阶实战、Lazy的使用
  2. OSChina 周一乱弹 —— 程序员进阶之路
  3. Gradle 2.0用户手册——总览(译)(转)
  4. Devexpress报表开发(二):创建数据报表
  5. 基于策略的一种高效内存池的实现
  6. Learning from Imbalanced Classes
  7. leetcode1247. 交换字符使得字符串相同(贪心)
  8. java读取gpx文件,从Leaflet导出GPX文件
  9. 《塔木德智慧全书》(之四)
  10. (81)Verilog HDL:状态机一段式
  11. Spring : Spring @Transactional 事物管理入口
  12. linux 内核编程 延时函数,linux中内核延时编程
  13. Django模板过滤
  14. mybati-plus自定义sql异常Invalid bound statement (not found)封装的sql查询正常
  15. A callback was made on a garbage collected delegate of type...
  16. 23andMe宣称其基因报告可以检测2型糖尿病患病风险
  17. [Javascript 高级程序设计]学习心得记录10 js函数表达式
  18. T1: String根据特定字符截取字符串
  19. 记一次USB声卡设计开发
  20. Sentinel降级服务

热门文章

  1. MiscOnStarCraft2(b)
  2. 快麦erp系统设计开发经验——整体把握
  3. Linux嵌入外部程序窗口,μClinux嵌入系统外部硬件设备快速调试||μClinux|
  4. 敏捷开发: 每个人都必须成为通才吗?
  5. 至简设计系列_定时转换的LED交通灯1
  6. 李兴华javase课堂笔记 所有
  7. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
  8. 学习英语有用的网站(转自天涯)
  9. TabLayout+ViewPager+Fragmet+RecyclerView结合的小demo
  10. 马斯克终于认错:裁掉他们是我最大的错误,但黑粉们却没能笑太久