Описание игры:
Игра является своего рода игрой с «одной башенной защитой», когда «только» башня в середине игры защищается от входящих противников на соответствующие полосы движения. Башня управляется непосредственно игроком и стреляет из своего оружия в направлении, где игрок нажимает.
См. Скриншот игры: Скриншот 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%. Возможно, кто-то может узнать из кода, как может произойти одна из этих ошибок.
Требование: система оружия (лазер или пистолет) должна снова деактивироваться, когда вы покидаете экран.