Unity C#: проблемы при использовании сенсорного ввода и кнопок, проблемы при использовании сенсорного ввода при Android - PullRequest
0 голосов
/ 30 января 2020

Описание игры:

Игра является своего рода игрой с «одной башенной защитой», когда «только» башня в середине игры защищается от входящих противников на соответствующие полосы движения. Башня управляется непосредственно игроком и стреляет из своего оружия в направлении, где игрок нажимает.

См. Скриншот игры: Скриншот vom Spiel

Таким образом, пользователь контролирует действия на ощупь. Эта игра должна (только) появиться "на данный момент" за Android. Я реализовал управление для башни и для кнопок в соответствующем классе для Android «GetTouch» и для моделирования на P C одним щелчком мыши.

См. Код:

public class Controls : MonoBehaviour {
    public Transform tower;

    private bool aiming = false;
    private TowerWeaponSystems towerWeaponSystems;

    private Transform target;

    public enum Mode {
        Default,
        Laser,
        Missile
    }

    public Mode mode = Mode.Default;

    void Start () {
        towerWeaponSystems = tower.GetComponent<TowerWeaponSystems>();
        target = GameObject.Find("#GlobalObjects").transform.Find("Target");
        towerWeaponSystems.MachineGun.target = target;
        if (towerWeaponSystems.LaserGun != null) {
            towerWeaponSystems.LaserGun.target = target;
        }
        if (towerWeaponSystems.MissileLauncher != null) {
            towerWeaponSystems.MissileLauncher.defaultTarget = target;
        }
    }

    void FixedUpdate () {
#if UNITY_IPHONE
    ...
            }
#elif UNITY_ANDROID
                for (int i = 0; i < Input.touchCount; ++i) {        
                // Construct a ray from the current touch coordinates
                Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
                // Create a particle if hit
                RaycastHit hit;
                Debug.Log("Halllo");
                if (Physics.Raycast(ray, out hit)) {
                    HandleTouch(hit.collider.gameObject, 10, hit.point, Input.GetTouch(i).phase);
                }
        }
#else
        // Simulate touch events from mouse events

        if (Input.touchCount == 0) {
                Vector3 mousePosition = Input.mousePosition;

                Ray screenRay = Camera.main.ScreenPointToRay(mousePosition);

                RaycastHit hit;
                if (Physics.Raycast(screenRay, out hit, Mathf.Infinity)) {

                        if (Input.GetMouseButtonDown(0) ) {
                            HandleTouch(hit.collider.gameObject, 10, hit.point, TouchPhase.Began);
                        }
                        if (Input.GetMouseButton(0) ) {
                            HandleTouch(hit.collider.gameObject, 10, hit.point, TouchPhase.Moved);
                        }
                        if (Input.GetMouseButtonUp(0) ) {
                            HandleTouch(hit.collider.gameObject, 10, hit.point, TouchPhase.Ended);
                    }
                }
            }
        #endif

        if (GC.settingsProvider.GetPerpetualFire())
        {
            shoot();
        }
    }

    private void HandleTouch(GameObject target, int touchFingerId, Vector3 touchPosition, TouchPhase touchPhase) {
        if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()) {
            return;
        }
        //Debug.Log(target.name);
        if (target.GetComponent<Button>() != null) {
            return;
        }
        //Debug.Log(touchPhase.ToString() + ": " + target.name);
        switch (touchPhase) {
        case TouchPhase.Began:
            aiming = false;
            // If an item was clicked, pick it up.
            if(target.CompareTag("Item")) {
                var itemComponent = target.GetComponent<Item>();
                if (itemComponent != null) {
                    itemComponent.PickUp();
                }
            }
            // Otherwise use weapon according to mode.
            else if (mode == Mode.Missile) {
                towerWeaponSystems.MissileLauncher.shoot(touchPosition);
                mode = Mode.Default;
            }
            else {
                aiming = true;
                this.target.position = touchPosition;
            }
            break;
        case TouchPhase.Moved:
            if (aiming) {
                this.target.position = touchPosition;
            }
            break;
        case TouchPhase.Ended:
            if (mode == Mode.Laser) {
            mode = Mode.Default;
            }
            break;
        }
        shoot();
    }

}

Теперь к моим двум проблемам.

1-я проблема:

Вариант использования: пользователь нажимает кнопку InGame, чтобы используйте ракету (одна из кнопок внизу слева). Затем (вся) башня с ее системой оружия поворачивается в направлении кнопок InGame.

Требование: башня не должна поворачиваться в направлении кнопок InGame, но должна оставаться там, где она была. Для управления мышью также действует требование, чтобы башня НЕ поворачивалась в направлении, когда игрок нажал одну из кнопок. Все это не работает на ощупь! Что может быть не так с кодом (Android)?

2-я проблема:

Описание ошибки: повторным, разным и одновременным нажатием кнопок системы оружия InGame системы оружия НЕ деактивированы. Предположение: пользователь дотронулся до лазерного оружия не менее 2 секунд, не допуская go на игровом поле InGame. Затем игрок покидает экран пальцем. Таким образом, лазер не отключается, когда игрок покидает экран (сенсорный). Ошибка возникает очень редко. К сожалению, я не могу воспроизвести эту ошибку на 100%. Возможно, кто-то может узнать из кода, как может произойти одна из этих ошибок.

Требование: система оружия (лазер или пистолет) должна снова деактивироваться, когда вы покидаете экран.

...