2024-10-17 17:23:05 +03:00

194 lines
7.3 KiB
C#

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using static Mirror.Examples.CharacterSelection.NetworkManagerCharacterSelection;
namespace Mirror.Examples.CharacterSelection
{
public class CanvasReferencer : MonoBehaviour
{
// Make sure to attach these Buttons in the Inspector
public Button buttonExit, buttonNextCharacter, buttonGo, buttonColour, buttonColourReset;
public Text textTitle, textHealth, textSpeed, textAttack, textAbilities;
public InputField inputFieldPlayerName;
public Transform podiumPosition;
private int currentlySelectedCharacter = 1;
private CharacterData characterData;
private GameObject currentInstantiatedCharacter;
private CharacterSelection characterSelection;
public SceneReferencer sceneReferencer;
public Camera cameraObj;
private void Start()
{
characterData = CharacterData.characterDataSingleton;
if (characterData == null)
{
Debug.Log("Add CharacterData prefab singleton into the scene.");
return;
}
buttonExit.onClick.AddListener(ButtonExit);
buttonNextCharacter.onClick.AddListener(ButtonNextCharacter);
buttonGo.onClick.AddListener(ButtonGo);
buttonColour.onClick.AddListener(ButtonColour);
buttonColourReset.onClick.AddListener(ButtonColourReset);
//Adds a listener to the main input field and invokes a method when the value changes.
inputFieldPlayerName.onValueChanged.AddListener(delegate { InputFieldChangedPlayerName(); });
LoadData();
SetupCharacters();
}
public void ButtonExit()
{
//Debug.Log("ButtonExit");
if (sceneReferencer)
{
sceneReferencer.CloseCharacterSelection();
}
}
public void ButtonGo()
{
//Debug.Log("ButtonGo");
// presumes we're already in-game
if (sceneReferencer && NetworkClient.active)
{
// You could check if prefab (character number) has not changed, and if so just update the sync vars and hooks of current prefab, this would call a command from your player.
// this is not fully setup for this example, but provides a minor template to follow if needed
//NetworkClient.localPlayer.GetComponent<CharacterSelection>().CmdSetupCharacter(StaticVariables.playerName, StaticVariables.characterColour);
CreateCharacterMessage _characterMessage = new CreateCharacterMessage
{
playerName = StaticVariables.playerName,
characterNumber = StaticVariables.characterNumber,
characterColour = StaticVariables.characterColour
};
ReplaceCharacterMessage replaceCharacterMessage = new ReplaceCharacterMessage
{
createCharacterMessage = _characterMessage
};
NetworkManagerCharacterSelection.singleton.ReplaceCharacter(replaceCharacterMessage);
sceneReferencer.CloseCharacterSelection();
}
else
{
// not in-game
SceneManager.LoadScene("MirrorCharacterSelection");
}
}
public void ButtonNextCharacter()
{
//Debug.Log("ButtonNextCharacter");
currentlySelectedCharacter += 1;
if (currentlySelectedCharacter >= characterData.characterPrefabs.Length)
{
currentlySelectedCharacter = 1;
}
SetupCharacters();
StaticVariables.characterNumber = currentlySelectedCharacter;
}
public void ButtonColour()
{
//Debug.Log("ButtonColour");
StaticVariables.characterColour = Random.ColorHSV(0f, 1f, 1f, 1f, 0f, 1f);
SetupCharacterColours();
}
public void ButtonColourReset()
{
//Debug.Log("ButtonColourReset ");
StaticVariables.characterColour = new Color(0, 0, 0, 0);
SetupCharacters();
}
private void SetupCharacters()
{
textTitle.text = "" + characterData.characterTitles[currentlySelectedCharacter];
textHealth.text = "Health: " + characterData.characterHealths[currentlySelectedCharacter];
textSpeed.text = "Speed: " + characterData.characterSpeeds[currentlySelectedCharacter];
textAttack.text = "Attack: " + characterData.characterAttack[currentlySelectedCharacter];
textAbilities.text = "Abilities:\n" + characterData.characterAbilities[currentlySelectedCharacter];
if (currentInstantiatedCharacter)
{
Destroy(currentInstantiatedCharacter);
}
currentInstantiatedCharacter = Instantiate(characterData.characterPrefabs[currentlySelectedCharacter]);
currentInstantiatedCharacter.transform.position = podiumPosition.position;
currentInstantiatedCharacter.transform.rotation = podiumPosition.rotation;
characterSelection = currentInstantiatedCharacter.GetComponent<CharacterSelection>();
currentInstantiatedCharacter.transform.SetParent(this.transform.root);
SetupCharacterColours();
SetupPlayerName();
if (cameraObj)
{
characterSelection.floatingInfo.forward = cameraObj.transform.forward;
}
}
public void SetupCharacterColours()
{
// Debug.Log("SetupCharacterColours");
if (StaticVariables.characterColour != new Color(0, 0, 0, 0))
{
characterSelection.characterColour = StaticVariables.characterColour;
characterSelection.AssignColours();
}
}
public void InputFieldChangedPlayerName()
{
//Debug.Log("InputFieldChangedPlayerName");
StaticVariables.playerName = inputFieldPlayerName.text;
SetupPlayerName();
}
public void SetupPlayerName()
{
//Debug.Log("SetupPlayerName");
if (characterSelection)
{
characterSelection.playerName = StaticVariables.playerName;
characterSelection.AssignName();
}
}
public void LoadData()
{
// check if the static save data has been pre-set
if (StaticVariables.playerName != "")
{
if (inputFieldPlayerName)
{
inputFieldPlayerName.text = StaticVariables.playerName;
}
}
else
{
StaticVariables.playerName = "Player Name";
}
// check that prefab is set, or exists for saved character number data
if (StaticVariables.characterNumber > 0 && StaticVariables.characterNumber < characterData.characterPrefabs.Length)
{
currentlySelectedCharacter = StaticVariables.characterNumber;
}
else
{
StaticVariables.characterNumber = currentlySelectedCharacter;
}
}
}
}