装备系统完结,修复并加入很多
This commit is contained in:
@@ -0,0 +1,354 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class ctasPrefab : MonoBehaviour
|
||||
{
|
||||
[Header("template SO")]
|
||||
public equipmentSO eTemplate;
|
||||
public equipmentRandomConfigSO randomConfig;
|
||||
|
||||
[Header("objs")]
|
||||
public GameObject select_type_obj;
|
||||
public GameObject select_skill_obj;
|
||||
|
||||
[Header("prefab and parent")]
|
||||
public GameObject select_typePrefab;
|
||||
public Transform select_typeParent;
|
||||
public GameObject select_skillPrefab;
|
||||
public Transform select_skillParent;
|
||||
|
||||
[Header("text")]
|
||||
public Text currentSelectText;
|
||||
|
||||
[Header("buttons")]
|
||||
public Button yesSelectThis;
|
||||
public Button noWaitButton;
|
||||
|
||||
private readonly List<GameObject> spawnedTypeItems = new List<GameObject>();
|
||||
private readonly List<GameObject> spawnedSkillItems = new List<GameObject>();
|
||||
|
||||
private equipmentSO.EquipmentSkillType selectedType;
|
||||
private int selectedSkillGroupId;
|
||||
private string selectedSkillGroupName = string.Empty;
|
||||
private GameObject selectedTypeObject;
|
||||
private bool hasSelectedType;
|
||||
private bool allowTypeSelection = true;
|
||||
private bool allowSkillSelection;
|
||||
private bool initializedExternally;
|
||||
private Action<equipmentSO.EquipmentSkillType, int> onConfirmSelection;
|
||||
private Action onClosed;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (initializedExternally)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
BindButtons();
|
||||
BuildTypeOptions();
|
||||
ApplySelectionModeState();
|
||||
UpdateCurrentSelectText();
|
||||
RefreshButtons();
|
||||
}
|
||||
|
||||
public void Initialize(equipmentSO template, equipmentRandomConfigSO config, bool requireTypeSelection, bool requireSkillSelection, Action<equipmentSO.EquipmentSkillType, int> onConfirm, Action closeCallback = null)
|
||||
{
|
||||
eTemplate = template;
|
||||
randomConfig = config;
|
||||
allowTypeSelection = requireTypeSelection;
|
||||
allowSkillSelection = requireSkillSelection;
|
||||
initializedExternally = true;
|
||||
onConfirmSelection = onConfirm;
|
||||
onClosed = closeCallback;
|
||||
|
||||
selectedType = default;
|
||||
hasSelectedType = false;
|
||||
selectedSkillGroupId = 0;
|
||||
selectedSkillGroupName = string.Empty;
|
||||
|
||||
if (eTemplate != null)
|
||||
{
|
||||
eTemplate.sa_skillID = 0;
|
||||
}
|
||||
|
||||
if (!requireTypeSelection)
|
||||
{
|
||||
selectedType = eTemplate != null ? eTemplate.skillType : default;
|
||||
hasSelectedType = true;
|
||||
}
|
||||
|
||||
BindButtons();
|
||||
BuildTypeOptions();
|
||||
ApplySelectionModeState();
|
||||
UpdateCurrentSelectText();
|
||||
RefreshButtons();
|
||||
}
|
||||
|
||||
private void BindButtons()
|
||||
{
|
||||
if (yesSelectThis != null)
|
||||
{
|
||||
yesSelectThis.onClick.RemoveListener(HandleConfirmClicked);
|
||||
yesSelectThis.onClick.AddListener(HandleConfirmClicked);
|
||||
}
|
||||
|
||||
if (noWaitButton != null)
|
||||
{
|
||||
noWaitButton.onClick.RemoveListener(HandleCancelClicked);
|
||||
noWaitButton.onClick.AddListener(HandleCancelClicked);
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildTypeOptions()
|
||||
{
|
||||
ClearSpawned(spawnedTypeItems, select_typeParent);
|
||||
selectedTypeObject = null;
|
||||
|
||||
if (select_typePrefab == null || select_typeParent == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Array values = Enum.GetValues(typeof(equipmentSO.EquipmentSkillType));
|
||||
for (int i = 0; i < values.Length; i++)
|
||||
{
|
||||
equipmentSO.EquipmentSkillType skillType = (equipmentSO.EquipmentSkillType)values.GetValue(i);
|
||||
GameObject instance = Instantiate(select_typePrefab, select_typeParent);
|
||||
spawnedTypeItems.Add(instance);
|
||||
|
||||
chooseTypePrefab item = instance.GetComponent<chooseTypePrefab>();
|
||||
if (item != null)
|
||||
{
|
||||
item.Bind(skillType, HandleTypeSelected);
|
||||
}
|
||||
|
||||
if (hasSelectedType && skillType == selectedType)
|
||||
{
|
||||
selectedTypeObject = instance;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void HandleTypeSelected(equipmentSO.EquipmentSkillType skillType, chooseTypePrefab source)
|
||||
{
|
||||
selectedType = skillType;
|
||||
hasSelectedType = true;
|
||||
selectedTypeObject = source != null ? source.gameObject : null;
|
||||
|
||||
if (eTemplate != null)
|
||||
{
|
||||
eTemplate.skillType = skillType;
|
||||
}
|
||||
|
||||
if (allowSkillSelection)
|
||||
{
|
||||
selectedSkillGroupId = 0;
|
||||
selectedSkillGroupName = string.Empty;
|
||||
if (eTemplate != null)
|
||||
{
|
||||
eTemplate.sa_skillID = 0;
|
||||
}
|
||||
|
||||
if (select_skill_obj != null)
|
||||
{
|
||||
select_skill_obj.SetActive(true);
|
||||
}
|
||||
|
||||
BuildSkillOptions(skillType);
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearSpawned(spawnedSkillItems, select_skillParent);
|
||||
}
|
||||
|
||||
UpdateCurrentSelectText();
|
||||
RefreshButtons();
|
||||
}
|
||||
|
||||
private void BuildSkillOptions(equipmentSO.EquipmentSkillType skillType)
|
||||
{
|
||||
ClearSpawned(spawnedSkillItems, select_skillParent);
|
||||
|
||||
if (select_skillPrefab == null || select_skillParent == null || randomConfig == null || randomConfig.specialSkillPool == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < randomConfig.specialSkillPool.Count; i++)
|
||||
{
|
||||
equipmentRandomConfigSO.SpecialSkillPoolEntry entry = randomConfig.specialSkillPool[i];
|
||||
if (entry == null || entry.skillType != skillType || entry.skillIds == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int skillIndex = 0; skillIndex < entry.skillIds.Count; skillIndex++)
|
||||
{
|
||||
int skillGroupId = Mathf.Max(0, entry.skillIds[skillIndex]);
|
||||
if (skillGroupId <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
SkillGroup group = EquipmentSkillGroupLibrary.ResolveSpecialSkillGroup(skillGroupId);
|
||||
if (group == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
GameObject instance = Instantiate(select_skillPrefab, select_skillParent);
|
||||
spawnedSkillItems.Add(instance);
|
||||
|
||||
chooseSkillPrefab item = instance.GetComponent<chooseSkillPrefab>();
|
||||
if (item != null)
|
||||
{
|
||||
item.Bind(skillGroupId, group.groupName, group.groupIcon, group.skillDescriptionsText, HandleSkillSelected);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleSkillSelected(int skillGroupId)
|
||||
{
|
||||
selectedSkillGroupId = Mathf.Max(0, skillGroupId);
|
||||
selectedSkillGroupName = ResolveSkillGroupName(selectedSkillGroupId);
|
||||
|
||||
if (eTemplate != null)
|
||||
{
|
||||
eTemplate.skillType = selectedType;
|
||||
eTemplate.sa_skillID = selectedSkillGroupId;
|
||||
}
|
||||
|
||||
UpdateCurrentSelectText();
|
||||
RefreshButtons();
|
||||
}
|
||||
|
||||
private void ApplySelectionModeState()
|
||||
{
|
||||
if (select_type_obj != null)
|
||||
{
|
||||
select_type_obj.SetActive(allowTypeSelection);
|
||||
}
|
||||
|
||||
if (select_skill_obj != null)
|
||||
{
|
||||
bool shouldShowSkillSelector = allowSkillSelection && (!allowTypeSelection || hasSelectedType);
|
||||
select_skill_obj.SetActive(shouldShowSkillSelector);
|
||||
}
|
||||
|
||||
if (allowSkillSelection && select_skill_obj != null && select_skill_obj.activeSelf)
|
||||
{
|
||||
BuildSkillOptions(selectedType);
|
||||
}
|
||||
else if (!allowSkillSelection)
|
||||
{
|
||||
ClearSpawned(spawnedSkillItems, select_skillParent);
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshButtons()
|
||||
{
|
||||
if (yesSelectThis != null)
|
||||
{
|
||||
yesSelectThis.interactable = IsSelectionValid();
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsSelectionValid()
|
||||
{
|
||||
if (allowTypeSelection && !hasSelectedType)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (allowSkillSelection && selectedSkillGroupId <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void UpdateCurrentSelectText()
|
||||
{
|
||||
if (currentSelectText == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!hasSelectedType)
|
||||
{
|
||||
currentSelectText.text = "当前未选择装备类型";
|
||||
return;
|
||||
}
|
||||
|
||||
if (allowSkillSelection && selectedSkillGroupId > 0 && !string.IsNullOrWhiteSpace(selectedSkillGroupName))
|
||||
{
|
||||
currentSelectText.text = $"当前选择 <b>{selectedType}</b> 装备,必定带有 <b>{selectedSkillGroupName}</b> 技能";
|
||||
return;
|
||||
}
|
||||
|
||||
currentSelectText.text = $"当前选择 <b>{selectedType}</b> 装备";
|
||||
}
|
||||
|
||||
private void HandleConfirmClicked()
|
||||
{
|
||||
if (!IsSelectionValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
onConfirmSelection?.Invoke(selectedType, selectedSkillGroupId);
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
private void HandleCancelClicked()
|
||||
{
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (eTemplate != null && (eTemplate.hideFlags & HideFlags.DontSave) != 0)
|
||||
{
|
||||
Destroy(eTemplate);
|
||||
}
|
||||
|
||||
onClosed?.Invoke();
|
||||
}
|
||||
|
||||
private static string ResolveSkillGroupName(int skillGroupId)
|
||||
{
|
||||
if (skillGroupId <= 0)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
SkillGroup group = EquipmentSkillGroupLibrary.ResolveSpecialSkillGroup(skillGroupId);
|
||||
return group != null ? group.groupName : string.Empty;
|
||||
}
|
||||
|
||||
private static void ClearSpawned(List<GameObject> spawned, Transform parent)
|
||||
{
|
||||
if (parent != null)
|
||||
{
|
||||
for (int i = parent.childCount - 1; i >= 0; i--)
|
||||
{
|
||||
Transform child = parent.GetChild(i);
|
||||
if (child != null)
|
||||
{
|
||||
Destroy(child.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (spawned != null)
|
||||
{
|
||||
spawned.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user