Compare commits

..

2 Commits

31 changed files with 673 additions and 596 deletions

View File

@ -36,7 +36,7 @@ namespace AxibugEmuOnline.Client.ClientCore
private static CoroutineRunner coRunner;
#endregion
#if UNITY_PSP2
#if UNITY_PSP2 && !UNITY_EDITOR //PSV真机
public static string PersistentDataPath => "ux0:data/AxibugEmu";
#else
public static string PersistentDataPath => Application.persistentDataPath;
@ -45,6 +45,12 @@ namespace AxibugEmuOnline.Client.ClientCore
{
PlayerPrefs.DeleteAll();
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{
//PSV 等平台需要手动创建目录
PSP2Init();
}
settings = new AppSettings();
log = new LogManager();
@ -68,11 +74,6 @@ namespace AxibugEmuOnline.Client.ClientCore
tickLoop = go.AddComponent<TickLoop>();
coRunner = go.AddComponent<CoroutineRunner>();
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{
//PSV 等平台需要手动创建目录
PersistentDataPathDir();
}
var importNode = GameObject.Find("IMPORTENT");
if (importNode != null) GameObject.DontDestroyOnLoad(importNode);
@ -81,12 +82,17 @@ namespace AxibugEmuOnline.Client.ClientCore
RePullNetInfo();
}
private static void PersistentDataPathDir()
private static void PSP2Init()
{
//PSVita最好手动创建目录
if (!Directory.Exists(PersistentDataPath))
{
Directory.CreateDirectory(PersistentDataPath);
}
#if UNITY_PSP2
//释放解码 FMV的26M内存一般游戏用不上PSP才用那破玩意儿
UnityEngine.PSVita.PSVitaVideoPlayer.TransferMemToMonoHeap();
#endif
}
private static IEnumerator AppTickFlow()

View File

@ -1,19 +1,12 @@
{
"name": "AxibugEmuOnline.Client",
"rootNamespace": "AxibugEmuOnline.Client",
"references": [
"VirtualNes.Core",
"UIEffect",
"AxiReplay",
"Unity.Postprocessing.Runtime"
],
"optionalUnityReferences": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": true,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
"allowUnsafeCode": true
}

View File

@ -249,6 +249,18 @@ Shader "PostEffect/FixingPixcelArtGrille"
else if(pos.x<0.666)mask.g=_maskLight;
else mask.b=_maskLight;
return mask;}
#else
// VGA style shadow mask.
float3 Mask(float2 pos){
pos.xy=floor(pos.xy*float2(1.0,0.5));
pos.x+=pos.y*3.0;
float3 mask=float3(_maskDark,_maskDark,_maskDark);
pos.x=fract(pos.x/6.0);
if(pos.x<0.333)mask.r=_maskLight;
else if(pos.x<0.666)mask.g=_maskLight;
else mask.b=_maskLight;
return mask;}
#endif

View File

@ -13,7 +13,7 @@ namespace AxibugEmuOnline.Client.Manager
/// </summary>
private IEmuCore m_emuCore;
private IControllerSetuper m_controllerSetuper;
private VirtualNes.Core.IControllerSetuper m_controllerSetuper;
/// <summary>
/// unity的c#实现有bug,以接口类型保存的monobehaviour引用,!=和==运算符没有调用到monobehaviour重写过的运算符
@ -84,10 +84,15 @@ namespace AxibugEmuOnline.Client.Manager
else //在房间中则使用服务器下发的手柄槽位信息分配本地手柄
{
long selfUID = App.user.userdata.UID;
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 0, out var con0Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 1, out var con1Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 2, out var con2Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 3, out var con3Slot);
uint? con0Slot;
uint? con1Slot;
uint? con2Slot;
uint? con3Slot;
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 0, out con0Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 1, out con1Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 2, out con2Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 3, out con3Slot);
m_controllerSetuper.SetConnect(con0Slot, con1Slot, con2Slot, con3Slot);
}

View File

@ -63,8 +63,11 @@ namespace AxibugEmuOnline.Client
private Dictionary<string, object> cachesInMemory = new Dictionary<string, object>();
void GetCacheData<T>(string url, string path, Action<T, string> callback) where T : class
{
if (cachesInMemory.TryGetValue(url, out var cacheObj) && cacheObj is T obj)
object cacheObj;
if (cachesInMemory.TryGetValue(url, out cacheObj) && cacheObj is T)
{
T obj = (T)cacheObj;
callback.Invoke(obj, url);
return;
}

View File

@ -22,6 +22,8 @@ namespace AxibugEmuOnline.Client
public FilterManager(PostProcessVolume filterVolume, CanvasGroup filterPreview, CanvasGroup mainBg)
{
if (filterVolume == null)
return;
m_filterPorfile = filterVolume.profile;
m_filters = m_filterPorfile.settings.Where(setting => setting is FilterEffect).Select(setting => new Filter(setting as FilterEffect)).ToList();
var json = PlayerPrefs.GetString(nameof(FilterRomSetting));
@ -86,20 +88,37 @@ namespace AxibugEmuOnline.Client
/// </summary>
/// <param name="rom">rom对象</param>
/// <returns>此元组任意内任意成员都有可能为空</returns>
public (Filter filter, FilterPreset preset) GetFilterSetting(RomFile rom)
public GetFilterSetting_result GetFilterSetting(RomFile rom)
{
var value = m_filterRomSetting.Get(rom);
Filter filter = null;
FilterPreset preset = null;
filter = Filters.FirstOrDefault(f => f.Name == value.filterName);
//filter = Filters.FirstOrDefault(f => f.Name == value.filterName);
//if (filter != null)
//{
// string presetName = value.presetName;
// preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
//}
filter = Filters.FirstOrDefault(f => f.Name == value.Item1);
if (filter != null)
{
string presetName = value.presetName;
string presetName = value.Item2;
preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
}
return (filter, preset);
return new GetFilterSetting_result()
{
filter = filter,
preset = preset
};
}
public struct GetFilterSetting_result
{
public Filter filter;
public FilterPreset preset;
}
public class Filter
@ -223,8 +242,8 @@ namespace AxibugEmuOnline.Client
public string GetParamValueJson(string paramName)
{
prepareCache();
m_paramName2ValueJson.TryGetValue(paramName, out var value);
string value;
m_paramName2ValueJson.TryGetValue(paramName, out value);
return value;
}
@ -235,7 +254,8 @@ namespace AxibugEmuOnline.Client
if (valueType == typeof(float))
{
float.TryParse(rawStr, out var floatVal);
float floatVal;
float.TryParse(rawStr, out floatVal);
return floatVal;
}
else if (valueType.IsEnum)
@ -309,12 +329,13 @@ namespace AxibugEmuOnline.Client
return JsonUtility.ToJson(this);
}
public (string filterName, string presetName) Get(RomFile rom)
public ValueTuple<string,string> Get(RomFile rom)
{
prepareCache();
m_cache.TryGetValue(rom.ID, out var item);
return (item.FilterName, item.PresetName);
Item item;
m_cache.TryGetValue(rom.ID, out item);
return new ValueTuple<string, string>(item.FilterName, item.PresetName);
}
private void prepareCache()

View File

@ -5,6 +5,7 @@ using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using static UnityEngine.EventSystems.EventTrigger;
namespace AxibugEmuOnline.Client
{
@ -95,7 +96,9 @@ namespace AxibugEmuOnline.Client
if (Path.GetExtension(LocalFilePath).ToLower() == ".zip")
{
var zip = new ZipInputStream(new MemoryStream(bytes));
while (zip.GetNextEntry() is ZipEntry entry)
var entry = zip.GetNextEntry() as ZipEntry;
while (entry != null)
{
if (!entry.Name.ToLower().EndsWith(".nes")) continue;

View File

@ -154,14 +154,16 @@ namespace AxibugEmuOnline.Client.Manager
for (int i = 0; i < msg.UserList.Count; i++)
{
UserMiniInfo mi = msg.UserList[i];
UpdateOrAddUser(mi, out bool isNewUser);
bool isNewUser;
UpdateOrAddUser(mi, out isNewUser);
}
Eventer.Instance.PostEvent(EEvent.OnUserListAllUpdate);
}
public void RecvCmdUserJoin(byte[] reqData)
{
Protobuf_UserJoin_RESP msg = ProtoBufHelper.DeSerizlize<Protobuf_UserJoin_RESP>(reqData);
UpdateOrAddUser(msg.UserInfo, out bool isNewUser);
bool isNewUser;
UpdateOrAddUser(msg.UserInfo, out isNewUser);
if (isNewUser)
{
Eventer.Instance.PostEvent(EEvent.OnUserLogin, msg.UserInfo.UID, msg.UserInfo.NickName);

View File

@ -6,7 +6,7 @@ public struct MsgBool
public string ErrorMsg;
public bool Value;
public override readonly string ToString()
public override string ToString()
{
if (Value)
{
@ -33,10 +33,10 @@ public struct MsgBool
return msgBool.Value;
}
public static implicit operator (bool, string)(MsgBool msgBool)
{
return (msgBool.Value, msgBool.ErrorMsg);
}
//public static implicit operator (bool, string)(MsgBool msgBool)
//{
// return (msgBool.Value, msgBool.ErrorMsg);
//}
public static implicit operator string(MsgBool msgBool)
{

View File

@ -1,4 +1,5 @@
using AxibugEmuOnline.Client.ClientCore;
using AxiReplay;
using System;
using System.IO;
using System.Runtime.InteropServices;
@ -102,7 +103,8 @@ namespace AxibugEmuOnline.Client
{
if (InGameUI.Instance.IsNetPlay)
{
if (App.roomMgr.netReplay.TryGetNextFrame((int)frameIndex, out var replayData, out int frameDiff, out bool inputDiff))
int targetFrame; ReplayStep replayData; int frameDiff; bool inputDiff;
if (App.roomMgr.netReplay.TryGetNextFrame((int)frameIndex, out replayData, out frameDiff, out inputDiff))
{
if (inputDiff)
{
@ -112,7 +114,7 @@ namespace AxibugEmuOnline.Client
m_sampledState = FromNet(replayData);
}
else m_sampledState = default;
else m_sampledState = default(ControllerState);
var localState = ControllerMapper.CreateState();
var rawData = ToNet(localState);

View File

@ -5,10 +5,10 @@ namespace AxibugEmuOnline.Client
{
public class NesControllerMapper : IControllerSetuper
{
public Controller Controller0 { get; } = new(0);
public Controller Controller1 { get; } = new(1);
public Controller Controller2 { get; } = new(2);
public Controller Controller3 { get; } = new(3);
public Controller Controller0 { get; } = new Controller(0);
public Controller Controller1 { get; } = new Controller(1);
public Controller Controller2 { get; } = new Controller(2);
public Controller Controller3 { get; } = new Controller(3);
private readonly EnumButtonType[] m_states = new EnumButtonType[4];
@ -138,7 +138,7 @@ namespace AxibugEmuOnline.Client
}
}
public readonly struct KeyListener
public struct KeyListener
{
private readonly KeyCode m_key;
@ -152,7 +152,8 @@ namespace AxibugEmuOnline.Client
{
m_key = KeyCode.None;
if (int.TryParse(confStr, out int result))
int result;
if (int.TryParse(confStr, out result))
m_key = (KeyCode)result;
}
@ -220,7 +221,7 @@ namespace AxibugEmuOnline.Client
break;
}
return default;
return default(KeyListener);
}
}

View File

@ -2,24 +2,19 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: NesEmulator_Screen
m_Shader: {fileID: 4800000, guid: b351396ff606116478d7f4412abe4e2e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
@ -63,7 +58,6 @@ Material:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
@ -91,5 +85,3 @@ Material:
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@ -13,7 +13,7 @@ namespace AxibugEmuOnline.Client.Network
private Dictionary<int, List<Delegate>> netEventDic = new Dictionary<int, List<Delegate>>(128);
private Queue<(int, int, byte[])> queueNetMsg = new Queue<(int, int, byte[])>();
private Queue<ValueTuple<int, int, byte[]>> queueNetMsg = new Queue<ValueTuple<int, int, byte[]>>();
private NetMsg() { }
@ -66,7 +66,7 @@ namespace AxibugEmuOnline.Client.Network
{
lock (lockQueueObj)
{
queueNetMsg.Enqueue((cmd, ERRCODE, arg));
queueNetMsg.Enqueue(new ValueTuple<int,int,byte[]>(cmd, ERRCODE, arg));
}
}
@ -76,7 +76,8 @@ namespace AxibugEmuOnline.Client.Network
{
while (queueNetMsg.Count > 0)
{
(int, int, byte[]) msgData = queueNetMsg.Dequeue();
var msgData = queueNetMsg.Dequeue();
PostNetMsgEvent(msgData.Item1, msgData.Item2, msgData.Item3);
}
}

View File

@ -39,7 +39,7 @@ namespace AxibugEmuOnline.Client
public void SetDependencyProperty(object data)
{
SetSelectState(data is ThirdMenuRoot tr && tr.SelectIndex == Index);
SetSelectState(data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index);
}
public void Release()

View File

@ -33,7 +33,7 @@ namespace AxibugEmuOnline.Client
public void SetDependencyProperty(object data)
{
SetSelectState(data is ThirdMenuRoot tr && tr.SelectIndex == Index);
SetSelectState(data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index);
if (m_select)
{
@ -87,7 +87,8 @@ namespace AxibugEmuOnline.Client
OverlayManager.Input((presetName) =>
{
var result = m_filter.CreatePreset(presetName, out var newPreset);
FilterPreset newPreset;
var result = m_filter.CreatePreset(presetName, out newPreset);
if (!result) OverlayManager.PopTip(result);
else optionUI.AddOptionMenuWhenPoping(new Opt_Presets(m_filter, newPreset));
}, "为预设设置一个名称", string.Empty);

View File

@ -37,12 +37,12 @@ namespace AxibugEmuOnline.Client
m_romlib.BeginFetchRomInfo(m_romfile);
}
SetSelectState(data is ThirdMenuRoot tr && tr.SelectIndex == Index);
SetSelectState(data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index);
}
public void SetDependencyProperty(object data)
{
SetSelectState(data is ThirdMenuRoot tr && tr.SelectIndex == Index);
SetSelectState(data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index);
}
public void Release()

View File

@ -11,7 +11,7 @@ namespace AxibugEmuOnline.Client
private object m_state;
private StepPerformer m_stepPerformer;
private readonly List<OptionMenu> menus = new();
private readonly List<OptionMenu> menus = new List<OptionMenu>();
public static InGameUI Instance { get; private set; }
public RomFile RomFile { get; private set; }

View File

@ -1,9 +1,6 @@
using AxibugEmuOnline.Client.ClientCore;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.Presets;
using UnityEngine;
using VirtualNes.Core;
using static AxibugEmuOnline.Client.FilterManager;
namespace AxibugEmuOnline.Client

View File

@ -39,8 +39,10 @@ public static class GameObjectPool
public static void Release(GameObject instance)
{
s_instanceToSrc.TryGetValue(instance, out var src);
if (src != null && s_poolMap.TryGetValue(src, out var pool))
GameObject src;
Queue<GameObject> pool;
s_instanceToSrc.TryGetValue(instance, out src);
if (src != null && s_poolMap.TryGetValue(src, out pool))
{
pool.Enqueue(instance);
//instance.SetActive(false);

View File

@ -480,8 +480,9 @@ public class ItemPresent : GridLayoutGroup, IVirtualLayout
if (_dataList != null)
_dataList.Clear();
}
else if (dataList is IEnumerable ienumrable)
else if (dataList is IEnumerable)
{
var ienumrable = (IEnumerable)dataList;
List<object> temp = new List<object>();
foreach (var item in ienumrable)
{

View File

@ -7,17 +7,17 @@ using UnityEngine.UI;
public interface IVirtualLayout
{
Dictionary<GameObject, ScripteInterface> CacheItemScripts { get; }
public List<object> DataList { get; }
public object DependencyProperty { get; }
public RectTransform RectTransform { get; }
public RectTransform GetTemplate(object data);
public Vector2 GetItemAnchorePos(int index);
public RectTransform GetItemUIIfExist(int index);
List<object> DataList { get; }
object DependencyProperty { get; }
RectTransform RectTransform { get; }
RectTransform GetTemplate(object data);
Vector2 GetItemAnchorePos(int index);
RectTransform GetItemUIIfExist(int index);
public void UpdateProxyVisualState();
public void UpdateDependencyProperty(object dp);
public void SetData(object dataList);
public void MoveToScrollViewCenter(ScrollRect scrollRect, int dataIndex);
void UpdateProxyVisualState();
void UpdateDependencyProperty(object dp);
void SetData(object dataList);
void MoveToScrollViewCenter(ScrollRect scrollRect, int dataIndex);
}
public class ItemProxy
@ -65,7 +65,9 @@ public class ItemProxy
{
if (_runtimeInstance == null) return null;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out ScripteInterface lfi);
ScripteInterface lfi;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out lfi);
return lfi;
}
@ -159,7 +161,9 @@ public class ItemProxy
_parent.CacheItemScripts[_runtimeInstance.gameObject] = newSI;
}
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out ScripteInterface si);
ScripteInterface si;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out si);
si.SetDataList(_parent.DataList[Index], Index);
if (_parent.DependencyProperty != null)
si.SetDependencyProperty(_parent.DependencyProperty);
@ -169,8 +173,8 @@ public class ItemProxy
public void UpdateDP()
{
if (_runtimeInstance == null) return;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out ScripteInterface luaInterface);
ScripteInterface luaInterface;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out luaInterface);
if (luaInterface == null) return;
if (_parent.DependencyProperty != null)
@ -191,7 +195,8 @@ public class ItemProxy
if (Application.isPlaying)
{
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out ScripteInterface si);
ScripteInterface si;
_parent.CacheItemScripts.TryGetValue(_runtimeInstance.gameObject, out si);
if (si != null) si.Release();
GameObjectPool.Release(_runtimeInstance.gameObject);
_runtimeInstance = null;

View File

@ -269,15 +269,17 @@ namespace AxibugEmuOnline.Client
private void CreateRuntimeMenuItem(OptionMenu menuData)
{
if (menuData is ExecuteMenu executeMenu)
if (menuData is ExecuteMenu)
{
ExecuteMenu executeMenu = (ExecuteMenu)menuData;
var menuUI = Instantiate(TEMPLATE_EXECUTEITEM.gameObject, TEMPLATE_EXECUTEITEM.transform.parent).GetComponent<OptionUI_ExecuteItem>();
menuUI.gameObject.SetActive(true);
menuUI.SetData(this, executeMenu);
m_runtimeMenuItems.Add(menuUI);
}
else if (menuData is ValueSetMenu valueSetMenu)
else if (menuData is ValueSetMenu)
{
var valueSetMenu = (ValueSetMenu)menuData;
var menuUI = Instantiate(TEMPLATE_VALUEEDITITEM.gameObject, TEMPLATE_VALUEEDITITEM.transform.parent).GetComponent<OptionUI_ValueEditItem>();
menuUI.gameObject.SetActive(true);
menuUI.SetData(this, valueSetMenu);

View File

@ -17,8 +17,9 @@ namespace AxibugEmuOnline.Client
com_floatEdit.gameObject.SetActive(false);
com_enumEdit.gameObject.SetActive(false);
if (menuData is ValueSetMenu valueMenu)
if (menuData is ValueSetMenu)
{
var valueMenu = (ValueSetMenu)menuData;
if (valueMenu.ValueType == typeof(float))
{
m_currentCom = com_floatEdit;

View File

@ -18,11 +18,11 @@ namespace AxibugEmuOnline.Client
protected override void OnShow(object param)
{
(Action<string> callback, string placeHolder, string defaultText) t = ((Action<string> callback, string placeHolder, string defaultText))param;
ValueTuple<Action<string>, string, string> t = (ValueTuple<Action<string>, string, string>)param;
OnCommit = t.callback;
(m_input.placeholder as Text).text = t.placeHolder;
m_input.text = t.defaultText;
OnCommit = t.Item1;
(m_input.placeholder as Text).text = t.Item2;
m_input.text = t.Item3;
}
protected override void Update()

View File

@ -22,7 +22,7 @@ namespace AxibugEmuOnline.Client
public static InputUI Input(Action<string> callback, string placeHolder, string defaultText)
{
s_ins.m_InputUI.Show((callback, placeHolder, defaultText));
s_ins.m_InputUI.Show(new ValueTuple<Action<string>, string, string>(callback, placeHolder, defaultText));
return s_ins.m_InputUI;
}

View File

@ -32,7 +32,8 @@ namespace AxibugEmuOnline.Client
{
if (this.RoomID != roomID) return;
if (App.roomMgr.GetRoomListMiniInfo(roomID, out var roomInfo))
Protobuf_Room_MiniInfo roomInfo;
if (App.roomMgr.GetRoomListMiniInfo(roomID, out roomInfo))
UpdateUI(roomInfo);
}
@ -57,13 +58,14 @@ namespace AxibugEmuOnline.Client
}
else
{
if (!App.roomMgr.GetRoomListMiniInfo(RoomID, out Protobuf_Room_MiniInfo MiniInfo))
Protobuf_Room_MiniInfo MiniInfo;
if (!App.roomMgr.GetRoomListMiniInfo(RoomID, out MiniInfo))
{
OverlayManager.PopTip("房间不存在");
return false;
}
if (!MiniInfo.GetFreeSlot(out var freeSlots))
int[] freeSlots;
if (!MiniInfo.GetFreeSlot(out freeSlots))
{
OverlayManager.PopTip("无空闲位置");
return false;
@ -77,7 +79,9 @@ namespace AxibugEmuOnline.Client
private void UpdateUI(Protobuf_Room_MiniInfo roomInfo)
{
var hostNick = roomInfo.GetHostNickName();
roomInfo.GetRoomPlayers(out var cur, out var max);
int cur; int max;
roomInfo.GetRoomPlayers(out cur, out max);
SetBaseInfo("--", $"<b>{hostNick}</b>的房间", $"{cur}/{max}");
SetIcon(null);
@ -129,7 +133,7 @@ namespace AxibugEmuOnline.Client
public void SetDependencyProperty(object data)
{
SetSelectState(data is ThirdMenuRoot tr && tr.SelectIndex == Index);
SetSelectState((data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index));
}
public void Release()

View File

@ -44,7 +44,7 @@ namespace AxibugEmuOnline.Client
m_trackTween.Kill();
m_trackTween = null;
}
m_trackTween = DOTween.To(() => m_rect.position, (value) => m_rect.position = value, itemUIRect.position, 0.125f);
m_trackTween = DOTween.To(() => m_rect.position, (_value) => m_rect.position = _value, itemUIRect.position, 0.125f);
m_trackTween.onComplete = () => m_trackTween = null;
}
}

View File

@ -184,6 +184,10 @@ namespace AxibugEmuOnline.Client
private MenuItem Clone(MenuItem template, Transform parent)
{
#if UNITY_EDITOR
//========================套娃宏========================
#if UNITY_2019_1_OR_NEWER //新版Unity因UNITY2018.2用不了这玩意儿,编辑器也罢
if (Application.isPlaying)
{
var item = GameObject.Instantiate(template.gameObject, parent).GetComponent<MenuItem>();
@ -196,6 +200,15 @@ namespace AxibugEmuOnline.Client
clone.transform.localPosition = Vector3.zero;
return clone.GetComponent<MenuItem>();
}
#else
var item = GameObject.Instantiate(template.gameObject, parent).GetComponent<MenuItem>();
item.transform.localPosition = Vector3.zero;
return item;
#endif
//========================套娃宏 End========================
#else
return GameObject.Instantiate(SubMenuItemTemplate.gameObject, parent).GetComponent<MenuItem>();
#endif

View File

@ -9,7 +9,8 @@ namespace AxibugEmuOnline.Client
private static Dictionary<Graphic, Material> _caches = new Dictionary<Graphic, Material>();
public static Material GetMaterial(this Graphic graphic)
{
if (_caches.TryGetValue(graphic, out var material))
Material material;
if (_caches.TryGetValue(graphic, out material))
{
return material;
}

View File

@ -34,7 +34,10 @@ public class XMBInfoBar : MonoBehaviour
RefreshFps();
}
(uint lastFrame, float lastTime) m_lastFrameInfo;
/// <summary>
/// (uint lastFrame, float lastTime)
/// </summary>
ValueTuple<uint,float> m_lastFrameInfo;
private void RefreshFps()
{
if (App.emu.Core.IsNull())
@ -42,13 +45,17 @@ public class XMBInfoBar : MonoBehaviour
else
{
FPS.gameObject.SetActiveEx(true);
var gap = App.emu.Core.Frame - m_lastFrameInfo.lastFrame;
var time = Time.realtimeSinceStartup - m_lastFrameInfo.lastTime;
//var gap = App.emu.Core.Frame - m_lastFrameInfo.lastFrame;
//var time = Time.realtimeSinceStartup - m_lastFrameInfo.lastTime;
var gap = App.emu.Core.Frame - m_lastFrameInfo.Item1;
var time = Time.realtimeSinceStartup - m_lastFrameInfo.Item2;
var fps = gap / time;
FPS.text = $"FPS:{fps:.#}";
m_lastFrameInfo.lastFrame = App.emu.Core.Frame;
m_lastFrameInfo.lastTime = Time.realtimeSinceStartup;
//m_lastFrameInfo.lastFrame = App.emu.Core.Frame;
//m_lastFrameInfo.lastTime = Time.realtimeSinceStartup;
m_lastFrameInfo.Item1 = App.emu.Core.Frame;
m_lastFrameInfo.Item2 = Time.realtimeSinceStartup;
}
}

View File

@ -36,7 +36,9 @@ namespace AxibugEmuOnline.Client
private static Dictionary<int, RomFile> s_RomFileCahcesInRoomInfo = new Dictionary<int, RomFile>();
public static void FetchRomFileInRoomInfo(this Protobuf_Room_MiniInfo roomInfo, EnumPlatform platform, Action<Protobuf_Room_MiniInfo, RomFile> callback)
{
if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out RomFile romFile))
RomFile romFile;
if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out romFile))
{
callback.Invoke(roomInfo, romFile);
return;
@ -46,11 +48,11 @@ namespace AxibugEmuOnline.Client
case EnumPlatform.NES:
App.StartCoroutine(App.httpAPI.GetNesRomInfo(roomInfo.GameRomID, (romWebData) =>
{
RomFile romFile = new RomFile(EnumPlatform.NES, 0, 0);
romFile.SetWebData(romWebData);
s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = romFile;
RomFile _romFile = new RomFile(EnumPlatform.NES, 0, 0);
_romFile.SetWebData(romWebData);
s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = _romFile;
callback.Invoke(roomInfo, romFile);
callback.Invoke(roomInfo, _romFile);
}));
break;
}