查看: 5544|回复: 2
打印 上一主题 下一主题

[经验分享] unity3d简单投掷骰子的脚本翻译及说明

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-5-2 14:18:44 |只看该作者 |倒序浏览

    using UnityEngine;   
    using System;   
    // 一个为摇色子服务的脚本   
    // 色子朝上的面默认为世界空间的正方向,只用1,2,3来定义世界空间   
    // 的向量,比如1代表世界的上,2代表右,3代表前   
    public delegate void RollCompleteEvent(object sender, int faceUp);   
    // 这个类代表一个六面色子的行为. 当这个类加载的时候,色子会以机   
    //作加载在空中。   
    // 当色子停下后 event RollComplete 会被激活   
    public sealed class DieBehaviour : MonoBehaviour {  
    #region "Events"   
    public event RollCompleteEvent RollComplete;  
    #endregion  
    #region "rivate 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 "rivate Methods"   
    //寻找色子哪个面朝上,将结果返回   
    private int WhichIsUp()   
    {   
      //定义maxY为负无穷   
      float maxY = float.NegativeInfinity;   
      int result = -1;   
      for(int i=0; i < 3; i++) {   
         
        //转换物体朝向到世界空间   
        Vector3 worldSpace = transform.TransformDirection(_sides);     
        // 测试哪面的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.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());   
        }   
      }   
    }  
    #endregion   
    }   

转自unity3d8.com
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

nts    

3

主题

1

听众

743

积分

初级设计师

Rank: 3Rank: 3

纳金币
7
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-10-17 11:11:43 |只看该作者
有插件哦,但物资物理效果都不是很完美哦
回复

使用道具 举报

33

主题

2

听众

3903

积分

中级设计师

Rank: 5Rank: 5

纳金币
1893
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2013-10-17 11:48:56 |只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-28 00:35 , Processed in 0.089137 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部