Unity游戏开发日记-炉石传说之卡牌切换效果实现

如何控制一张卡牌的随机切换,答案是只需要在固定时间,更改他的UI Sprite的spriteName即可。
step:1.先把所有名字存到数组中
2.取得生成卡牌的UISprite(NGUI创建的),才可更改name达到切牌的动画效果
3.设置标志位,若是生成出来了一张,就可以切牌了。
4.切牌
怎么切牌呢?也就是说怎么使得UIsprite的spriteName属性可以在一定的时间内连续更改一定次数,就可以达到随机切牌的效果。就像动画一样的感觉
这就需要一个类似定时器的东西了。
定时器怎么写呢?这是我的实现方式:

    这里会使用到unityEngine里面的Time类,其中Time.deltaTime就是每帧的时间。
    float rotSpeed = 120.0f;
    // Update is called once per frame
    void Update ()
     {
            //将rotSpeed乘以Time.deltaTime后,就变为每秒转120度
            transform.Rotate (0,rotSpeed*Time.deltaTime,0);
    }

回到正题:
若要实现一个随机切牌的效果,首先需要一个timer(计时器),而且需要一个时间跨度allTime,因为不可能一直切下去。另外需要一个切牌的速度,比如定义
1s切20张,那么平均切一张需要1f/20这么多时间。time是不断自增的(timer+=Time.deltaTime),但是需要在allTime以内。在这个时间段以内,就需要以1f/20每张的速度进行切换。
那么如何控制切换:UISpriter.name=spriteNames[(timer/(1f/20))%spriteNames.lenth] ,求余是为了防止数组越界。
完整代码:

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

public class CardControl : MonoBehaviour {

    public GameObject cardPrefab;
    public Transform startPos;
    public Transform endPos;

    public string[] cardNames;//unity中赋值,省事~
    private UISprite generateCardUISprite;
    private bool isCanChangeCard = false;
    private float timer=0;//定时器                 3   
    private float changeTmesInAll=1f;//变换时间,默认2s            4
    private int changeCardSpeed=5;//卡牌变换速度

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GenerateCard();//生成一个卡牌
        }
        ChangeSprite(isCanChangeCard);//随机切牌
    }

    public void GenerateCard()
    {
       GameObject go =  NGUITools.AddChild(this.gameObject, cardPrefab);
        go.transform.position = startPos.position;
        generateCardUISprite = go.GetComponent();//取得新生成的card的UIsprite    1
        iTween.MoveTo(go,endPos.position,1f);
        isCanChangeCard = true;    //2
    }

    private void ChangeSprite(bool isCan)
    {
        if (isCan)
        {
            //开始变换      
            //开始计时
            timer += Time.deltaTime;
            //此处注意应用浮点除法1f。整型除法结果必须也是整型!!!!用整型必然会数组越界
            int index = (int)(timer / (1f/ changeCardSpeed));//(1f/ changeCardSpeed为一张图片所需要的时间; timer / (1/ changeCardSpeed)为当前显示第几张
            //index可能超过数组长度,处理一下index。可以求余处理,这样index总会小于cardNames.Length
            index %= (cardNames.Length);                 
            generateCardUISprite.spriteName = cardNames[index];//因为timer在一直变化,所以就会导致图片也在不断变化
            int random = Random.Range(0, 16);
            //免得两秒过后都一样
            generateCardUISprite.spriteName = cardNames[random];
            //计时结束
            if (timer > changeTmesInAll)
            {
                //结束变换
                timer = 0;
                isCanChangeCard = false;
            }
        }
    }
}

你可能感兴趣的:(uinty笔记)