地铁跑酷操控程序解析

http://www.unitymanual.com/thread-10353-1-1.html

1.用于记录每次操作的开始点和结束点、开始时间和结束时间 

1
2
3
4
5
6
7
8
9
public class Swipe 

    // Fields 
    public Vector3 end; 
    public float endTime; 
    public Vector3 start; 
    public float startTime; 
  
}



2.四个滑动方向的枚举 
1
2
3
4
5
6
7
8
9
public enum SwipeDir 
  

    Up, 
    Down, 
    Left, 
    Right, 
    None 
}



3.监听Touch输入,得到输入的Swipe 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void HandleControls() 

    if (!this._paused && (Input.touchCount > 0)) 
    { 
        Touch touch = Input.touches[0]; 
        if (touch.phase == TouchPhase.Began) 
        { 
            this.currentSwipe = new Swipe(); 
            this.currentSwipe.start = (Vector3) touch.position; 
            this.currentSwipe.startTime = Time.time; 
        } 
        if ((((touch.phase == TouchPhase.Moved) || (touch.phase == TouchPhase.Ended)) || (touch.phase == TouchPhase.Canceled)) && (this.currentSwipe != null)) 
        { 
            this.currentSwipe.endTime = Time.time; 
            this.currentSwipe.end = (Vector3) touch.position; 
            SwipeDir swipeDir = this.AnalyzeSwipe(this.currentSwipe); 
            if (swipeDir != SwipeDir.None) 
            { 
                if (this.characterState != null) 
                { 
                    this.characterState.HandleSwipe(swipeDir); 
                } 
                this.currentSwipe = null; 
            } 
        } 
        if ((touch.phase == TouchPhase.Ended) && (this.currentSwipe != null)) 
        { 
            this.currentSwipe.endTime = Time.time; 
            this.currentSwipe.end = (Vector3) touch.position; 
            if ((this.AnalyzeSwipe(this.currentSwipe) == SwipeDir.None) && (this.characterState != null)) 
            { 
                this.HandleTap(); 
            } 
        } 
    } 
}



4.处理、分析得到是Swip;通过向量的点乘,得到沿上下左右四个方向上分量做多的那个方向,作为最终结果。 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private SwipeDir AnalyzeSwipe(Swipe swipe) 

    Vector3 b = Camera.main.ScreenToWorldPoint(new Vector3(swipe.start.x, swipe.start.y, 2f)); 
    if (Vector3.Distance(Camera.main.ScreenToWorldPoint(new Vector3(swipe.end.x, swipe.end.y, 2f)), b) < this.swipe.distanceMin) 
    { 
        return SwipeDir.None; 
    } 
    Vector3 lhs = swipe.end - swipe.start; 
    SwipeDir none = SwipeDir.None; 
    float num2 = 0f; 
    float num3 = Vector3.Dot(lhs, Vector3.up); 
    if (num3 > num2) 
    { 
        num2 = num3; 
        none = SwipeDir.Up; 
    } 
    num3 = Vector3.Dot(lhs, Vector3.down); 
    if (num3 > num2) 
    { 
        num2 = num3; 
        none = SwipeDir.Down; 
    } 
    num3 = Vector3.Dot(lhs, Vector3.left); 
    if (num3 > num2) 
    { 
        num2 = num3; 
        none = SwipeDir.Left; 
    } 
    num3 = Vector3.Dot(lhs, Vector3.right); 
    if (num3 > num2) 
    { 
        num2 = num3; 
        none = SwipeDir.Right; 
    } 
    return none; 
}

地铁跑酷的操控手感灰常好,多多学习,多多借鉴。 

你可能感兴趣的:(地铁跑酷操控程序解析)