Files
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

406 lines
9.6 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;
using UnityEngine.Events;
using UnityEngine.EventSystems;
[System.Serializable]
//this script allows to edit the touch buttons to set their positions in run time with the mouse or finger in a touch screen, save those positions in a file,
//and reload in the next execution, in case you want to load it
public class editControlPosition : MonoBehaviour
{
[Header ("Main Settings")]
[Space]
public bool loadButtonsPositionEnabled = false;
public bool initializeTouchButtonsPositionEnabled = false;
[Space]
[Header ("Debug")]
[Space]
public List<RectTransform> buttons = new List<RectTransform> ();
public bool mainGameManagerLocated;
[Space]
[Header ("Button Info Debug")]
[Space]
public List<Vector2> buttonsPos = new List<Vector2> ();
public List<Vector2> buttonPosDefault = new List<Vector2> ();
public List<touchButtonListener> touchButtonList = new List<touchButtonListener> ();
[Space]
[Header ("Components")]
[Space]
public inputManager input;
public gameManager mainGameManager;
RectTransform buttonToMove;
bool enableButtonEdit = false;
bool touching;
bool grab;
int i = 0;
readonly List<RaycastResult> captureRaycastResults = new List<RaycastResult> ();
Touch currentTouch;
bool touchPlatform;
string currentSaveDataPath;
bool checkSettingsInitialized;
bool useRelativePath;
string touchControlsPositionFolderName;
string touchControlsPositionFileName;
Coroutine mainUpdateCoroutine;
void Start ()
{
touchPlatform = touchJoystick.checkTouchPlatform ();
checkMainManager ();
if (mainGameManagerLocated) {
touchControlsPositionFolderName = mainGameManager.getTouchControlsPositionFolderName ();
touchControlsPositionFileName = mainGameManager.getTouchControlsPositionFileName ();
}
}
void checkMainManager ()
{
mainGameManagerLocated = mainGameManager != null;
if (!mainGameManagerLocated) {
mainGameManager = gameManager.Instance;
mainGameManagerLocated = mainGameManager != null;
}
if (!mainGameManagerLocated) {
mainGameManager = FindObjectOfType<gameManager> ();
mainGameManager.getComponentInstanceOnApplicationPlaying ();
mainGameManagerLocated = mainGameManager != null;
}
}
public void stopUpdateCoroutine ()
{
if (mainUpdateCoroutine != null) {
StopCoroutine (mainUpdateCoroutine);
}
}
IEnumerator updateCoroutine ()
{
var waitTime = new WaitForSecondsRealtime (0.00001f);
while (true) {
if (enableButtonEdit) {
//check the mouse position in the screen if we are in the editor, or the finger position in a touch device
int touchCount = Input.touchCount;
if (!touchPlatform) {
touchCount++;
}
for (int i = 0; i < touchCount; i++) {
if (!touchPlatform) {
currentTouch = touchJoystick.convertMouseIntoFinger ();
} else {
currentTouch = Input.GetTouch (i);
}
if (currentTouch.phase == TouchPhase.Began) {
//if the finger/mouse position is above a button, it is selected to translate
captureRaycastResults.Clear ();
PointerEventData p = new PointerEventData (EventSystem.current);
p.position = currentTouch.position;
p.clickCount = i;
p.dragging = false;
EventSystem.current.RaycastAll (p, captureRaycastResults);
foreach (RaycastResult r in captureRaycastResults) {
if (buttons.Contains (r.gameObject.GetComponent<RectTransform> ())) {
grab = true;
buttonToMove = r.gameObject.GetComponent<RectTransform> ();
touching = true;
}
}
}
//the button follows the mouse/finger position
if ((currentTouch.phase == TouchPhase.Stationary || currentTouch.phase == TouchPhase.Moved) && grab) {
if (grab && buttonToMove != null) {
buttonToMove.position = new Vector2 (currentTouch.position.x, currentTouch.position.y);
}
}
//release the button
if (currentTouch.phase == TouchPhase.Ended && touching) {
touching = false;
if (grab) {
grab = false;
buttonToMove = null;
}
}
}
}
yield return waitTime;
}
}
public void checkSettings ()
{
checkMainManager ();
if (!checkSettingsInitialized && mainGameManagerLocated) {
useRelativePath = mainGameManager.useRelativePath;
currentSaveDataPath = getDataPath ();
checkSettingsInitialized = true;
}
}
public string getDataPath ()
{
string dataPath = "";
if (useRelativePath) {
dataPath = touchControlsPositionFolderName;
} else {
dataPath = Application.persistentDataPath + "/" + touchControlsPositionFolderName;
}
if (!Directory.Exists (dataPath)) {
Directory.CreateDirectory (dataPath);
}
dataPath += "/";
return dataPath;
}
public void getTouchButtons ()
{
checkMainManager ();
if (mainGameManagerLocated) {
//load or not the previous positions of the buttons, saved in another execution
if (mainGameManager.loadEnabled) {
if (loadButtonsPositionEnabled) {
Load ();
loadButtonsPositionEnabled = false;
}
if (initializeTouchButtonsPositionEnabled) {
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
buttonsPos.Add (buttons [i].position);
}
}
}
}
}
}
public void getTouchButtonsComponents ()
{
buttons.Clear ();
buttonPosDefault.Clear ();
touchButtonList.Clear ();
bool inputManagerLocated = input != null;
if (!inputManagerLocated) {
input = inputManager.Instance;
inputManagerLocated = input != null;
}
if (!inputManagerLocated) {
input = FindObjectOfType<inputManager> ();
input.getComponentInstanceOnApplicationPlaying ();
inputManagerLocated = input != null;
}
if (!inputManagerLocated) {
return;
}
//save all touch buttons in a list and their positions
for (i = 0; i < input.touchButtonList.Count; i++) {
if (input.touchButtonList [i] != null) {
RectTransform currentRectTransform = input.touchButtonList [i].GetComponent<RectTransform> ();
if (currentRectTransform != null) {
buttons.Add (currentRectTransform);
buttonPosDefault.Add (currentRectTransform.anchoredPosition);
touchButtonList.Add (input.touchButtonList [i]);
}
}
}
print ("Touch Buttons Components stored");
updateComponent ();
}
//after edit the buttons, their positions are saved
public void activateEdit ()
{
enableButtonEdit = !enableButtonEdit;
stopUpdateCoroutine ();
if (enableButtonEdit) {
changeButtonsState (false);
mainUpdateCoroutine = StartCoroutine (updateCoroutine ());
} else {
buttonsPos.Clear ();
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
buttonsPos.Add (buttons [i].anchoredPosition);
}
}
Save ();
}
}
//if we cancel the edition, the buttons back to their previous position, if any of them has been moved
public void disableEdit ()
{
if (enableButtonEdit) {
enableButtonEdit = false;
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
buttons [i].anchoredPosition = buttonsPos [i];
}
}
}
}
//set the buttons with their default position
public void changeToDefault ()
{
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
buttons [i].anchoredPosition = buttonPosDefault [i];
}
}
Save ();
}
//disable and enable the pointer click components in the buttons, to avoid activate them while the game is paused
public void changeButtonsState (bool state)
{
for (i = 0; i < touchButtonList.Count; i++) {
if (touchButtonList [i] != null && touchButtonList [i].enabled != state) {
touchButtonList [i].enabled = state;
}
}
}
//save in a file the positions of the button, vector2 are not serializable if I am not wrong, so every axis is save in a list of float
public void Save ()
{
checkSettings ();
savedButtons sB = new savedButtons ();
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
sB.saveButtonsPosX.Add (buttons [i].position.x);
sB.saveButtonsPosY.Add (buttons [i].position.y);
}
}
BinaryFormatter bf = new BinaryFormatter ();
FileStream file = File.Create (currentSaveDataPath + touchControlsPositionFileName + ".txt");
bf.Serialize (file, sB.saveButtonsPosX);
bf.Serialize (file, sB.saveButtonsPosY);
file.Close ();
buttonsPos.Clear ();
for (i = 0; i < buttons.Count; i++) {
buttonsPos.Add (new Vector2 (sB.saveButtonsPosX [i], sB.saveButtonsPosY [i]));
}
}
//load the positions of the buttons reading the file if it exists
public void Load ()
{
checkSettings ();
savedButtons sB = new savedButtons ();
if (File.Exists (currentSaveDataPath + touchControlsPositionFileName + ".txt")) {
BinaryFormatter bf = new BinaryFormatter ();
FileStream file = File.Open (currentSaveDataPath + touchControlsPositionFileName + ".txt", FileMode.Open);
sB.saveButtonsPosX = (List<float>)bf.Deserialize (file);
sB.saveButtonsPosY = (List<float>)bf.Deserialize (file);
file.Close ();
}
//also check the lenght are equal in both list, to avoid exceptions
if (sB.saveButtonsPosX.Count == buttons.Count) {
for (i = 0; i < buttons.Count; i++) {
if (buttons [i] != null) {
buttons [i].position = new Vector2 (sB.saveButtonsPosX [i], sB.saveButtonsPosY [i]);
}
}
}
}
void updateComponent ()
{
GKC_Utils.updateComponent (this);
GKC_Utils.updateDirtyScene ("Update Touch Control Positions", gameObject);
}
}
//the positions of the buttons need to be serializable to save them in a file
[Serializable]
class savedButtons
{
public List<float> saveButtonsPosX = new List<float> ();
public List<float> saveButtonsPosY = new List<float> ();
}