真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Unity幸運轉盤實戰(zhàn)項目

幸運轉盤主要是由兩部分組成——轉盤、指針,實現(xiàn)的方式也分兩種,轉盤動或者指針動,不過兩者的原理都是一樣的,這里就以指針動做了一個項目級的demo(由于后面的圓盤中間的那條豎線有點往左偏,所以導致那些圣誕老人的顯示有些偏移)。< Demo 下載 >

為隰縣等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及隰縣網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計、成都網(wǎng)站設計、隰縣網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

 Unity幸運轉盤實戰(zhàn)項目

在項目開發(fā)中,一般這個功能的實現(xiàn)過程是:

1、當點擊開始的時候,轉盤開始動, 同時向服務端發(fā)送協(xié)議;

2、服務端返回數(shù)據(jù)(前端計算好對應的角度),當轉盤旋轉一定時間后開始減速直至對應角度

當然也可以等服務端返回數(shù)據(jù)后再開始模擬旋轉過程,但是由于受網(wǎng)絡的影響,這一過程可能會較長,表現(xiàn)效果不是很好。

關于Unity的旋轉,主要有下面幾類接口:Transform.Rotate(),  Transform.RotateAround(),Transform.rotation, Transform.eulerAngles。 其中 Rotate() 和 RotateAround() 都是同一類接口(里面的具體重載這里就不細說了),都是指從當前位置做指定角度的偏移,而 rotation 和 eulerAngles 都是直接賦值的字段,rotation 是一個四元數(shù)類型, eulerAngles 則是一個歐拉角。很顯然,我們在做旋轉的時候不需要關心具體角度,使用 Rotate() 類型做定幀偏移是最合適的,通過設置偏移的角度就能實現(xiàn)變速轉動,比較適合轉盤開始階段的加速過程和中間的勻速過程,而當我們知道停止的具體角度時,則可已利用差值運算能精準地實現(xiàn)減速過程并最終停到我們需要的位置。但是有一點需要注意,Unity里面角度是逆時針計算的,而我們日常生活中一般習慣于順時針,所以,最終的角度還需要取反一下。廢話不多說,見代碼:

using UnityEngine;
using UnityEngine.UI;
 
public class LuckyTurntable : MonoBehaviour
{
 public enum State
 {
  None,  //待機狀態(tài)
  Start,  //加速階段
  Prepared, //等待數(shù)據(jù)階段
  End,  //減速階段
 }
 
 public delegate void OnFinishCallback();
 private event OnFinishCallback OnFinish;
 
 /// 
 /// 設置完成時的回調
 /// 
 /// 
 public void SetOnFinishCallback(OnFinishCallback onFinish)
 {
  OnFinish += onFinish;
 }
 
 /// 
 /// 最大速度
 /// 
 public int velocity = 3000;
 
 public Transform node;
 public Button btnStart;
 public Button btnStop;
 public Button btnRandom;
 public InputField input;
 
 private State _state;
 /// 
 /// 轉盤的狀態(tài)
 /// 
 public State CurState
 {
  get
  {
   return _state;
  }
  private set
  {
   _state = value;
   switch (value)
   {
    //不同階段限制各按鈕的點擊狀態(tài)
    case State.None:
     btnStart.enabled = true;
     btnStop.enabled = false;
     btnRandom.enabled = false;
     break;
    case State.Start:
     btnStart.enabled = false;
     btnStop.enabled = true;
     btnRandom.enabled = true;
     break;
    case State.Prepared:
    case State.End:
     btnStart.enabled = false;
     btnStop.enabled = false;
     btnRandom.enabled = false;
     break;
   }
  }
 }
 
 private float _endAngle = 0f;
 /// 
 /// 最終停止的角度[0, 360]
 /// 
 public float EndAngle
 {
  get
  {
   return _endAngle;
  }
  set
  {
   _endAngle = Mathf.Abs(value);
   print("End Angle: " + value);
   _endAngle = _endAngle % 360; //將角度限定在[0, 360]這個區(qū)間
   _endAngle = -_endAngle - 360 * 2; //多N圈并取反,圈數(shù)能使減速階段變得更長,顯示更自然,逼真
  }
 }
 
 /// 
 /// 加速持續(xù)時間
 /// 
 private readonly float AcceleateTime = 1f;
 
 /// 
 /// 減速前的最短持續(xù)時間
 /// 
 private float _minTime = 3.0f;
 /// 
 /// 角度緩存
 /// 
 private float _tmpAngle = 0f;
 /// 
 /// 時間統(tǒng)計
 /// 
 private float _time;
 /// 
 /// 速度變化因子
 /// 
 private float _factor;
 
 private void Start()
 {
  CurState = State.None;
  btnStart.onClick.AddListener(OnStartClick);
  btnStop.onClick.AddListener(OnStopClick);
  btnRandom.onClick.AddListener(OnRandomClick);
 }
 
 private void Update()
 {
  if (CurState == State.None)
   return;
 
  _time += Time.deltaTime;
  if (CurState == State.End)
  {
   //通過差值運算實現(xiàn)精準地旋轉到指定角度(球型插值無法實現(xiàn)大于360°的計算)
   float k = 2f; //如果嫌減速太慢,可以加個系數(shù)修正一下
   _tmpAngle = Mathf.Lerp(_tmpAngle, EndAngle, Time.deltaTime * k);
 
   //這里只存在一個方向的旋轉,所以不存在歐拉角萬向節(jié)的問題,所以使用歐拉角和四元數(shù)直接賦值都是可以的
   node.rotation = Quaternion.Euler(0, 0, _tmpAngle);
   //node.eulerAngles = new Vector3(0, 0, _tmpAngle);
 
   if (1 >= Mathf.Abs(_tmpAngle - EndAngle))
   {
    CurState = State.None;
    if (null != OnFinish)
    {
     OnFinish();
     OnFinish = null;
    }
   }
  }
  else
  {
   //利用一個速度因子實現(xiàn)變加速的過程
   _factor = _time / AcceleateTime;
   _factor = _factor > 1 ? 1 : _factor;
   node.Rotate(Vector3.back, _factor * velocity * Time.deltaTime, Space.Self);
  }
 
  //當收到數(shù)據(jù)之后并且旋轉了一定時間后開始減速
  if (CurState == State.Prepared && _time > _minTime)
  {
   CurState = State.End;
   _tmpAngle = GetCurClockwiseAngle();
  }
 }
 
 /// 
 /// 將當前指針的歐拉角轉換成順時針統(tǒng)計角度
 /// 
 /// 
 private float GetCurClockwiseAngle()
 {
  //由于讀取到的值是[0, 180] U [-180, 0],左邊由0至180遞增,右邊由180轉變成-180,然后遞增至0,所以需要轉相應的轉換
  return (-1) * (360 - node.eulerAngles.z) % 360;
 }
 
 private void OnStartClick()
 {
  CurState = State.Start;
  _time = 0;
 }
 
 /// 
 /// 讀取輸入框中的角度并停止
 /// 
 private void OnStopClick()
 {
  try
  {
   EndAngle = float.Parse(input.text);
  }
  catch
  {
   EndAngle = 0f;
  }
  CurState = State.Prepared;
 
 }
 
 /// 
 /// 隨機一個角度并停止
 /// 
 private void OnRandomClick()
 {
  EndAngle = UnityEngine.Random.Range(0f, 360f);
  CurState = State.Prepared;
 }
}

功能代碼基本都在上面了,如果想要Demo的話可 前往下載 。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章名稱:Unity幸運轉盤實戰(zhàn)項目
當前網(wǎng)址:http://weahome.cn/article/jhcphi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部