【发布时间】:2015-05-12 23:53:47
【问题描述】:
我正在为我的 2D 游戏进行滑动,下面的代码处理游戏的水平滑动。可以把它想象成一排门之间的水平滑动(类似 Android 的滑动):
using UnityEngine;
using System.Collections;
public class DoorController : MonoBehaviour {
public Camera mainCamera;
private float speed;
private float iniCam;
float delta = 0;
private Vector2 iniPos = new Vector2 ();
private Vector2 midPos = new Vector2 ();
private Vector2 endPos = new Vector2 ();
private GameObject[] numberOfDoors;
private bool auth2160;
private bool auth2880;
// Use this for initialization
void Start () {
}
IEnumerator swipe0() {
while (mainCamera.transform.position.x != 0) {
mainCamera.transform.position = Vector2.MoveTowards(mainCamera.transform.position, new Vector2 (0, 0), (float)(Time.deltaTime * (1000 + Mathf.Abs(delta))));
yield return null;
}
}
IEnumerator swipe720() {
while (mainCamera.transform.position.x != 720) {
mainCamera.transform.position = Vector2.MoveTowards(mainCamera.transform.position, new Vector2 (720, 0), (float)(Time.deltaTime * (1000 + Mathf.Abs(delta))));
yield return null;
}
}
IEnumerator swipe1440() {
while (mainCamera.transform.position.x != 1440) {
mainCamera.transform.position = Vector2.MoveTowards(mainCamera.transform.position, new Vector2 (1440, 0), (float)(Time.deltaTime * (1000 + Mathf.Abs(delta))));
yield return null;
}
}
IEnumerator swipe2160() {
while (mainCamera.transform.position.x != 2160) {
mainCamera.transform.position = Vector2.MoveTowards(mainCamera.transform.position, new Vector2 (2160, 0), (float)(Time.deltaTime * (1000 + Mathf.Abs(delta))));
yield return null;
}
}
IEnumerator swipe2880() {
while (mainCamera.transform.position.x != 2880) {
mainCamera.transform.position = Vector2.MoveTowards(mainCamera.transform.position, new Vector2 (2880, 0), (float)(Time.deltaTime * (1000 + Mathf.Abs(delta))));
yield return null;
}
}
// Update is called once per frame
void Update () {
numberOfDoors = GameObject.FindGameObjectsWithTag("Porta");
if (numberOfDoors.Length == 3) {
auth2160 = false;
auth2880 = false;
} else if (numberOfDoors.Length == 4) {
auth2160 = true;
auth2880 = false;
} else if (numberOfDoors.Length == 5) {
auth2160 = true;
auth2880 = true;
}
if (Input.touchCount > 0) {
Touch touch = Input.touches[0];
if(touch.phase == TouchPhase.Began){
StopAllCoroutines();
iniCam = mainCamera.transform.position.x;
iniPos = new Vector2(touch.position.x,0);
Debug.Log("Posiçao inicial: " + iniPos);
}
else if(touch.phase == TouchPhase.Moved){
midPos = new Vector2(touch.position.x,0);
Debug.Log("Posiçao durante: " + midPos);
//StartCoroutine("swipeLeft");
mainCamera.transform.position = new Vector2(iniCam-(midPos.x-iniPos.x)*1.5F,0);
}
else if(touch.phase == TouchPhase.Ended){
endPos = new Vector2(touch.position.x,0);
delta = iniPos.x-endPos.x; //> 0 tendencia direita;
Debug.Log("Posiçao final: " + endPos);
if(mainCamera.transform.position.x < 0 ){
StartCoroutine("swipe0");
}else if(mainCamera.transform.position.x >= 0 && mainCamera.transform.position.x < 360 && delta < 0){
StartCoroutine("swipe0");
}else if(mainCamera.transform.position.x >= 0 && mainCamera.transform.position.x < 360 && delta > 0){
StartCoroutine("swipe0");
}else if(mainCamera.transform.position.x >= 360 && mainCamera.transform.position.x < 720 && delta < 0){
StartCoroutine("swipe0");
}else if(mainCamera.transform.position.x >= 360 && mainCamera.transform.position.x < 720 && delta > 0){
StartCoroutine("swipe720");
}else if(mainCamera.transform.position.x >= 720 && mainCamera.transform.position.x < 1080 && delta < 0){
StartCoroutine("swipe720");
}else if(mainCamera.transform.position.x >= 720 && mainCamera.transform.position.x < 1080 && delta > 0){
StartCoroutine("swipe720");
}else if(mainCamera.transform.position.x >= 1080 && mainCamera.transform.position.x < 1440 && delta < 0){
StartCoroutine("swipe720");
}else if(mainCamera.transform.position.x >= 1080 && mainCamera.transform.position.x < 1440 && delta > 0){
StartCoroutine("swipe1440");
}else if(mainCamera.transform.position.x >= 1440 && mainCamera.transform.position.x < 1800 && delta < 0){
StartCoroutine("swipe1440");
}else if(mainCamera.transform.position.x >= 1440 && mainCamera.transform.position.x < 1800 && delta > 0){
StartCoroutine("swipe1440");
}else if(mainCamera.transform.position.x >= 1800 && mainCamera.transform.position.x < 2160 && delta < 0){
StartCoroutine("swipe1440");
}else if(mainCamera.transform.position.x >= 1800 && mainCamera.transform.position.x < 2160 && delta > 0){
StartCoroutine("swipe2160");
}else if(mainCamera.transform.position.x >= 2160 && mainCamera.transform.position.x < 2520 && delta < 0){
StartCoroutine("swipe2160");
}else if(mainCamera.transform.position.x >= 2160 && mainCamera.transform.position.x < 2520 && delta > 0){
StartCoroutine("swipe2160");
}else if(mainCamera.transform.position.x >= 2520 && mainCamera.transform.position.x < 2880 && delta < 0){
StartCoroutine("swipe2160");
}else if(mainCamera.transform.position.x >= 2520 && mainCamera.transform.position.x < 2880 && delta > 0){
StartCoroutine("swipe2880");
}else if(mainCamera.transform.position.x > 2880){
StartCoroutine("swipe2880");
}if(mainCamera.transform.position.x >= 1440 && !auth2160){
StopAllCoroutines();
StartCoroutine("swipe1440");
}if(mainCamera.transform.position.x >= 2160 && !auth2880){
StopAllCoroutines();
StartCoroutine("swipe2160");
}
}
}
}
}
作为一个统一的初学者,这是我想出来的唯一方法。您知道更好更清洁的方法吗?如果刷卡不是完整的刷卡,代码会推或拉门。
【问题讨论】:
-
如果可行,请拍拍自己的后背,然后继续进行更多游戏关键逻辑。如果游戏开始后滑动太慢,然后重新访问。
-
它完美而快速地运行,但是,正如您所看到的,必须有更优雅的方式来做到这一点。
标签: unity3d 2d swipe coroutine