V3.3.0 MultiLevel功能创建完成
MultiLevel功能创建完成,play模式基本功能适配结束。下次再也不隔这么久commit一次了:(
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
using DG.Tweening;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class TargetButtonActivateColorChanger : MonoBehaviour
|
||||
{
|
||||
public List<Button> clickableButton = new List<Button>();
|
||||
public List<Button> unclickableButton = new List<Button>();
|
||||
|
||||
public Color32 normalTextColor = new Color32(236, 236, 236, 255);
|
||||
public Color32 normalBGColor = new Color32(255, 255, 255, 0);
|
||||
public Color32 highLightTextColor = new Color32(41, 41, 41, 230);
|
||||
public Color32 highLightBGColor = new Color32(255, 255, 255, 103);
|
||||
public Color32 pressedTextColor = new Color32(0, 0, 0, 240);
|
||||
public Color32 pressedBGColor = new Color32(255, 255, 255, 160);
|
||||
public Color32 disableTextColor = new Color32(180, 180, b: 180, 80);
|
||||
public Color32 disableBGColor = new Color32(255, 255, b: 255, 0);
|
||||
public float colorChangeSpeed = 0.1f;
|
||||
|
||||
public bool clickable = true;
|
||||
|
||||
// Start is called before the first frame update
|
||||
private void Start()
|
||||
{
|
||||
foreach (Button btn in clickableButton)
|
||||
{
|
||||
InitializeEventTriggers(btn, true);
|
||||
}
|
||||
|
||||
foreach (Button btn in unclickableButton)
|
||||
{
|
||||
InitializeEventTriggers(btn, false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the event triggers for a button to handle its interactive behavior.
|
||||
/// </summary>
|
||||
/// <param name="btn">The button object to initialize.</param>
|
||||
/// <param name="isClickable">Indicates whether the button is clickable.</param>
|
||||
private void InitializeEventTriggers(Button btn, bool isClickable)
|
||||
{
|
||||
EventTrigger eventTrigger = btn.GetComponent<EventTrigger>();
|
||||
if (eventTrigger == null)
|
||||
{
|
||||
eventTrigger = btn.gameObject.AddComponent<EventTrigger>();
|
||||
}
|
||||
|
||||
AddEventTrigger(eventTrigger, EventTriggerType.PointerEnter, (eventData) => OnPointerEnter(btn));
|
||||
AddEventTrigger(eventTrigger, EventTriggerType.PointerExit, (eventData) => OnPointerExit(btn));
|
||||
if (isClickable)
|
||||
{
|
||||
AddEventTrigger(eventTrigger, EventTriggerType.PointerDown, (eventData) => OnPointerDown(btn));
|
||||
AddEventTrigger(eventTrigger, EventTriggerType.PointerUp, (eventData) => OnPointerUp(btn));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds an event trigger entry to an event trigger.
|
||||
/// </summary>
|
||||
/// <param name="trigger">The event trigger object.</param>
|
||||
/// <param name="type">The event trigger type.</param>
|
||||
/// <param name="action">The event handler method to execute.</param>
|
||||
private void AddEventTrigger(EventTrigger trigger, EventTriggerType type, UnityEngine.Events.UnityAction<BaseEventData> action)
|
||||
{
|
||||
EventTrigger.Entry entry = new EventTrigger.Entry();
|
||||
entry.eventID = type;
|
||||
entry.callback.AddListener(action);
|
||||
trigger.triggers.Add(entry);
|
||||
}
|
||||
|
||||
private void OnPointerEnter(Button btn)
|
||||
{
|
||||
if (btn.interactable)
|
||||
{
|
||||
btn.image.DOColor(highLightBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(highLightTextColor, colorChangeSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPointerExit(Button btn)
|
||||
{
|
||||
if (btn.interactable)
|
||||
{
|
||||
btn.image.DOColor(normalBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(normalTextColor, colorChangeSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPointerDown(Button btn)
|
||||
{
|
||||
if (btn.interactable)
|
||||
{
|
||||
btn.image.DOColor(pressedBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(pressedTextColor, colorChangeSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPointerUp(Button btn)
|
||||
{
|
||||
if (btn.interactable)
|
||||
{
|
||||
btn.image.DOColor(highLightBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(normalTextColor, colorChangeSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Changes the interactable state of a button and modifies its color based on the state.
|
||||
/// </summary>
|
||||
/// <param name="btn">The button object to change the state and color of.</param>
|
||||
/// <param name="changeTo">Indicates the interactable state to change to.</param>
|
||||
public void ChangeInteractableColor(Button btn, bool changeTo)
|
||||
{
|
||||
btn.interactable = changeTo;
|
||||
if (changeTo)
|
||||
{
|
||||
btn.image.DOColor(normalBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(normalTextColor, colorChangeSpeed);
|
||||
}
|
||||
else
|
||||
{
|
||||
btn.image.DOColor(disableBGColor, colorChangeSpeed);
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().DOColor(disableTextColor, colorChangeSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a button to the button list and initializes the button's event triggers based on its clickability.
|
||||
/// </summary>
|
||||
/// <param name="btn">The button object to add to the button list.</param>
|
||||
/// <param name="clickable">Indicates whether the button is clickable.</param>
|
||||
public void AddButtonToColorChangerButtonList(Button btn,bool clickable)
|
||||
{
|
||||
if (clickable)
|
||||
{
|
||||
clickableButton.Add(btn);
|
||||
InitializeEventTriggers(btn, clickable);
|
||||
}
|
||||
else
|
||||
{
|
||||
unclickableButton.Add(btn);
|
||||
InitializeEventTriggers(btn, clickable);
|
||||
}
|
||||
}
|
||||
|
||||
public void InitializeAllButtonColor()
|
||||
{
|
||||
foreach(Button btn in clickableButton)
|
||||
{
|
||||
btn.image.color = normalBGColor;
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().color = normalTextColor;
|
||||
}
|
||||
foreach (Button btn in unclickableButton)
|
||||
{
|
||||
btn.image.color = disableBGColor;
|
||||
btn.GetComponentInChildren<TextMeshProUGUI>().color = disableTextColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 48f605c5c3d09384fa6b248789466476
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,4 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class TargetUIController : MonoBehaviour
|
||||
@@ -6,84 +9,245 @@ public class TargetUIController : MonoBehaviour
|
||||
// Controller to control the UI of the target,
|
||||
// select target type, select prefeb to set or sth.
|
||||
public GameObject targetControllerObj;
|
||||
|
||||
public GameObject mouseSelectorObj;
|
||||
public GameObject environmentUIObj;
|
||||
|
||||
public float levelButtonHeight = 30;
|
||||
|
||||
[Header("PrimaryButton")]
|
||||
public Button clearGameButton;
|
||||
public Button setEnemyButton;
|
||||
public Button setAttackButton;
|
||||
public Button setGotoButton;
|
||||
public Button setFreeButton;
|
||||
public Button setStayButton;
|
||||
public int primaryButtonNumber = 6;
|
||||
|
||||
[Header("LevelPanel")]
|
||||
public GameObject gotoLevelPanel;
|
||||
|
||||
public GameObject attackLevelPanel;
|
||||
public float levelPanelAnimeTime = 0.2f;
|
||||
|
||||
private MouseInMap mouseInMapCon;
|
||||
private EnvironmentUIControl envUICon;
|
||||
private TargetController targetCon;
|
||||
private MessageBoxController messageBoxController;
|
||||
private TargetButtonActivateColorChanger buttonColorChanger;
|
||||
|
||||
public enum PrimaryButtonType
|
||||
{ Goto, Attack, Free }
|
||||
|
||||
public delegate void PointerInOutUIEventDelegate(Button button, GameObject panel, BaseEventData eventData);
|
||||
|
||||
private void Start()
|
||||
{
|
||||
targetCon = targetControllerObj.GetComponent<TargetController>();
|
||||
mouseInMapCon = mouseSelectorObj.GetComponent<MouseInMap>();
|
||||
envUICon = environmentUIObj.GetComponent<EnvironmentUIControl>();
|
||||
messageBoxController = GetComponent<MessageBoxController>();
|
||||
buttonColorChanger = GetComponent<TargetButtonActivateColorChanger>();
|
||||
|
||||
gotoLevelPanel.GetComponent<LevelPanel>().InitLevelPanel(
|
||||
targetCon.gotoLevelNum,
|
||||
setGotoButton,
|
||||
levelButtonHeight);
|
||||
attackLevelPanel.GetComponent<LevelPanel>().InitLevelPanel(
|
||||
targetCon.attackLevelNum,
|
||||
setAttackButton,
|
||||
levelButtonHeight);
|
||||
AddLevelButtonToColorChanger(gotoLevelPanel);
|
||||
AddLevelButtonToColorChanger(attackLevelPanel);
|
||||
AddPointerEnterButtonTrigger(setGotoButton, gotoLevelPanel, PointerEnterButtonAction);
|
||||
AddPointerEnterButtonTrigger(setAttackButton, attackLevelPanel, PointerEnterButtonAction);
|
||||
AddPointerExitButtonTrigger(setGotoButton, gotoLevelPanel, PointerExitButtonAction);
|
||||
AddPointerExitButtonTrigger(setAttackButton, attackLevelPanel, PointerExitButtonAction);
|
||||
AddPointerExitLevelPanelTrigger(setGotoButton, gotoLevelPanel, PointerExitLevelPanelAction);
|
||||
AddPointerExitLevelPanelTrigger(setAttackButton, attackLevelPanel, PointerExitLevelPanelAction);
|
||||
buttonColorChanger.InitializeAllButtonColor();
|
||||
ClearGamePressed();
|
||||
}
|
||||
|
||||
public void LevelButtonPressed(PrimaryButtonType primaryButtonType, int level = 0)
|
||||
{
|
||||
switch (primaryButtonType)
|
||||
{
|
||||
case PrimaryButtonType.Goto:
|
||||
SetGotoPressed(level);
|
||||
break;
|
||||
|
||||
case PrimaryButtonType.Attack:
|
||||
SetAttackPressed(level);
|
||||
break;
|
||||
|
||||
default:
|
||||
messageBoxController.PushMessage(new List<string> { "TargetUIController.LevelButtonPressed:", "Button Type Wrong, not level included button" },
|
||||
new List<string> { messageBoxController.errorColor });
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Clear Game Button Pressed, delete all enemies and targets
|
||||
public void ClearGamePressed()
|
||||
{
|
||||
// Clear all enemies and targets. set gamemode to Stay mode
|
||||
targetCon.StayModeChange();
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
|
||||
// disable setStayButton and enable other buttons
|
||||
setStayButton.interactable = false;
|
||||
setAttackButton.interactable = true;
|
||||
setGotoButton.interactable = true;
|
||||
setFreeButton.interactable = true;
|
||||
buttonColorChanger.ChangeInteractableColor(clearGameButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setEnemyButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setFreeButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setStayButton, false);
|
||||
targetCon.PlayInitialize();
|
||||
}
|
||||
|
||||
// Set Free Button Pressed, change Target mode to free mode
|
||||
public void SetFreePressed()
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
|
||||
targetCon.FreeModeChange();
|
||||
buttonColorChanger.ChangeInteractableColor(setStayButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setFreeButton, false);
|
||||
}
|
||||
|
||||
// Set Stay Button Pressed, change Target mode to stay mode
|
||||
public void SetStayPressed()
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
|
||||
targetCon.StayModeChange();
|
||||
buttonColorChanger.ChangeInteractableColor(setStayButton, false);
|
||||
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setFreeButton, true);
|
||||
}
|
||||
|
||||
// Set Enemy Button Pressed, change mouse mode to EnemySetMode
|
||||
public void SetEnemyPressed()
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.EnemySet);
|
||||
}
|
||||
|
||||
public void SetGotoPressed()
|
||||
// Set Goto Button Pressed, change mouse mode to GotoSetMode
|
||||
private void SetGotoPressed(int level)
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.GotoSet);
|
||||
setStayButton.interactable = true;
|
||||
setAttackButton.interactable = true;
|
||||
setGotoButton.interactable = false;
|
||||
setFreeButton.interactable = true;
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.GotoSet, level);
|
||||
buttonColorChanger.ChangeInteractableColor(clearGameButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setEnemyButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setStayButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setFreeButton, true);
|
||||
}
|
||||
|
||||
public void SetAttackPressed()
|
||||
// Set Attack Button Pressed, change mouse mode to AttackSetMode
|
||||
private void SetAttackPressed(int level)
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.AttackSet);
|
||||
setStayButton.interactable = true;
|
||||
setAttackButton.interactable = false;
|
||||
setGotoButton.interactable = true;
|
||||
setFreeButton.interactable = true;
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.AttackSet, level);
|
||||
buttonColorChanger.ChangeInteractableColor(clearGameButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setEnemyButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setStayButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
|
||||
buttonColorChanger.ChangeInteractableColor(setFreeButton, true);
|
||||
}
|
||||
|
||||
public void SetFreePressed()
|
||||
/// <summary>
|
||||
/// Adds level buttons from a level panel to the color changer, making them got interactable color.
|
||||
/// </summary>
|
||||
/// <param name="levelPanel">The level panel object containing the level buttons.</param>
|
||||
private void AddLevelButtonToColorChanger(GameObject levelPanel)
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
|
||||
targetCon.FreeModeChange();
|
||||
setStayButton.interactable = true;
|
||||
setAttackButton.interactable = true;
|
||||
setGotoButton.interactable = true;
|
||||
setFreeButton.interactable = false;
|
||||
foreach(Button btn in levelPanel.GetComponent<LevelPanel>().LevelButtonList)
|
||||
{
|
||||
buttonColorChanger.AddButtonToColorChangerButtonList(btn,true);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetStayPressed()
|
||||
/// <summary>
|
||||
/// sign up pointer enter event for button
|
||||
/// </summary>
|
||||
/// <param name="triggerButton">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="inAction">enter event trigered action</param>
|
||||
private void AddPointerEnterButtonTrigger(Button triggerButton, GameObject panel, PointerInOutUIEventDelegate inAction)
|
||||
{
|
||||
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
|
||||
targetCon.StayModeChange();
|
||||
setStayButton.interactable = false;
|
||||
setAttackButton.interactable = true;
|
||||
setGotoButton.interactable = true;
|
||||
setFreeButton.interactable = true;
|
||||
EventTrigger.Entry inEntry = new EventTrigger.Entry();
|
||||
inEntry.eventID = EventTriggerType.PointerEnter;
|
||||
inEntry.callback.AddListener((eventData) => inAction(triggerButton, panel, eventData));
|
||||
triggerButton.GetComponent<EventTrigger>().triggers.Add(inEntry);
|
||||
}
|
||||
|
||||
public void ShowLevelMenu(GameObject levelPanel)
|
||||
/// <summary>
|
||||
/// sign up pointer exit event for button
|
||||
/// </summary>
|
||||
/// <param name="triggerButton">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="inAction">exit event trigered action</param>
|
||||
private void AddPointerExitButtonTrigger(Button triggerButton, GameObject panel, PointerInOutUIEventDelegate outAction)
|
||||
{
|
||||
EventTrigger.Entry outEntry = new EventTrigger.Entry();
|
||||
outEntry.eventID = EventTriggerType.PointerExit;
|
||||
outEntry.callback.AddListener((eventData) => outAction(triggerButton, panel, eventData));
|
||||
triggerButton.GetComponent<EventTrigger>().triggers.Add(outEntry);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// sign up pointer exit event for panel
|
||||
/// </summary>
|
||||
/// <param name="triggerButton">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="inAction">exit event trigered action</param>
|
||||
private void AddPointerExitLevelPanelTrigger(Button triggerButton, GameObject panel, PointerInOutUIEventDelegate outAction)
|
||||
{
|
||||
EventTrigger.Entry entry = new EventTrigger.Entry();
|
||||
entry.eventID = EventTriggerType.PointerExit;
|
||||
entry.callback.AddListener((eventData) => outAction(triggerButton, panel, eventData));
|
||||
panel.GetComponent<EventTrigger>().triggers.Add(entry);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// pointer enter event action for button
|
||||
/// </summary>
|
||||
/// <param name="button">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="baseEventData">EventTrigger Parameter</param>
|
||||
private void PointerEnterButtonAction(Button button, GameObject panel, BaseEventData baseEventData)
|
||||
{
|
||||
panel.GetComponent<LevelPanel>().ExpandLevelPanel(levelPanelAnimeTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// pointer exit event action for button
|
||||
/// </summary>
|
||||
/// <param name="button">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="baseEventData">EventTrigger Parameter</param>
|
||||
private void PointerExitButtonAction(Button button, GameObject panel, BaseEventData baseEventData)
|
||||
{
|
||||
bool pointerInPanel = RectTransformUtility.RectangleContainsScreenPoint(panel.GetComponent<RectTransform>(), Input.mousePosition);
|
||||
if (!pointerInPanel)
|
||||
{
|
||||
panel.GetComponent<LevelPanel>().FoldLevelPanel(levelPanelAnimeTime);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// pointer enter event action for level panel
|
||||
/// </summary>
|
||||
/// <param name="button">target button</param>
|
||||
/// <param name="panel">target panel</param>
|
||||
/// <param name="baseEventData">EventTrigger Parameter</param>
|
||||
private void PointerExitLevelPanelAction(Button button, GameObject panel, BaseEventData baseEventData)
|
||||
{
|
||||
bool pointerInButton = RectTransformUtility.RectangleContainsScreenPoint(button.GetComponent<RectTransform>(), Input.mousePosition);
|
||||
if (!pointerInButton)
|
||||
{
|
||||
panel.GetComponent<LevelPanel>().FoldLevelPanel(levelPanelAnimeTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user