如何控制一张卡牌的随机切换,答案是只需要在固定时间,更改他的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<UISprite>();//取得新生成的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; } } } }