用Unity实现抽卡(×)转盘机制

Posted by d77 on 2021-11-22

用Unity实现抽卡(×)转盘机制

不重要的话(不看也行:

写ds作业的时候看到一个关于unity做转盘的一个东西,还挺有意思,就摸了一下:)虽然参考链接里好像挺清楚了,但是感觉有些东西还是可以讲一下

先上链接


http://www.theappguruz.com/blog/how-to-make-a-wheel-of-fortune-in-unity-the-easiest-way

1.基本设置

  • 在转盘的每个部分边缘(中间的缝隙,并且保证能让箭头触碰到)放圆形碰撞器Circle Collider 2D,记得调一下半径,个人测试觉得还是越小越好

  • 传统转盘还得有一个箭头,位置随意,然后添加Box Collier 2DHinge Joint 2D组件

不同位置的箭头所需要设定的锚点和旋转角度都不太一样,
如果想要的话还可以加一个马力设定,做一个蓄力转盘,具体看个人需要了

2.主要实现想法

  • Animation Curves来控制轮盘的转动动画

  • 设置随机数来控制转动的角度,当然正常情况下会设置一个PRD机制伪随机什么的,本人比较懒(bushi),只做了真随机的情况。

  • 用一个协程来计算转动的角度(然后会发现写代码的人自己能知道最终会拿到什么奖,但是玩家不知道就行了())

    3.实现代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Wheelspin : MonoBehaviour
    {
    public List prize;
    public List animationCurves;

    private bool spinning;
    private float anglePerItem;
    private int randomTime;
    private int itemNumber;

    void Start()
    {

      spinning = false;
      anglePerItem = 360 / prize.Count;
    

    }

    void Update()
    {

      if (Input.GetKeyDown(KeyCode.Space) && !spinning)
      {
    
          randomTime = Random.Range(1, 3);
          itemNumber = Random.Range(0, prize.Count);
          float finalAngle = 360 * randomTime + (itemNumber * anglePerItem);
    
          StartCoroutine(SpinTheWheel(5 * randomTime, finalAngle));
      }
    

    }

    IEnumerator SpinTheWheel(float time, float finalAngle)
    {

      spinning = true;
    
      float timer = 0.0f;
      float startAngle = transform.eulerAngles.z;
      finalAngle = finalAngle - startAngle;
    
      int animationCurveNumber = Random.Range(0, animationCurves.Count);
      //这部分是选择曲线动画的,也可以不用,只用一种动画
    
      while (timer < time)
      {
          //计算轮盘z轴上的旋转角度
          float angle = finalAngle * animationCurves[animationCurveNumber].Evaluate(timer / time);
          transform.eulerAngles = new Vector3(0.0f, 0.0f, angle + startAngle);
          timer += Time.deltaTime;
          yield return 0;
      }
    
      transform.eulerAngles = new Vector3(0.0f, 0.0f, finalAngle + startAngle);
      spinning = false;
    
      Debug.Log("Prize: "+prize[itemNumber] );
    

    }

}

这里就是说,itemNumber就是最终我们停下指针看到的项;
动画曲线的Evaluate()函数返回了给定时间下曲线上的值
总体应该挺好理解的,在这个简单的基础上我们也可以配合UI做很多改动和拓展,具体看需求了。