int FrameRate = 30;//多少帧 float MoveDistance = 2f;//移动多少距离 string MaterialPrefabPath = "Prefabs/Effect_biaoqing_prefab/"; IEnumerator StartMateriaAni(byte index,byte fromViewID,byte toViewID) { Vector3 startPos = poss[fromViewID].position + offsetPos; Vector3 toPos = poss[toViewID].position + offsetPos; //方向 向上减速 向下加速 bool isDown = false; if (startPos.y > toPos.y) isDown = true; float rate = (toPos - startPos).magnitude / MoveDistance;//缩放比例 int relateFrame = (int) Mathf.Round (FrameRate * rate);//实际帧数/期望帧数 = 实际距离/期望距离 if (relateFrame < 20)//距离太近可能看起来会太快,所以限制下最低帧数 relateFrame = 20; int allDuan = (1 + relateFrame) * relateFrame / 2; // 1 + 2 + ...+ realteFrame float tweenPosY = (toPos.y - startPos.y) / allDuan;//Y轴减速度或加速度 float tweenPosX = (toPos.x - startPos.x) / relateFrame;//X轴恒速 //实例化1 Transform tran1 = GetEffectInPool(index,1).transform; InitEffect(tran1, startPos); //计算旋转 tran1.rotation = Quaternion.FromToRotation(Vector3.up, (toPos - startPos).normalized); ; for (int i = 0; i < relateFrame; i++) { //x方向恒速,y方向先快后慢或先慢后快,效果承抛物线 if(isDown) tran1.position += new Vector3(tweenPosX, tweenPosY * (i + 1), 0); else tran1.position += new Vector3(tweenPosX, tweenPosY * (relateFrame - i),0) ; tran1.rotation = Quaternion.FromToRotation(Vector3.up, (tran1.position - startPos)); yield return new WaitForEndOfFrame(); } InEffectInPool(tran1.gameObject);//回收 //实例化2 Transform tran2 = GetEffectInPool(index, 2).transform; ; InitEffect(tran2, toPos); switch (index)//针对动作延迟播放shengyin { case 1: yield return new WaitForSeconds(0.5f); break; } NGUITools.PlaySound(musics[index - 1]); yield return new WaitForSeconds(3f); InEffectInPool(tran2.gameObject); }
想法就是,利用期望帧数和期望距离和实际距离来计算出实际的帧数,这样可以接近一种恒速(不确定)。避免了用if判断位置到目标位置的不精确性。利用这种目标和起始的位置来分段,在固定的帧内移动到目标位置,在Y方向时分端可以分多一点,开始的时候移动多段随后减少就可以制造一种减速度的感觉 或者是 开始移动少段随后变多制造出加速的感觉。