public static IEnumerator IEDrop(GameObject obj, Vector2 NewPos, float speed) { JewelObj script = obj.GetComponent <JewelObj>(); Collider2D coll = obj.GetComponent <Collider2D>(); if (obj != null) { Transform _tranform = obj.transform; coll.enabled = false; script.isMove = true; while (_tranform != null && _tranform.localPosition.y - NewPos.y > 0.1f) { _tranform.localPosition -= new Vector3(0, Time.smoothDeltaTime * speed); yield return(null); } if (_tranform != null) { _tranform.localPosition = new Vector3(NewPos.x, NewPos.y); script.Bounce(); script.RuleChecker(); yield return(new WaitForSeconds(0.2f)); if (coll != null) { coll.enabled = true; script.isMove = false; } } } }
/// <summary> /// 使用协程播放下落动画 /// </summary> /// <param name="obj"></param> /// <param name="NewPos"></param> /// <param name="speed"></param> /// <returns></returns> public static IEnumerator IEDrop(GameObject obj, Vector2 NewPos, float speed) { JewelObj script = obj.GetComponent <JewelObj>(); Collider2D coll = obj.GetComponent <Collider2D>(); if (obj != null) { Transform _tranform = obj.transform; coll.enabled = false; script.isMove = true; //!!!! 注意显示游戏对象即:obj中transform的localPosition与逻辑地图中的NewPos是一样,均使用的是左下角0,0然后往上一格则为0,1 //这就解决了显示对象数据向逻辑数据同步的问题,即显示对象按逻辑对象的x,y进行移动到指定位置。 while (_tranform != null && _tranform.localPosition.y - NewPos.y > 0.1f) { _tranform.localPosition -= new Vector3(0, Time.smoothDeltaTime * speed); yield return(null); } if (_tranform != null) { //这块的数据和AS3中的闭包数据很像,即协程执行完比后,他的数据类似AS3中的闭包方法,即数据还是之前的数据. _tranform.localPosition = new Vector3(NewPos.x, NewPos.y); script.Bounce(); script.RuleChecker(); yield return(new WaitForSeconds(0.2f)); //开启碰撞器组件 if (coll != null) { coll.enabled = true; script.isMove = false; } } } }
/// <summary> /// 使用协程播放下落动画 /// </summary> /// <param name="obj"></param> /// <param name="NewPos"></param> /// <param name="speed"></param> /// <returns></returns> public static IEnumerator IEDrop(GameObject obj, Vector2 NewPos, float speed) { // 获取对象上挂载脚本对象jewelobj JewelObj script = obj.GetComponent <JewelObj>(); // 获取对象上二维碰撞组件 Collider2D coll = obj.GetComponent <Collider2D>(); if (obj != null) // 存在判断 { // 获取对象上Transform组件 Transform _tranform = obj.transform; // 禁用碰撞组件 coll.enabled = false; // 设置脚本对象成员 可以移动 script.isMove = true; //!!!! 注意显示游戏对象即:obj中transform的localPosition与逻辑地图中的NewPos是一样,均使用的是左下角0,0然后往上一格则为0,1 //这就解决了显示对象数据向逻辑数据同步的问题,即显示对象按逻辑对象的x,y进行移动到指定位置。 while (_tranform != null && _tranform.localPosition.y - NewPos.y > 0.1f) { // Time.smoothDeltaTime上一帧所花的时间 _tranform.localPosition -= new Vector3(0, Time.smoothDeltaTime * speed); // 停留一帧 yield return(null); } if (_tranform != null) { //??这块的数据和AS3中的闭包数据很像,即协程执行完比后,他的数据类似AS3中的闭包方法,即数据还是之前的数据. // 赋给对象准确的位置 _tranform.localPosition = new Vector3(NewPos.x, NewPos.y); // 播放宝石的抖动动画 script.Bounce(); // 检查消除 script.RuleChecker(); // 停留0.2s yield return(new WaitForSeconds(0.2f)); //开启碰撞器组件 if (coll != null) { coll.enabled = true; script.isMove = false; } } } }