gold_sprint_lpr/Assets/Scripts/SelectorBehavior.cs
COLLET François 7ee6e8aa36 ajout d'une latence (paramétrable via script) sur la récupération
des inputs pour les selector lors du choix du "transport"
Ajout input pour les axes des deux joueurs via clavier
2018-02-28 16:13:12 +01:00

254 lines
7.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class SelectorBehavior : MonoBehaviour
{
#region private fields
List<Transform> transports;
int columnCount;
Image playerPanelImage;
Text playerPanelText;
Transform currentTransport;
object selectionLock;
private bool _selected;
private Image _gameObjectImage;
#endregion
#region private properties
int GetCurrentTransportIndex
{
get
{
return transports != null && currentTransport != null ? transports.IndexOf(currentTransport) : -1;
}
}
private DateTime lastInput;
bool IsSpawned
{
get { return lastInput == null || (DateTime.Now - lastInput).Milliseconds < InputDelay; }
}
Transform CurrentTransport
{
get { return currentTransport; }
set
{
lock (selectionLock)
{
currentTransport = value;
AlignSelectorWithTransport(currentTransport);
UpdatePlayerUIElements();
}
}
}
public bool Selected
{
get
{
return _selected;
}
set
{
_selected = value;
lastInput = DateTime.Now;
SelectedChanged();
}
}
#endregion
#region public fields
public bool Player2;
public int InputDelay = 200;
public int Padding;
public Transform TransportsPanel;
public Transform PlayerPanel;
public Sprite SelectorImage;
public Color SelectorColor;
public Sprite SelectionImage;
public string HorizontalAxisName;
public string VerticalAxisName;
public string SubmitButtonName;
public string CancelButtonName;
#endregion
#region Behavior overrided methods
// Use this for initialization
void Start()
{
selectionLock = new object();
lastInput = DateTime.Now.AddSeconds(1.5);
//3E00FFFF
InitGameObjectImage();
}
private void OnRenderObject()
{
if (transports == null) InitializedTransportsList();
if (PlayerPanel != null)
{
if (playerPanelImage == null && playerPanelText == null)
{
playerPanelImage = PlayerPanel.GetChild(0).gameObject.GetComponent<Image>(); ;
playerPanelText = PlayerPanel.GetChild(1).gameObject.GetComponent<Text>();
UpdatePlayerUIElements();
}
}
}
void Update()
{
HandleInputs();
}
#endregion
private void InitGameObjectImage()
{
_gameObjectImage = transform.GetChild(0).gameObject.GetComponent<Image>();
if (_gameObjectImage != null)
{
_gameObjectImage.sprite = SelectorImage;
_gameObjectImage.color = SelectorColor;
}
}
private void InitializedTransportsList()
{
if (TransportsPanel != null)
{
transports = new List<Transform>();
for (int i = 0; i < TransportsPanel.childCount; i++)
transports.Add(TransportsPanel.GetChild(i));
columnCount = TransportsPanel.GetComponent<GridLayoutGroup>().constraintCount;
CurrentTransport = transports[Player2 ? transports.Count / 2 : 0];
}
}
#region Ui
private void AlignSelectorWithTransport(Transform transport)
{
if (transport != null)
{
transform.SetPositionAndRotation(transport.position, transform.rotation);
var temp = transport.GetComponent<RectTransform>();
transform.gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(temp.sizeDelta.x + 2 * Padding, temp.sizeDelta.y + 2 * Padding);
}
}
private void UpdatePlayerUIElements()
{
if (CurrentTransport != null)
{
if (playerPanelImage != null)
{
playerPanelImage.sprite = CurrentTransport.GetChild(0).gameObject.GetComponent<Image>().sprite;
playerPanelImage.preserveAspect = true;
}
if (playerPanelText != null)
playerPanelText.text = currentTransport.gameObject.name;
}
}
#endregion
// Update is called once per frame
private void HandleInputs()
{
if (IsSpawned || transports == null || LaunchGameScript.Current.Launching) return;
if (!string.IsNullOrEmpty(VerticalAxisName) && !Selected)
{
var verticalAxis = Input.GetAxis(VerticalAxisName);
if (Math.Abs(verticalAxis) == 1)
{
bool? move = IsPositiveMove(verticalAxis);
if (move.HasValue)
{
MoveVertical(move.Value);
}
}
}
if (!string.IsNullOrEmpty(HorizontalAxisName) && !Selected)
{
var horizontalAxis = Input.GetAxis(HorizontalAxisName);
if (Math.Abs(horizontalAxis) == 1)
{
bool? move = IsPositiveMove(horizontalAxis);
if (move.HasValue)
{
MoveHorizontal(move.Value);
}
}
}
if (!string.IsNullOrEmpty(SubmitButtonName))
{
if (Input.GetButton(SubmitButtonName))
{
Selected = true;
}
}
if (!string.IsNullOrEmpty(CancelButtonName))
{
if (Input.GetButton(CancelButtonName))
{
if (Selected)
Selected = false;
else if (StartupScript.Current != null)
StartupScript.Current.Display(0, 1);
}
}
}
#region Move selector
private static bool? IsPositiveMove(float axis)
{
bool? move = null;
if (axis == 1) move = true;
else if (axis == -1) move = false;
return move;
}
private void MoveVertical(bool positive)
{
var value = GetCurrentTransportIndex;
if (value - (transports.Count / 2) >= 0)
value -= (transports.Count / 2);
else value += (transports.Count / 2);
//var value = GetCurrentTransportIndex;
//if (positive) value += 1;
//else value -= 1;
//if (value > transports.Count - 1) value -= transports.Count - 1;
lastInput = DateTime.Now;
CurrentTransport = transports[value];
}
private void MoveHorizontal(bool positive)
{
var value = GetCurrentTransportIndex;
if (positive) value++;
else value--;
if (value < 0) value = transports.Count - 1;
if (value > transports.Count - 1) value = 0;
lastInput = DateTime.Now;
CurrentTransport = transports[value];
}
#endregion
private void SelectedChanged()
{
if (_gameObjectImage == null) return;
_gameObjectImage.sprite = Selected ? SelectionImage : SelectorImage;
LaunchGameScript.Current.SelectionChanged();
}
}