1
This commit is contained in:
@@ -6,7 +6,10 @@
|
||||
"GUID:677cd05ca06c46b4395470200b1acdad",
|
||||
"GUID:d525ad6bd40672747bde77962f1c401e",
|
||||
"GUID:49b49c76ee64f6b41bf28ef951cb0e50",
|
||||
"GUID:2b6752324f5c76d4cad13e2095c77b9e"
|
||||
"GUID:2b6752324f5c76d4cad13e2095c77b9e",
|
||||
"GUID:e34a5702dd353724aa315fb8011f08c3",
|
||||
"GUID:296866320aab85a42a0403bf684bac59",
|
||||
"GUID:f51ebe6a0ceec4240a699833d6309b23"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
|
@@ -2,8 +2,12 @@ using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using BITKit;
|
||||
using BITKit.Modification;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
using YooAsset;
|
||||
|
||||
namespace BITFALL.Cosmetic
|
||||
{
|
||||
@@ -17,14 +21,16 @@ namespace BITFALL.Cosmetic
|
||||
remove => CosmeticService.Singleton.OnCosmeticsChanged -= value;
|
||||
}
|
||||
|
||||
public IDictionary<IModifyElement, object> Modifies { get; set; }
|
||||
public IDictionary<IModifyElement, object> Modified { get; set; }
|
||||
public IDictionary<IModifyElement, object> Modifies => CosmeticService.Singleton.Modifies;
|
||||
public IDictionary<IModifyElement, object> Modified => CosmeticService.Singleton.Modified;
|
||||
public void Add(IModifyElement modify, object obj)=>CosmeticService.Singleton.Add(modify,obj);
|
||||
|
||||
public void Remove(IModifyElement modify, out object obj)=>CosmeticService.Singleton.Remove(modify,out obj);
|
||||
}
|
||||
public class CosmeticService : MonoBehaviour,ICosmeticService
|
||||
{
|
||||
[DictionaryReferenceConfig(nameof(Cosmetic_Saved_Layout))]
|
||||
public const string Cosmetic_Saved_Layout= "Cosmetic_Saved_Layout";
|
||||
internal static ICosmeticService Singleton { get; private set; }
|
||||
|
||||
[SerializeField] private AssetableCosmetic[] initialCosmetics;
|
||||
@@ -37,24 +43,58 @@ namespace BITFALL.Cosmetic
|
||||
Singleton = this;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
private async void Start()
|
||||
{
|
||||
Cosmetics = initialCosmetics.OfType<ICosmetic>().ToArray();
|
||||
|
||||
if (PlayerPrefs.HasKey(Cosmetic_Saved_Layout))
|
||||
{
|
||||
var array = JsonConvert.DeserializeObject<string[]>(PlayerPrefs.GetString(Cosmetic_Saved_Layout));
|
||||
foreach (var path in array)
|
||||
{
|
||||
try
|
||||
{
|
||||
var asyncHandle = YooAssets.LoadAssetAsync(path);
|
||||
await asyncHandle;
|
||||
if (destroyCancellationToken.IsCancellationRequested) return;
|
||||
|
||||
var so = asyncHandle.AssetObject.As<AssetableCosmetic>();
|
||||
_modifyManager.Modified.Add(so.Type, so);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
BIT4Log.LogException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OnCosmeticsChanged?.Invoke();
|
||||
|
||||
destroyCancellationToken.Register(() =>
|
||||
{
|
||||
var array = _modifyManager.Modified.Values.Select(x => x.As<ICosmetic>().AddressablePath).ToArray();
|
||||
PlayerPrefs.SetString(Cosmetic_Saved_Layout, JsonConvert.SerializeObject(array));
|
||||
PlayerPrefs.Save();
|
||||
});
|
||||
}
|
||||
|
||||
private readonly IModifyManager _modifyManager = new ModifyManager();
|
||||
public IDictionary<IModifyElement, object> Modifies => _modifyManager.Modifies;
|
||||
public IDictionary<IModifyElement, object> Modified => _modifyManager.Modified;
|
||||
|
||||
public void Add(IModifyElement modify, object obj)
|
||||
{
|
||||
_modifyManager.Add(modify, obj);
|
||||
if (Modified.TryGetValue(modify, out var x))
|
||||
{
|
||||
Modified.Remove(modify);
|
||||
}
|
||||
_modifyManager.Add(modify, obj);
|
||||
OnCosmeticsChanged?.Invoke();
|
||||
}
|
||||
public void Remove(IModifyElement modify, out object obj)
|
||||
{
|
||||
_modifyManager.Remove(modify, out obj);
|
||||
OnCosmeticsChanged?.Invoke();
|
||||
_modifyManager.Remove(modify, out obj);
|
||||
OnCosmeticsChanged?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ using BITFALL.Cosmetic;
|
||||
using BITFALL.Entities.Equipment;
|
||||
using BITFALL.Player.Movement;
|
||||
using BITKit.PlayerCamera;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
namespace BITKit.Entities.Player.Character
|
||||
@@ -54,7 +55,7 @@ namespace BITKit.Entities.Player.Character
|
||||
cosmeticService.OnCosmeticsChanged += Rebuild;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
@@ -71,27 +72,22 @@ namespace BITKit.Entities.Player.Character
|
||||
_entityOverride.OnOverride += _ =>
|
||||
{
|
||||
UpdateMeshState();
|
||||
allowFPVOverride.SetElements(_entityOverride,_);
|
||||
allowFPVOverride.SetElements(_entityOverride, _);
|
||||
};
|
||||
_tpvRendererGroup = tpvRendererGroup.SelectMany(x => x.GetComponentsInChildren<Renderer>(true)).ToArray();
|
||||
|
||||
if (_equipment is not null)
|
||||
{
|
||||
_equipment.OnEquipAddressable += _ =>
|
||||
{
|
||||
allowFPVOverride.RemoveElement(_equipment);
|
||||
};
|
||||
_equipment.OnUnEquipAddressable += _ =>
|
||||
{
|
||||
allowFPVOverride.AddElement(_equipment);
|
||||
};
|
||||
_equipment.OnEquipAddressable += _ => { allowFPVOverride.RemoveElement(_equipment); };
|
||||
_equipment.OnUnEquipAddressable += _ => { allowFPVOverride.AddElement(_equipment); };
|
||||
}
|
||||
|
||||
if (_movement is not null)
|
||||
{
|
||||
_movement.OnStateChanged += OnNewState;
|
||||
|
||||
OnNewState(null,_movement.CurrentState);
|
||||
|
||||
OnNewState(null, _movement.CurrentState);
|
||||
|
||||
void OnNewState(IEntityMovementState oldState, IEntityMovementState newState)
|
||||
{
|
||||
allowFPVOverride.SetDisableElements(_movement, newState switch
|
||||
@@ -107,7 +103,7 @@ namespace BITKit.Entities.Player.Character
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
allowFPVOverride.AddListener(value =>
|
||||
{
|
||||
foreach (var x in fpvOverrideRenderers)
|
||||
@@ -115,11 +111,13 @@ namespace BITKit.Entities.Player.Character
|
||||
x.enabled = value;
|
||||
}
|
||||
});
|
||||
|
||||
allowFPVOverride.AddElement(_equipment);
|
||||
|
||||
|
||||
// if (_equipment is not null)
|
||||
// allowFPVOverride.AddElement(_equipment);
|
||||
|
||||
Rebuild();
|
||||
}
|
||||
|
||||
public override void OnPlayerInitialized()
|
||||
{
|
||||
UpdateMeshState();
|
||||
@@ -139,10 +137,12 @@ namespace BITKit.Entities.Player.Character
|
||||
|
||||
private void UpdateMeshState()
|
||||
{
|
||||
allowFPVOverride.Invoke();
|
||||
switch (_health, _cameraService)
|
||||
{
|
||||
case (null, null):
|
||||
SetFPV(true);
|
||||
SetFPV(false);
|
||||
allowFPVOverride.Invoke(false);
|
||||
break;
|
||||
case (null, not null):
|
||||
SetFPV(_cameraService.IsCameraActivated);
|
||||
@@ -154,7 +154,7 @@ namespace BITKit.Entities.Player.Character
|
||||
SetFPV(_health.IsAlive && _cameraService.IsCameraActivated);
|
||||
break;
|
||||
}
|
||||
allowFPVOverride.Invoke();
|
||||
|
||||
}
|
||||
|
||||
private void SetFPV(bool isFpv)
|
||||
@@ -179,8 +179,11 @@ namespace BITKit.Entities.Player.Character
|
||||
}
|
||||
}
|
||||
[BIT]
|
||||
private void Rebuild()
|
||||
private async void Rebuild()
|
||||
{
|
||||
await UniTask.Delay(100);
|
||||
await UniTask.SwitchToMainThread();
|
||||
if (destroyCancellationToken.IsCancellationRequested) return;
|
||||
fpvRenderer.Clear();
|
||||
tpvRenderer.Clear();
|
||||
fpvOverrideRenderers.Clear();
|
||||
@@ -201,6 +204,7 @@ namespace BITKit.Entities.Player.Character
|
||||
|
||||
UpdateMeshState();
|
||||
allowFPVOverride.Invoke();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@@ -5,6 +5,7 @@ using System.Linq;
|
||||
using BITFALL.Cosmetic;
|
||||
using BITKit;
|
||||
using BITKit.Entities;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BITFALL.Entities.Cosmetic
|
||||
@@ -23,19 +24,26 @@ namespace BITFALL.Entities.Cosmetic
|
||||
destroyCancellationToken.Register(() => _cosmeticService.OnCosmeticsChanged -= OnCosmeticsChanged);
|
||||
}
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
base.OnStart();
|
||||
OnCosmeticsChanged();
|
||||
}
|
||||
|
||||
private void OnCosmeticsChanged()
|
||||
{
|
||||
foreach (var cosmetic in _cosmeticService.Cosmetics)
|
||||
foreach (var cosmetic in _cosmeticService.Modified.Values.OfType<ICosmetic>())
|
||||
{
|
||||
foreach (var content in cosmetic.Contents.OfType<CosmeticModelContent>())
|
||||
{
|
||||
foreach (var _renderer in currentRenderers)
|
||||
{
|
||||
Destroy(_renderer);
|
||||
Destroy(_renderer.gameObject);
|
||||
}
|
||||
var instance = Instantiate(content.Model, armature);
|
||||
var instance = Instantiate(content.Model);
|
||||
currentRenderers = instance.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
||||
TransferSkinnedMeshes(currentRenderers, meshRoot, armature);
|
||||
Destroy(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -33,6 +33,7 @@ namespace BITFALL.Entities.Cosmetic
|
||||
{
|
||||
foreach (var _renderer in renderers)
|
||||
{
|
||||
if (!_renderer) continue;
|
||||
if (content.Texture is Texture2D texture2D)
|
||||
{
|
||||
var multiple = texture2D.width / 64;
|
||||
|
@@ -48,7 +48,8 @@ namespace BITFALL.UX
|
||||
instance.icon.style.backgroundImage = new StyleBackground(so.Icon);
|
||||
instance.contextLabel.text = so.name;
|
||||
|
||||
if(modified.Contains(cosmetic))
|
||||
var inUsed = modified.Contains(cosmetic);
|
||||
if(inUsed)
|
||||
{
|
||||
instance.visualElement.AddToClassList("--toggled");
|
||||
}
|
||||
@@ -57,15 +58,27 @@ namespace BITFALL.UX
|
||||
{
|
||||
try
|
||||
{
|
||||
_cosmeticService.Add(so.Type, cosmetic);
|
||||
if (inUsed)
|
||||
{
|
||||
_cosmeticService.Remove(so.Type, out _);
|
||||
}
|
||||
else
|
||||
{
|
||||
_cosmeticService.Add(so.Type, cosmetic);
|
||||
}
|
||||
|
||||
}
|
||||
catch (NotRequireModifyException e)
|
||||
{
|
||||
Alert.Print("需要前置",e.Message);
|
||||
Alert.Print("需要前置", e.Message);
|
||||
}
|
||||
catch (IncompatibleModifyException e)
|
||||
{
|
||||
Alert.Print("不兼容的修改",e.Message);
|
||||
Alert.Print("不兼容的修改", e.Message);
|
||||
}
|
||||
catch (NotSupportModifyException e)
|
||||
{
|
||||
Alert.Print("不支持的修改", e.Message);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@@ -28,7 +28,6 @@ namespace BITFALL.UX
|
||||
[SerializeReference, SubclassSelector] private ISceneService SceneService;
|
||||
|
||||
[Header(Constant.Header.Components)]
|
||||
[SerializeField] private GameObject menuObject;
|
||||
[SerializeField] private UXButton playButton;
|
||||
[SerializeField] private UXButton stopButton;
|
||||
[SerializeField] private UXButton exitButton;
|
||||
@@ -96,7 +95,6 @@ namespace BITFALL.UX
|
||||
|
||||
private void OnConnected()
|
||||
{
|
||||
menuObject.SetActive(false);
|
||||
newHostContainer.SetActive(false);
|
||||
stopButton.SetActive(true);
|
||||
exitButton.SetActive(false);
|
||||
@@ -104,7 +102,6 @@ namespace BITFALL.UX
|
||||
}
|
||||
private void OnDisconnected()
|
||||
{
|
||||
menuObject.SetActive(true);
|
||||
newHostContainer.SetActive(true);
|
||||
stopButton.SetActive(false);
|
||||
exitButton.SetActive(true);
|
||||
|
Reference in New Issue
Block a user