纳金网

标题: unity3d简单投掷骰子的脚本翻译及说明 [打印本页]

作者: 会飞的鱼    时间: 2012-5-2 14:18
标题: unity3d简单投掷骰子的脚本翻译及说明

    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

作者: nts    时间: 2013-10-17 11:11
有插件哦,但物资物理效果都不是很完美哦
作者: Icestar    时间: 2013-10-17 11:48
谢谢分享




欢迎光临 纳金网 (http://old.narkii.com/club/) Powered by Discuz! X2.5