|
仿海岛奇兵中金币收取的效果,简单的粒子实现。 注:由于场景和UI相机是分离的,所以代码中增加了一次坐标转换的操作,防止场景拖动造成金币整体便宜的问题。
1 using UnityEngine; 2 using System.Collections; 3![](/Images/OutliningIndicators/None.gif) 4 public class CoinsAnimation : MonoBehaviour 5![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) { 6![](/Images/OutliningIndicators/InBlock.gif) 7 public GameObject[] mCoinPrefab; 8 public float mRate = 0.25f; 9 public float mMoveSpeed = 2; 10 public AnimationCurve mMoveSpeedCurve; 11 public float mRotateSpeed = 3; 12![](/Images/OutliningIndicators/InBlock.gif) 13 private static CoinsAnimation Instance; 14![](/Images/OutliningIndicators/InBlock.gif) 15 private class Coin 16![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 17 public float mMoveTime; 18 public Transform mTransform; 19 public Vector3 mRotateSpeed; 20 } 21![](/Images/OutliningIndicators/InBlock.gif) 22 private void Start() 23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 24 Instance = this; 25 } 26![](/Images/OutliningIndicators/InBlock.gif) 27 private void OnDestroy() 28![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 29 Instance = null; 30 } 31![](/Images/OutliningIndicators/InBlock.gif) 32 private IEnumerator OnAnimation(float flyTime, int type, Vector3 sourceIn, Vector3 targetIn, int count) 33![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 34 Camera sceneCamera = Camera.main; 35 Camera uiCamera = Global.Instance().GetUIManager().UICamera; 36![](/Images/OutliningIndicators/InBlock.gif) 37 Vector3 source, target; 38 if (null != uiCamera) 39![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 40 source = sourceIn; 41 target = targetIn; 42![](/Images/OutliningIndicators/InBlock.gif) 43 // 将UI起点坐标转换为场景起点坐标并保存 44 sourceIn = sceneCamera.ViewportToWorldPoint(uiCamera.WorldToViewportPoint(sourceIn)); 45 } 46 else 47![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 48 source = sourceIn; 49 target = targetIn; 50 } 51![](/Images/OutliningIndicators/InBlock.gif) 52 System.Collections.Generic.List<Coin> coins = new System.Collections.Generic.List<Coin>(); 53 float generateTime = 0; 54 float generateCount = 0; 55 float moveSpeed = 1 / flyTime; 56![](/Images/OutliningIndicators/InBlock.gif) 57 while (true) 58![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 59 if (generateCount < count && generateTime <= 0) 60![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 61 Coin coin = new Coin(); 62![](/Images/OutliningIndicators/InBlock.gif) 63 coin.mRotateSpeed = new Vector3( 64 Mathf.Lerp(0, 360, Random.Range(0, 1.0f)), 65 Mathf.Lerp(0, 360, Random.Range(0, 1.0f)), 66 Mathf.Lerp(0, 360, Random.Range(0, 1.0f))) * mRotateSpeed; 67![](/Images/OutliningIndicators/InBlock.gif) 68 GameObject go = Instantiate(mCoinPrefab[type], source, Random.rotationUniform) as GameObject; 69 coin.mTransform = go.transform; 70![](/Images/OutliningIndicators/InBlock.gif) 71 coins.Add(coin); 72 generateTime = mRate; 73 generateCount++; 74 } 75 else 76![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 77 generateTime -= Time.deltaTime; 78 } 79![](/Images/OutliningIndicators/InBlock.gif) 80 if (null != uiCamera) 81![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 82 // 将场景起点坐标转换为UI起点坐标,因为场景可以拖动,不然会造成效果分离的问题,所以必须转换一次 83 source = uiCamera.ViewportToWorldPoint(sceneCamera.WorldToViewportPoint(sourceIn)); 84 } 85![](/Images/OutliningIndicators/InBlock.gif) 86 for (int i = coins.Count - 1; i >= 0; --i) 87![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 88 Coin coin = coins[i]; 89 coin.mTransform.position = Vector3.Lerp(source, target, coins[i].mMoveTime); 90 coin.mTransform.Rotate(coin.mRotateSpeed.x * Time.deltaTime, coin.mRotateSpeed.y * Time.deltaTime, coin.mRotateSpeed.z * Time.deltaTime); 91 coin.mMoveTime = coin.mMoveTime + Mathf.Max(mMoveSpeedCurve.Evaluate(coin.mMoveTime), 0.1f) * moveSpeed * Time.deltaTime; 92![](/Images/OutliningIndicators/InBlock.gif) 93 if (coin.mMoveTime >= 1) 94![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 95 coins.RemoveAt(i); 96 Destroy(coin.mTransform.gameObject); 97 } 98 } 99![](/Images/OutliningIndicators/InBlock.gif) 100 if (generateCount >= count && coins.Count == 0) 101![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 102 break; 103 } 104![](/Images/OutliningIndicators/InBlock.gif) 105 yield return null; 106 } 107 } 108![](/Images/OutliningIndicators/InBlock.gif) 109 public float BeginAnimation(int type, Vector3 source, Vector3 target, int count) 110![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 111 // 飞行时长 112 float flyTime = (target - source).magnitude / mMoveSpeed; 113 StartCoroutine(OnAnimation(flyTime, type, source, target, Mathf.Clamp(count, 1, 20))); 114 return flyTime; 115 } 116![](/Images/OutliningIndicators/InBlock.gif) 117![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary> 118 /// 播放特效 119 /// </summary> 120 /// <param name="type">类型</param> 121 /// <param name="source">UI相机中的起点坐标</param> 122 /// <param name="target">UI相机中的终点坐标</param> 123 /// <param name="count">粒子数量</param> 124 /// <returns>播放时长</returns> 125 public static float Play(int type, Vector3 source, Vector3 target, int count) 126![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 127 if (null != Instance) 128![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 129 return Instance.BeginAnimation(type, source, target, count); 130 } 131 return 0; 132 } 133 134 } 135![](/Images/OutliningIndicators/None.gif) ![](/images/cppblog_com/shly/微信截图_20151215093604.png)
|