代码之家  ›  专栏  ›  技术社区  ›  user3452322

统一多点触摸android 2D

  •  0
  • user3452322  · 技术社区  · 12 年前

    我正在创建一个游戏,主角可以跳跃、向左移动;正确的我有一个问题。多点触摸不起作用。我正在使用C#,我在互联网上到处搜索,但没有找到答案。

    我的代码:

    using UnityEngine;
    using System.Collections;
    
    [RequireComponent(typeof (Rigidbody2D))]
    [RequireComponent(typeof(BoxCollider2D))]
    public class TouchControls : MonoBehaviour {
    
        // GUI textures
        public GUITexture guiLeft;
        public GUITexture guiRight;
        public GUITexture guiJump;
    
        // Movement variables
        public float moveSpeed = 5f;
        public float jumpForce = 50f;
        public float maxJumpVelocity = 2f;
    
        // Movement flags
        private bool moveLeft, moveRight, doJump = false;
    
        // Update is called once per frame
        void Update () {
    
            // Check to see if the screen is being touched
            if (Input.touchCount > 0)
            {
                // Get the touch info
                Touch t = Input.GetTouch(0);
    
                // Did the touch action just begin?
                if (t.phase == TouchPhase.Began)
                {
                    // Are we touching the left arrow?
                    if (guiLeft.HitTest(t.position, Camera.main))
                    {
                        Debug.Log("Touching Left Control");
                        moveLeft = true;
                    }
    
                    // Are we touching the right arrow?
                    if (guiRight.HitTest(t.position, Camera.main))
                    {
                        Debug.Log("Touching Right Control");
                        moveRight = true;
                    }
    
                    // Are we touching the jump button?
                    if (guiJump.HitTest(t.position, Camera.main))
                    {
                        Debug.Log("Touching Jump Control");
                        doJump = true;
                    }
                }
    
                // Did the touch end?
                if (t.phase == TouchPhase.Ended)
                {
                    // Stop all movement
                    doJump = moveLeft = moveRight = false;
                    rigidbody2D.velocity = Vector2.zero;
                }
            }
    
            // Is the left mouse button down?
            if (Input.GetMouseButtonDown(0))
            {
                // Are we clicking the left arrow?
                if (guiLeft.HitTest(Input.mousePosition, Camera.main))
                {
                    Debug.Log("Touching Left Control");
                    moveLeft = true;
                }
    
                // Are we clicking the right arrow?
                if (guiRight.HitTest(Input.mousePosition, Camera.main))
                {
                    Debug.Log("Touching Right Control");
                    moveRight = true;
                }
    
                // Are we clicking the jump button?
                if (guiJump.HitTest(Input.mousePosition, Camera.main))
                {
                    Debug.Log("Touching Jump Control");
                    doJump = true;
                }
            }
    
            if (Input.GetMouseButtonUp(0))
            {
                // Stop all movement on left mouse button up
                doJump = moveLeft = moveRight = false;
                rigidbody2D.velocity = Vector2.zero;
            }
        }
    
        void FixedUpdate()
        {
            // Set velocity based on our movement flags.
            if (moveLeft)
            {
                rigidbody2D.velocity = -Vector2.right * moveSpeed;
            }
    
            if (moveRight)
            {
                rigidbody2D.velocity = Vector2.right * moveSpeed;
            }
    
            if (doJump)
            {
                // If we have not reached the maximum jump velocity, keep applying force.
                if (rigidbody2D.velocity.y < maxJumpVelocity)
                {
                    rigidbody2D.AddForce(Vector2.up * jumpForce);
                } else {
                    // Otherwise stop jumping
                    doJump = false;
                }
            }
        }
    }
    
    2 回复  |  直到 12 年前
        1
  •  4
  •   Vilda    12 年前

    您必须列出所有触摸:

    if (Input.touchCount > 0) {
        for(int i = 0; i < Input.touchCount; i++) {
            Touch t = Input.GetTouch(0);
            ..
            ..
    }
    

    这意味着,每个触摸都将被单独处理。 官方文件 here .

    祝你比赛好运。

        2
  •  3
  •   Vilda    12 年前

    将脚本替换为:

    using UnityEngine;
    using System.Collections;
    
    [RequireComponent(typeof (Rigidbody2D))]
    [RequireComponent(typeof(BoxCollider2D))]
    public class TouchControls : MonoBehaviour {
    
    public GUITexture guiLeft;
    public GUITexture guiRight;
    public GUITexture guiJump;
    
    public float moveSpeed = 5f;
    public float jumpForce = 50f;
    public float maxJumpVelocity = 2f;
    
    private bool moveLeft, moveRight, doJump = false;
    
    void Update () {
    
        if (Input.touchCount > 0) {
            for(int i = 0; i < Input.touchCount; i++) {
                Touch t = Input.GetTouch(i);
    
                if (t.phase == TouchPhase.Began) {
                    if (guiLeft.HitTest(t.position, Camera.main)) {
                        Debug.Log("Touching Left Control");
                        moveLeft = true;
                    }
    
                    if (guiRight.HitTest(t.position, Camera.main)) {
                        Debug.Log("Touching Right Control");
                        moveRight = true;
                    }
    
                    // Are we touching the jump button?
                    if (guiJump.HitTest(t.position, Camera.main)) {
                        Debug.Log("Touching Jump Control");
                        doJump = true;
                    }
                }
    
                if (t.phase == TouchPhase.Ended) {
                    // Stop all movement
                    doJump = moveLeft = moveRight = false;
                    rigidbody2D.velocity = Vector2.zero;
                }
            }
        }
    
        if (Input.GetMouseButtonDown(0)) {
            if (guiLeft.HitTest(Input.mousePosition, Camera.main)) {
                Debug.Log("Touching Left Control");
                moveLeft = true;
            }
    
            if (guiRight.HitTest(Input.mousePosition, Camera.main)) {
                Debug.Log("Touching Right Control");
                moveRight = true;
            }
    
            if (guiJump.HitTest(Input.mousePosition, Camera.main)) {
                Debug.Log("Touching Jump Control");
                doJump = true;
            }
        }
    
        if (Input.GetMouseButtonUp(0)) {
            doJump = moveLeft = moveRight = false;
            rigidbody2D.velocity = Vector2.zero;
        }
    }
    
    void FixedUpdate() {
        if (moveLeft) {
            rigidbody2D.velocity = -Vector2.right * moveSpeed;
        }
    
        if (moveRight) {
            rigidbody2D.velocity = Vector2.right * moveSpeed;
        }
    
        if (doJump) {
            if (rigidbody2D.velocity.y < maxJumpVelocity) {
                rigidbody2D.AddForce(Vector2.up * jumpForce);
            } else {
                doJump = false;
            }
        }
    }
    }
    

    一切都应该正常。我测试了它,没有任何错误。