refactor(fix-system): 移除 Gear 齿轮小游戏系统
Made-with: Cursor
This commit is contained in:
@@ -1,22 +0,0 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.SystemEditor
|
||||
{
|
||||
[CustomEditor(typeof(GearSystem))]
|
||||
public class GearSystemEditor : SystemHasDataEditor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var example = (GearSystem)target;
|
||||
|
||||
base.OnInspectorGUI();
|
||||
GUILayout.Label("修改");
|
||||
|
||||
if (GUILayout.Button("添加一个齿轮轴"))
|
||||
{
|
||||
example.AddShaft();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c1170b044a134eb4a82c4ed0f2e42fbd
|
||||
timeCreated: 1732965905
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1154f3a67286c58469e2d89e75b23f39
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,173 +0,0 @@
|
||||
using AibisDream.FixSystem;
|
||||
using AibisDream.Framework;
|
||||
using AibisDream.Utility;
|
||||
using DG.Tweening;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
public class Gear : MonoBehaviour, IInteraction
|
||||
{
|
||||
private const int ShakeAngle = 15;
|
||||
|
||||
public float radius;
|
||||
public Sprite gearSprite;
|
||||
public string gearProp;
|
||||
public bool isBroken;
|
||||
public bool isDisc;
|
||||
public bool isConstant;
|
||||
|
||||
public float speed;
|
||||
private Tweener _rotationTweener;
|
||||
|
||||
#region 引用
|
||||
|
||||
private GearSystem _gearSystem;
|
||||
private CircleCollider2D _circleCollider;
|
||||
private SpriteRenderer _spriteRenderer;
|
||||
private EventTriggerEx _trigger;
|
||||
|
||||
#endregion
|
||||
|
||||
public Shaft targetShaft;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_circleCollider = GetComponent<CircleCollider2D>();
|
||||
_spriteRenderer = GetComponent<SpriteRenderer>();
|
||||
_trigger = GetComponent<EventTriggerEx>();
|
||||
|
||||
_trigger.Register(EventTriggerType.Drag, OnDrag);
|
||||
_trigger.Register(EventTriggerType.PointerDown, StartMove);
|
||||
_trigger.Register(EventTriggerType.PointerUp, StopMove);
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_gearSystem = FixSystemCenter.SystemDic.Get<GearSystem>();
|
||||
// 给齿轮赋值
|
||||
InitGearModel();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置齿轮信息
|
||||
/// </summary>
|
||||
private void InitGearModel()
|
||||
{
|
||||
// 给齿轮赋值
|
||||
_spriteRenderer.sprite = gearSprite;
|
||||
_circleCollider.radius = radius;
|
||||
|
||||
_spriteRenderer.size = new Vector2(radius * 2, radius * 2);
|
||||
}
|
||||
|
||||
public void UpdateRotation(float newSpeed, float speedScale)
|
||||
{
|
||||
// 初始化速度
|
||||
speed = Mathf.Abs(newSpeed);
|
||||
var target = newSpeed >= 0 ? new Vector3(0, 0, 360) : new Vector3(0, 0, -360);
|
||||
|
||||
_rotationTweener?.Kill();
|
||||
// 打开动画
|
||||
if (isBroken)
|
||||
{
|
||||
_rotationTweener = transform.DORotate(new Vector3(0, 0, ShakeAngle), ShakeAngle / speed / 360,
|
||||
RotateMode.LocalAxisAdd)
|
||||
.SetEase(Ease.Linear)
|
||||
.SetLoops(-1, LoopType.Yoyo)
|
||||
.SetDelay(0.1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
_rotationTweener = transform.DORotate(target, 1 / Mathf.Abs(speed), RotateMode.LocalAxisAdd)
|
||||
.SetEase(Ease.Linear)
|
||||
.SetLoops(-1, LoopType.Incremental);
|
||||
}
|
||||
|
||||
_rotationTweener.timeScale = speedScale;
|
||||
}
|
||||
|
||||
public void UpdateSpeedScale(float speedScale)
|
||||
{
|
||||
_rotationTweener.timeScale = speedScale;
|
||||
}
|
||||
|
||||
#region 移动相关
|
||||
|
||||
private void StartMove(BaseEventData eventData)
|
||||
{
|
||||
// 这里是一些阻碍拖动的情况
|
||||
if (!IsActive) return;
|
||||
// 正常情况下不会出错
|
||||
if (eventData is not PointerEventData pointerData) return;
|
||||
transform.position = CameraKit.GetMouseWorldPos(pointerData.position);
|
||||
|
||||
targetShaft?.PlugOutGear();
|
||||
transform.DOPause();
|
||||
}
|
||||
|
||||
private void StopMove(BaseEventData eventData)
|
||||
{
|
||||
// 正常情况下不会出错
|
||||
if (eventData is not PointerEventData) return;
|
||||
|
||||
if (targetShaft)
|
||||
{
|
||||
transform.position = targetShaft.transform.position;
|
||||
targetShaft.PlugInGear(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDrag(BaseEventData eventData)
|
||||
{
|
||||
// 这里是一些阻碍拖动的情况
|
||||
if (!IsActive) return;
|
||||
// 正常情况下不会出错
|
||||
if (eventData is not PointerEventData pointerData) return;
|
||||
|
||||
transform.position = CameraKit.GetMouseWorldPos(pointerData.position);
|
||||
var tempShaft = _gearSystem.CheckClosestShaft(transform.position, radius);
|
||||
if (!tempShaft) return;
|
||||
|
||||
if (_gearSystem.CheckGearSuitable(tempShaft, radius))
|
||||
{
|
||||
targetShaft = tempShaft;
|
||||
}
|
||||
}
|
||||
|
||||
public void Popup()
|
||||
{
|
||||
// 先激活刚体
|
||||
var rb = GetComponent<Rigidbody2D>();
|
||||
rb.bodyType = RigidbodyType2D.Dynamic;
|
||||
rb.mass = 0.5f;
|
||||
rb.gravityScale = 1f;
|
||||
// 施加一个随机方向的力
|
||||
var randomDirection = Random.insideUnitCircle.normalized;
|
||||
rb.AddForce(randomDirection * 3, ForceMode2D.Impulse);
|
||||
// 一段时间后销毁
|
||||
_ = CommonUtil.Delay(2000, () => { Destroy(gameObject); });
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
transform.DOKill();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 交互锁定相关
|
||||
|
||||
public bool IsActive => !isConstant;
|
||||
public bool IsAvailable => _gearSystem.IsGearActive;
|
||||
|
||||
public GameObject GetGameObject()
|
||||
{
|
||||
return gameObject;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c6cc6c2a67bfbc540b276c3c4a144275
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,23 +0,0 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
[Serializable]
|
||||
public class GearModel
|
||||
{
|
||||
public int id;
|
||||
public float radius;
|
||||
public Sprite spriteName;
|
||||
|
||||
/// <summary>
|
||||
/// 读取齿轮图片
|
||||
/// </summary>
|
||||
/// <returns>齿轮Sprite</returns>
|
||||
public Sprite GetSprite()
|
||||
{
|
||||
return spriteName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 119dddf8c44ac744998ce02562a75416
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,403 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using AibisDream.FixSystem;
|
||||
using AibisDream.Framework;
|
||||
using AibisDream.Kit;
|
||||
using Cinemachine;
|
||||
using DG.Tweening;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
public class GearSystem : SystemHasData
|
||||
{
|
||||
#region 索引
|
||||
|
||||
public GameObject gearPrefab;
|
||||
public GameObject shaftPrefab;
|
||||
|
||||
[Header("组件索引")]
|
||||
[SerializeField] private Transform panel;
|
||||
[SerializeField] private SpriteRenderer cover;
|
||||
[SerializeField] private Transform coverStick;
|
||||
[SerializeField] private Transform needle;
|
||||
[SerializeField] private Transform shaftRoot;
|
||||
|
||||
private ShaftGraph _shaftGraph;
|
||||
|
||||
#endregion
|
||||
|
||||
[Header("位置参数")]
|
||||
public Vector3 coverUpPos;
|
||||
public Vector3 coverDownPos;
|
||||
|
||||
public Vector3 panelOpenPos;
|
||||
public Vector3 panelClosePos;
|
||||
|
||||
public Vector3 needleEmptyPos;
|
||||
public Vector3[] needlePosArr;
|
||||
public float needleDuration;
|
||||
public float initSpeed = 1;
|
||||
|
||||
private bool _isTargetReached;
|
||||
private bool _isDiscReady;
|
||||
[HideInInspector] public bool isAvailable;
|
||||
private bool _isInteractive;
|
||||
|
||||
public bool IsGearActive => isAvailable && _isInteractive;
|
||||
|
||||
private IUnRegister[] _evtUnRegisters;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
#region 生命周期管理
|
||||
|
||||
private void Init()
|
||||
{
|
||||
FixSystemCenter.SystemDic.Register(this);
|
||||
|
||||
// 注册相机
|
||||
var virtualCam = transform.Find("Gear Camera").GetComponent<ICinemachineCamera>();
|
||||
CameraKit.Instance.RegisterCamera(CameraEnum.Gear, virtualCam);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
var unRegister1 = EnumEventSystem.Global.Register(InteractionEventEnum.DialogEnd, () => _isInteractive = true);
|
||||
var unRegister2 = EnumEventSystem.Global.Register(InteractionEventEnum.DialogStart, () => _isInteractive = false);
|
||||
_evtUnRegisters = new[] { unRegister1, unRegister2 };
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
foreach (var evtUnRegister in _evtUnRegisters)
|
||||
{
|
||||
evtUnRegister.UnRegister();
|
||||
}
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
InitShaftGraph();
|
||||
LinkEngineSpeed();
|
||||
}
|
||||
|
||||
private void InitShaftGraph()
|
||||
{
|
||||
var shafts = shaftRoot.GetComponentsInChildren<Shaft>();
|
||||
var panelShafts = panel.GetComponentsInChildren<Shaft>();
|
||||
_shaftGraph = new ShaftGraph(shafts, panelShafts);
|
||||
}
|
||||
|
||||
private void LinkEngineSpeed()
|
||||
{
|
||||
var engine = FixSystemCenter.SystemDic.Get<EngineSystem>();
|
||||
_shaftGraph.StartRotate(initSpeed);
|
||||
engine.updateSpeedEvent.AddListener(_shaftGraph.Accelerate);
|
||||
}
|
||||
|
||||
private void UnlinkEngineSpeed()
|
||||
{
|
||||
var engine = FixSystemCenter.SystemDic.Get<EngineSystem>();
|
||||
_shaftGraph.StartRotate(initSpeed);
|
||||
engine.updateSpeedEvent.RemoveListener(_shaftGraph.Accelerate);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
CameraKit.Instance.UnRegisterCamera(CameraEnum.Gear);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 判断吸附位置
|
||||
/// </summary>
|
||||
/// <param name="pos">齿轮当前位置</param>
|
||||
/// <param name="gearRadius">齿轮半径</param>
|
||||
/// <returns>能够被吸附的轴</returns>
|
||||
public Shaft CheckClosestShaft(Vector3 pos, float gearRadius)
|
||||
{
|
||||
return _shaftGraph.QuerySnapShaft(pos, gearRadius);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断齿轮能不能放进轴内
|
||||
/// </summary>
|
||||
/// <param name="sourceShaft">当前轴</param>
|
||||
/// <param name="gearRadius">齿轮半径</param>
|
||||
/// <returns>是否可用</returns>
|
||||
public bool CheckGearSuitable(Shaft sourceShaft, float gearRadius)
|
||||
{
|
||||
return _shaftGraph.CheckGearSuitable(sourceShaft, gearRadius);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 某个轴上齿轮发生变化时更新临接关系
|
||||
/// </summary>
|
||||
/// <param name="shaftId">轴ID</param>
|
||||
public void ChangeGraphVertex(int shaftId)
|
||||
{
|
||||
_shaftGraph?.ChangeVertex(shaftId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按轴名称弹出齿轮
|
||||
/// </summary>
|
||||
/// <param name="shaftName">轴名称</param>
|
||||
/// <returns></returns>
|
||||
public void PopupGearByShaftName(string shaftName)
|
||||
{
|
||||
var shafts = shaftRoot.GetComponentsInChildren<Shaft>();
|
||||
var target = Array.Find(shafts, shaft => shaft.gameObject.name == shaftName);
|
||||
target.PopupGear();
|
||||
}
|
||||
|
||||
#region 胜利状况判断
|
||||
|
||||
public bool IsShaftInBox(Transform shaft)
|
||||
{
|
||||
return shaftRoot == shaft.parent;
|
||||
}
|
||||
|
||||
public void CheckGearSystemState()
|
||||
{
|
||||
Debug.Log("Check Gear");
|
||||
if (_shaftGraph.AllRunning())
|
||||
{
|
||||
if (_shaftGraph.AllNewGear())
|
||||
{
|
||||
StorageSystem.Instance?.SetValue("$allNewGear", true);
|
||||
}
|
||||
|
||||
DialogController.Instance?.StartDialogNode("AllGearsRunning");
|
||||
}
|
||||
}
|
||||
|
||||
public void ReachTargetSpeed()
|
||||
{
|
||||
if (!_isTargetReached)
|
||||
{
|
||||
StorageSystem.Instance?.SetValue("$speedReached", true);
|
||||
_isTargetReached = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetTargetState()
|
||||
{
|
||||
if (_isTargetReached)
|
||||
{
|
||||
StorageSystem.Instance?.SetValue("$speedReached", false);
|
||||
_isTargetReached = false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public IEnumerator OpenCover()
|
||||
{
|
||||
// 旋转拉杆
|
||||
yield return coverStick.DORotate(new Vector3(0, 0, -90), 1.5f).WaitForCompletion();
|
||||
// 开盖
|
||||
var sq = DOTween.Sequence();
|
||||
sq.Join(cover.transform.DOLocalMove(coverUpPos, 1.5f));
|
||||
sq.Join(cover.DOFade(0, 1.5f));
|
||||
yield return sq.WaitForCompletion();
|
||||
isAvailable = true;
|
||||
}
|
||||
|
||||
public IEnumerator CloseCover()
|
||||
{
|
||||
isAvailable = false;
|
||||
// 关盖
|
||||
var sq = DOTween.Sequence();
|
||||
sq.Join(cover.transform.DOLocalMove(coverDownPos, 1.5f));
|
||||
sq.Join(cover.DOFade(1, 1.5f));
|
||||
yield return sq.WaitForCompletion();
|
||||
// 旋转拉杆
|
||||
yield return coverStick.DORotate(new Vector3(0, 0, 0), 1.5f).WaitForCompletion();
|
||||
}
|
||||
|
||||
public IEnumerator OpenGearPanel()
|
||||
{
|
||||
panel.gameObject.SetActive(true);
|
||||
yield return panel.DOLocalMove(panelOpenPos, 1f).WaitForCompletion();
|
||||
}
|
||||
|
||||
public IEnumerator CloseGearPanel()
|
||||
{
|
||||
yield return panel.DOLocalMove(panelClosePos, 1f).WaitForCompletion();
|
||||
panel.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public IEnumerator MoveNeedle(int discIdx)
|
||||
{
|
||||
Vector3 target;
|
||||
if (discIdx > needlePosArr.Length || discIdx <= 0)
|
||||
{
|
||||
target = needleEmptyPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
target = needlePosArr[discIdx - 1];
|
||||
}
|
||||
|
||||
yield return needle.DORotate(target, needleDuration).WaitForCompletion();
|
||||
}
|
||||
|
||||
#region 数据保存与加载
|
||||
|
||||
private static readonly string DataPath = Application.streamingAssetsPath + "/LevelData/GearSystem/";
|
||||
private string[] _keyOptions;
|
||||
public override string CurDataKey { get; set; }
|
||||
|
||||
public override string GetConfigPath()
|
||||
{
|
||||
return DataPath;
|
||||
}
|
||||
|
||||
public override void LoadLevel()
|
||||
{
|
||||
if (string.IsNullOrEmpty(CurDataKey))
|
||||
{
|
||||
Debug.Log("配置项名称为空");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ConfigUtil.Instance.TryLoadConfig<GearSystemData>(DataPath + CurDataKey, out var data))
|
||||
{
|
||||
Debug.Log("没有找到配置项");
|
||||
return;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
// 现将当前配置保存为temp避免丢失
|
||||
if (CurDataKey != "temp.json")
|
||||
{
|
||||
SaveByKey("temp.json");
|
||||
}
|
||||
#endif
|
||||
|
||||
LoadByData(data);
|
||||
}
|
||||
|
||||
private void LoadByData(GearSystemData gearSystemData)
|
||||
{
|
||||
// 先清除
|
||||
var shaftsObj = GetComponentsInChildren<Shaft>(true);
|
||||
foreach (var oldShaft in shaftsObj)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (!EditorApplication.isPlaying)
|
||||
{
|
||||
DestroyImmediate(oldShaft.gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(oldShaft.gameObject);
|
||||
}
|
||||
#else
|
||||
Destroy(oldShaft.gameObject);
|
||||
#endif
|
||||
}
|
||||
|
||||
// 再添加
|
||||
var shafts = new Shaft[gearSystemData.shaftLevelDataArray.Length];
|
||||
for (int i = 0; i < gearSystemData.shaftLevelDataArray.Length; i++)
|
||||
{
|
||||
var newShaft = Instantiate(shaftPrefab, shaftRoot).GetComponent<Shaft>();
|
||||
newShaft.Load(gearSystemData.shaftLevelDataArray[i]);
|
||||
shafts[i] = newShaft;
|
||||
}
|
||||
|
||||
var panelShafts = new Shaft[gearSystemData.panelShaftArray.Length];
|
||||
for (int i = 0; i < gearSystemData.panelShaftArray.Length; i++)
|
||||
{
|
||||
var newShaft = Instantiate(shaftPrefab, panel, true).GetComponent<Shaft>();
|
||||
newShaft.Load(gearSystemData.panelShaftArray[i]);
|
||||
panelShafts[i] = newShaft;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (!EditorApplication.isPlaying) return;
|
||||
#endif
|
||||
UnlinkEngineSpeed();
|
||||
_shaftGraph = new ShaftGraph(shafts, panelShafts);
|
||||
LinkEngineSpeed();
|
||||
}
|
||||
|
||||
public override void SaveLevel()
|
||||
{
|
||||
if (string.IsNullOrEmpty(CurDataKey)) return;
|
||||
|
||||
SaveByKey(CurDataKey);
|
||||
}
|
||||
|
||||
private void SaveByKey(string key)
|
||||
{
|
||||
var shaftDataArray = shaftRoot
|
||||
.GetComponentsInChildren<Shaft>()
|
||||
.Select(shaft => shaft.Save())
|
||||
.ToArray();
|
||||
var panelShaftArray = panel
|
||||
.GetComponentsInChildren<Shaft>()
|
||||
.Select(shaft => shaft.Save())
|
||||
.ToArray();
|
||||
|
||||
var data = new GearSystemData
|
||||
{
|
||||
shaftLevelDataArray = shaftDataArray,
|
||||
panelShaftArray = panelShaftArray
|
||||
};
|
||||
|
||||
ConfigUtil.Instance.SaveConfig(data, DataPath + key);
|
||||
}
|
||||
|
||||
public void AddShaft()
|
||||
{
|
||||
Instantiate(shaftPrefab, shaftRoot);
|
||||
}
|
||||
|
||||
public void LoadPanelShaft(string dataKey)
|
||||
{
|
||||
// 查询
|
||||
if (!ConfigUtil.Instance.TryLoadConfig<GearSystemData>(DataPath + dataKey, out var data))
|
||||
{
|
||||
Debug.Log("没有找到配置项");
|
||||
return;
|
||||
}
|
||||
|
||||
// 删除面板上的齿轮
|
||||
var panelShafts = panel.GetComponentsInChildren<Shaft>();
|
||||
foreach (var shaftItem in panelShafts)
|
||||
{
|
||||
Destroy(shaftItem);
|
||||
}
|
||||
|
||||
// 读取数据
|
||||
var newPanelShafts = new Shaft[data.panelShaftArray.Length];
|
||||
for (int i = 0; i < data.panelShaftArray.Length; i++)
|
||||
{
|
||||
var newShaft = Instantiate(shaftPrefab, panel, true).GetComponent<Shaft>();
|
||||
newShaft.Load(data.panelShaftArray[i]);
|
||||
newPanelShafts[i] = newShaft;
|
||||
}
|
||||
|
||||
_shaftGraph.UpdatePanel(newPanelShafts);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public struct GearSystemData
|
||||
{
|
||||
public ShaftLevelData[] shaftLevelDataArray;
|
||||
public ShaftLevelData[] panelShaftArray;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5489eacced0c49c4ab26308cd50fb917
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,53 +0,0 @@
|
||||
using System.Collections;
|
||||
using AibisDream.FixSystem;
|
||||
using Yarn.Unity;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
public static class GearYarnCommand
|
||||
{
|
||||
private static GearSystem GearSystem => FixSystemCenter.SystemDic.Get<GearSystem>();
|
||||
|
||||
[YarnCommand("move_needle")]
|
||||
public static IEnumerator MoveNeedle(int discIdx)
|
||||
{
|
||||
return FixSystemCenter.SystemDic.Get<GearSystem>().MoveNeedle(discIdx);
|
||||
}
|
||||
|
||||
[YarnCommand("open_gear_panel")]
|
||||
public static IEnumerator OpenGearPanel()
|
||||
{
|
||||
return FixSystemCenter.SystemDic.Get<GearSystem>().OpenGearPanel();
|
||||
}
|
||||
|
||||
[YarnCommand("close_gear_panel")]
|
||||
public static IEnumerator CloseGearPanel()
|
||||
{
|
||||
return FixSystemCenter.SystemDic.Get<GearSystem>().CloseGearPanel();
|
||||
}
|
||||
|
||||
[YarnCommand("close_gear_cover")]
|
||||
public static IEnumerator CloseCover()
|
||||
{
|
||||
return FixSystemCenter.SystemDic.Get<GearSystem>().CloseCover();
|
||||
}
|
||||
|
||||
[YarnCommand("open_gear_cover")]
|
||||
public static IEnumerator OpenCover()
|
||||
{
|
||||
return FixSystemCenter.SystemDic.Get<GearSystem>().OpenCover();
|
||||
}
|
||||
|
||||
[YarnCommand("popup_gear")]
|
||||
public static void PopupGearByName(string shaftName)
|
||||
{
|
||||
GearSystem.PopupGearByShaftName(shaftName);
|
||||
}
|
||||
|
||||
[YarnCommand("load_gear_panel")]
|
||||
public static void LoadPanelShaft(string configKey)
|
||||
{
|
||||
GearSystem.LoadPanelShaft(configKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 73b9ebccdc5e4c12be4c93d3e0a71e52
|
||||
timeCreated: 1735397288
|
||||
@@ -1,343 +0,0 @@
|
||||
using System;
|
||||
using AibisDream.FixSystem;
|
||||
using AibisDream.Framework;
|
||||
using DG.Tweening;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
public class Shaft : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private int id;
|
||||
|
||||
[SerializeField] public ShaftType shaftType;
|
||||
|
||||
// 初始齿轮
|
||||
[SerializeField] private bool hasGear;
|
||||
[SerializeField] private string gearProp;
|
||||
[SerializeField] private bool isInitGearBroken;
|
||||
[SerializeField] private bool isInitGearDisc;
|
||||
[SerializeField] private float initRadius;
|
||||
[SerializeField] private Sprite initSprite;
|
||||
[SerializeField] private int discIdx;
|
||||
|
||||
[SerializeField] public Gear childGear;
|
||||
|
||||
// 目标角速度
|
||||
[SerializeField] private float targetSpeed;
|
||||
|
||||
// 当前角速度
|
||||
public float speed;
|
||||
private float _speedScale = 1;
|
||||
|
||||
public bool IsBroken => childGear != null && childGear.isBroken;
|
||||
public bool IsDisc => childGear != null && childGear.isDisc;
|
||||
|
||||
/// <summary>
|
||||
/// 当前齿轮半径
|
||||
/// </summary>
|
||||
public float GearRadius
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!childGear)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return childGear.radius;
|
||||
}
|
||||
}
|
||||
|
||||
private GearSystem GearSystem => FixSystemCenter.SystemDic.Get<GearSystem>();
|
||||
|
||||
/// <summary>
|
||||
/// 初始化当前轴位置
|
||||
/// </summary>
|
||||
public void InitShaft()
|
||||
{
|
||||
// 如果不带齿轮
|
||||
if (!hasGear) return;
|
||||
|
||||
// 如果带齿轮,要根据齿轮类型生成
|
||||
childGear = InitGear(initRadius, initSprite, isInitGearBroken, isInitGearDisc);
|
||||
|
||||
childGear.UpdateRotation(speed, _speedScale);
|
||||
}
|
||||
|
||||
private Gear InitGear(float radius, Sprite sprite, bool isBroken = false, bool isDisc = false)
|
||||
{
|
||||
var gear = Instantiate(GearSystem.gearPrefab, transform).GetComponent<Gear>();
|
||||
gear.radius = radius;
|
||||
gear.gearSprite = sprite;
|
||||
gear.gearProp = gearProp;
|
||||
gear.isBroken = isBroken;
|
||||
gear.targetShaft = this;
|
||||
gear.isDisc = isDisc;
|
||||
gear.isConstant = shaftType != ShaftType.Pluggable; // TODO 驱动齿轮和目标齿轮暂时也不给动
|
||||
return gear;
|
||||
}
|
||||
|
||||
public void PlugInGear(Gear gear)
|
||||
{
|
||||
childGear = gear;
|
||||
gear.transform.parent = transform;
|
||||
GearSystem.ChangeGraphVertex(GetInstanceID());
|
||||
|
||||
// 面板里的齿轮才能触发
|
||||
if (GearSystem.IsShaftInBox(transform))
|
||||
{
|
||||
OnGearPlugIn();
|
||||
GearSystem.CheckGearSystemState();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGearPlugIn()
|
||||
{
|
||||
// 破损齿轮插进来就发一次事件,交给yarn处理
|
||||
if (IsBroken)
|
||||
{
|
||||
DialogController.Instance?.StartDialogNode("破损齿轮插入");
|
||||
}
|
||||
|
||||
if (IsDisc)
|
||||
{
|
||||
StorageSystem.Instance?.SetValue("$discIdx", discIdx);
|
||||
}
|
||||
|
||||
// 传当前插入齿轮的Prop
|
||||
StorageSystem.Instance?.SetValue("$curGearProp", childGear.gearProp);
|
||||
}
|
||||
|
||||
public void PlugOutGear()
|
||||
{
|
||||
// 拔出时齿轮停转
|
||||
childGear.UpdateRotation(0, _speedScale);
|
||||
|
||||
childGear.transform.parent = null;
|
||||
childGear = null;
|
||||
GearSystem.ChangeGraphVertex(GetInstanceID());
|
||||
}
|
||||
|
||||
public void ChangeRotateState()
|
||||
{
|
||||
UpdateSpeedAnima();
|
||||
CheckGameState();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 速度修改后改变动画(可能改变方向)
|
||||
/// </summary>
|
||||
private void UpdateSpeedAnima()
|
||||
{
|
||||
// 没有齿轮的不需要旋转
|
||||
if (!HasChildGear())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
childGear.UpdateRotation(speed, _speedScale);
|
||||
}
|
||||
|
||||
public void UpdateSpeedScale(float newSpeedScale)
|
||||
{
|
||||
_speedScale = newSpeedScale;
|
||||
if (!HasChildGear()) return;
|
||||
childGear.UpdateSpeedScale(_speedScale);
|
||||
CheckGameState();
|
||||
}
|
||||
|
||||
private void CheckGameState()
|
||||
{
|
||||
// 只有目标轴判断
|
||||
if (shaftType != ShaftType.Target) return;
|
||||
|
||||
if (targetSpeed <= Mathf.Abs(speed * _speedScale))
|
||||
{
|
||||
GearSystem.ReachTargetSpeed();
|
||||
}
|
||||
else
|
||||
{
|
||||
GearSystem.ResetTargetState();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是否带齿轮
|
||||
/// </summary>
|
||||
/// <returns>是否带齿轮</returns>
|
||||
public bool HasChildGear()
|
||||
{
|
||||
return childGear;
|
||||
}
|
||||
|
||||
public void PopupGear()
|
||||
{
|
||||
// Constant无法弹出
|
||||
// if (shaftType != ShaftType.Pluggable) return;
|
||||
// 没有齿轮无法弹出
|
||||
if (!childGear) return;
|
||||
|
||||
// 播放齿轮移除动画并更新速度
|
||||
var gear = childGear;
|
||||
|
||||
PlugOutGear();
|
||||
|
||||
gear.Popup();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断两个轴是否齿轮相接
|
||||
/// </summary>
|
||||
/// <param name="shaft1">轴1</param>
|
||||
/// <param name="shaft2">轴2</param>
|
||||
/// <returns>是否相接</returns>
|
||||
public static bool IsShaftConnected(Shaft shaft1, Shaft shaft2)
|
||||
{
|
||||
// 如果轴上无齿轮就不计算
|
||||
if (!shaft1 || !shaft2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!shaft1.HasChildGear() || !shaft2.HasChildGear())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// 如果两个都有齿轮,就判断是否相邻
|
||||
float distance = (shaft1.transform.position - shaft2.transform.position).magnitude;
|
||||
float radiusSum = shaft1.GearRadius + shaft2.GearRadius;
|
||||
|
||||
return distance < radiusSum;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取可以安装齿轮的最大尺寸
|
||||
/// </summary>
|
||||
/// <param name="sourcePos">源位置</param>
|
||||
/// <param name="shaft">目标轴</param>
|
||||
/// <returns>可用距离</returns>
|
||||
public static float CalcShaftAvailableDis(Vector3 sourcePos, Shaft shaft)
|
||||
{
|
||||
if (!shaft.HasChildGear())
|
||||
{
|
||||
return (sourcePos - shaft.transform.position).magnitude;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (sourcePos - shaft.transform.position).magnitude - shaft.GearRadius;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 求两个轴角速度之比
|
||||
/// </summary>
|
||||
/// <param name="shaft1">轴1</param>
|
||||
/// <param name="shaft2">轴2</param>
|
||||
/// <returns>角速度之比</returns>
|
||||
public static float CalcAngularVelocityRatio(Shaft shaft1, Shaft shaft2)
|
||||
{
|
||||
return shaft1.GearRadius / shaft2.GearRadius;
|
||||
}
|
||||
|
||||
public void OnDestroy()
|
||||
{
|
||||
if (childGear != null)
|
||||
{
|
||||
childGear.transform.DOKill();
|
||||
}
|
||||
Destroy(childGear);
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
public void OnDrawGizmos()
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawWireSphere(transform.position, initRadius);
|
||||
}
|
||||
|
||||
#region 保存与加载
|
||||
|
||||
public void Load(ShaftLevelData levelData)
|
||||
{
|
||||
// 加载数据
|
||||
gameObject.name = levelData.shaftName;
|
||||
transform.localPosition = levelData.ShaftPos;
|
||||
initSprite = levelData.GearPic;
|
||||
|
||||
shaftType = levelData.shaftType;
|
||||
hasGear = levelData.hasChildGear;
|
||||
gearProp = levelData.gearProp;
|
||||
isInitGearBroken = levelData.isGearBroken;
|
||||
isInitGearDisc = levelData.isDisc;
|
||||
discIdx = levelData.discIdx;
|
||||
targetSpeed = levelData.targetSpeed;
|
||||
initRadius = levelData.radius;
|
||||
}
|
||||
|
||||
public ShaftLevelData Save()
|
||||
{
|
||||
return new ShaftLevelData
|
||||
{
|
||||
shaftName = gameObject.name,
|
||||
ShaftPos = transform.localPosition,
|
||||
GearPic = initSprite,
|
||||
shaftType = shaftType,
|
||||
hasChildGear = hasGear,
|
||||
gearProp = gearProp,
|
||||
isGearBroken = isInitGearBroken,
|
||||
isDisc = isInitGearDisc,
|
||||
discIdx = discIdx,
|
||||
targetSpeed = targetSpeed,
|
||||
radius = initRadius
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
public enum ShaftType
|
||||
{
|
||||
Driver, // 拥有初始速度,没有目标速度,全局仅有一个
|
||||
Target, // 没有初始速度,有目标速度,全局有多个
|
||||
Pluggable, // 没有初始速度,没有目标速度,可拔插
|
||||
Constant // 固定齿轮不可插拔
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public struct ShaftLevelData
|
||||
{
|
||||
public string shaftName;
|
||||
|
||||
// 关卡数据
|
||||
public ShaftType shaftType;
|
||||
public float targetSpeed;
|
||||
public bool hasChildGear;
|
||||
public float radius;
|
||||
public string gearProp;
|
||||
public bool isGearBroken;
|
||||
public bool isDisc;
|
||||
public int discIdx;
|
||||
|
||||
// 外形数据
|
||||
public SerializableVector3 shaftPos;
|
||||
public string gearPicPath;
|
||||
|
||||
// 类型转换
|
||||
[JsonIgnore]
|
||||
public Sprite GearPic
|
||||
{
|
||||
get => !string.IsNullOrEmpty(gearPicPath) ? ResourceKit.LoadSpriteFromPsd(gearPicPath) : null;
|
||||
set => gearPicPath = ResourceKit.SaveSprite(value);
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public Vector3 ShaftPos
|
||||
{
|
||||
get => shaftPos.ToVector3();
|
||||
set => shaftPos = new SerializableVector3(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 468fc3bf68cb91149818f305858bc7fd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,318 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
public class ShaftGraph
|
||||
{
|
||||
// 顶点数量
|
||||
private readonly int _vertexSize;
|
||||
|
||||
// 顶点Map
|
||||
private readonly Shaft[] _vertexArray;
|
||||
|
||||
private Shaft[] _panelShafts;
|
||||
|
||||
// 邻接表
|
||||
private float[,] _edgeTable;
|
||||
|
||||
// 遍历记录
|
||||
private readonly bool[] _vertexRecordArray;
|
||||
|
||||
// 动力轴序号
|
||||
private readonly int _rootIdx;
|
||||
|
||||
public ShaftGraph(Shaft[] shafts, Shaft[] panelShafts)
|
||||
{
|
||||
// 为轴赋值
|
||||
_vertexSize = shafts.Length;
|
||||
_vertexRecordArray = new bool[_vertexSize];
|
||||
_vertexArray = shafts;
|
||||
_panelShafts = panelShafts;
|
||||
foreach (var shaft in _vertexArray)
|
||||
{
|
||||
shaft.InitShaft();
|
||||
}
|
||||
|
||||
foreach (var shaft in _panelShafts)
|
||||
{
|
||||
shaft.InitShaft();
|
||||
}
|
||||
|
||||
// 寻找唯一的驱动轴序号
|
||||
_rootIdx = FindDriverIdx();
|
||||
|
||||
// 生成边邻接表
|
||||
GeneEdgeTable();
|
||||
|
||||
UpdateSpeed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新轴
|
||||
/// </summary>
|
||||
/// <param name="panelShafts"></param>
|
||||
public void UpdatePanel(Shaft[] panelShafts)
|
||||
{
|
||||
_panelShafts = panelShafts;
|
||||
Array.ForEach(panelShafts, shaft => shaft.InitShaft());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否所有齿轮都在运行
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool AllRunning()
|
||||
{
|
||||
return _vertexArray.All(shaft => Mathf.Abs(shaft.speed) > 0.01f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否所有齿轮都是新的
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool AllNewGear()
|
||||
{
|
||||
return _vertexArray.Where(shaft => shaft.shaftType != ShaftType.Driver).All(shaft =>
|
||||
shaft.childGear != null && shaft.childGear.gearProp == "NewGear");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化速度
|
||||
/// </summary>
|
||||
/// <param name="initSpeed">初始速度</param>
|
||||
public void StartRotate(float initSpeed)
|
||||
{
|
||||
_vertexArray[_rootIdx].speed = initSpeed;
|
||||
UpdateSpeed();
|
||||
}
|
||||
|
||||
public void Accelerate(float originSpeed, float speed)
|
||||
{
|
||||
foreach (var shaft in _vertexArray)
|
||||
{
|
||||
if (shaft.HasChildGear()) shaft.UpdateSpeedScale(speed);
|
||||
}
|
||||
}
|
||||
|
||||
private int FindDriverIdx()
|
||||
{
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
if (_vertexArray[i].shaftType == ShaftType.Driver)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成边邻接表
|
||||
/// </summary>
|
||||
private void GeneEdgeTable()
|
||||
{
|
||||
_edgeTable = new float[_vertexSize, _vertexSize];
|
||||
|
||||
for (int i = 0; i < _vertexSize - 1; i++)
|
||||
{
|
||||
for (int j = i + 1; j < _vertexSize; j++)
|
||||
{
|
||||
// 判断两个Shaft是否临接
|
||||
if (Shaft.IsShaftConnected(_vertexArray[i], _vertexArray[j]))
|
||||
{
|
||||
_edgeTable[i, j] = Shaft.CalcAngularVelocityRatio(_vertexArray[i], _vertexArray[j]);
|
||||
_edgeTable[j, i] = Shaft.CalcAngularVelocityRatio(_vertexArray[j], _vertexArray[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
_edgeTable[i, j] = 0;
|
||||
_edgeTable[j, i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 某个轴上齿轮发生变化时更新临接关系
|
||||
/// </summary>
|
||||
/// <param name="instanceID">轴ID</param>
|
||||
public void ChangeVertex(int instanceID)
|
||||
{
|
||||
// 找到对应idx
|
||||
int idx = TranInstanceIDToIdx(instanceID);
|
||||
if (idx == -1) return;
|
||||
|
||||
// 更新该节点对应的邻接表
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
// 遇到自身跳过
|
||||
if (i == idx)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 判断两个Shaft是否临接
|
||||
if (Shaft.IsShaftConnected(_vertexArray[idx], _vertexArray[i]))
|
||||
{
|
||||
_edgeTable[idx, i] = Shaft.CalcAngularVelocityRatio(_vertexArray[idx], _vertexArray[i]);
|
||||
_edgeTable[i, idx] = Shaft.CalcAngularVelocityRatio(_vertexArray[i], _vertexArray[idx]);
|
||||
}
|
||||
else
|
||||
{
|
||||
_edgeTable[idx, i] = 0;
|
||||
_edgeTable[i, idx] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
UpdateSpeed();
|
||||
}
|
||||
|
||||
private int TranInstanceIDToIdx(int instanceID)
|
||||
{
|
||||
// 查找对应的序号
|
||||
int idx = -1;
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
if (instanceID == _vertexArray[i].GetInstanceID())
|
||||
{
|
||||
idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新当前所有轴的速度
|
||||
/// </summary>
|
||||
private void UpdateSpeed()
|
||||
{
|
||||
// 清除遍历记录
|
||||
Array.Clear(_vertexRecordArray, 0, _vertexSize);
|
||||
// 从驱动轴开始计算速度
|
||||
_vertexRecordArray[_rootIdx] = true;
|
||||
UpdateShaftSpeedByIdx(_rootIdx);
|
||||
UpdateUnreachableShafts();
|
||||
|
||||
// 更新完速度后统一更新动画
|
||||
foreach (var shaft in _vertexArray)
|
||||
{
|
||||
shaft.ChangeRotateState();
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateShaftSpeedByIdx(int idx)
|
||||
{
|
||||
// 已知当前齿轮速度
|
||||
float currentSpeed = _vertexArray[idx].speed;
|
||||
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
// 遍历临接齿轮
|
||||
if (i != idx && _edgeTable[idx, i] > 0)
|
||||
{
|
||||
// 已遍历过就跳过
|
||||
if (_vertexRecordArray[i])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 更新速度
|
||||
_vertexArray[i].speed = -currentSpeed * _edgeTable[idx, i];
|
||||
|
||||
// 已遍历的轴加上标记
|
||||
_vertexRecordArray[i] = true;
|
||||
// 如果当前齿轮未破碎,继续更新相邻齿轮
|
||||
if (!_vertexArray[i].IsBroken)
|
||||
{
|
||||
UpdateShaftSpeedByIdx(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateUnreachableShafts()
|
||||
{
|
||||
// 从Driver开始相连的齿轮全部更新后,剩下的齿轮置空
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
if (!_vertexRecordArray[i])
|
||||
{
|
||||
_vertexArray[i].speed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询可吸附的轴
|
||||
/// </summary>
|
||||
/// <param name="pos">齿轮位置</param>
|
||||
/// <param name="gearRadius">齿轮半径</param>
|
||||
/// <returns>吸附轴</returns>
|
||||
public Shaft QuerySnapShaft(Vector3 pos, float gearRadius)
|
||||
{
|
||||
if (_vertexArray == null || _vertexArray.Length == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// 查询距离最近的,可吸附的Shaft
|
||||
Shaft closestShaft = null;
|
||||
float minDistance = -1;
|
||||
|
||||
var totalArray = _vertexArray.Concat(_panelShafts);
|
||||
foreach (var vertex in totalArray)
|
||||
{
|
||||
if (!vertex.HasChildGear())
|
||||
{
|
||||
float tempDis = Vector3.Distance(vertex.transform.position, pos);
|
||||
if (minDistance < 0 || tempDis < minDistance)
|
||||
{
|
||||
closestShaft = vertex;
|
||||
minDistance = tempDis;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 没查到就返回空
|
||||
if (!closestShaft)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// 查到了就返回是否吸附
|
||||
return minDistance < gearRadius ? closestShaft : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断齿轮能不能放进轴内
|
||||
/// </summary>
|
||||
/// <param name="sourceShaft">当前轴</param>
|
||||
/// <param name="gearRadius">齿轮半径</param>
|
||||
/// <returns>是否可用</returns>
|
||||
public bool CheckGearSuitable(Shaft sourceShaft, float gearRadius)
|
||||
{
|
||||
// 获取目标idx
|
||||
int idx = TranInstanceIDToIdx(sourceShaft.GetInstanceID());
|
||||
|
||||
bool isShaftAvailable = true;
|
||||
// 寻找所有临接轴
|
||||
for (int i = 0; i < _vertexSize; i++)
|
||||
{
|
||||
if (i == idx) continue; // 不需要计算和自身的关系
|
||||
float availableDis = Shaft.CalcShaftAvailableDis(sourceShaft.transform.position, _vertexArray[i]);
|
||||
if (availableDis < gearRadius - 0.2f)
|
||||
{
|
||||
isShaftAvailable = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return isShaftAvailable;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 632dbae5476a3b34694e3ae0934c82fb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e9aeeab7039af7b43987667800d98723
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,125 +0,0 @@
|
||||
{
|
||||
"shaftLevelDataArray": [
|
||||
{
|
||||
"shaftName": "Pluggable Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": 1.64,
|
||||
"y": 0.12,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/唱片齿轮"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -2.71,
|
||||
"y": -0.72,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.44,
|
||||
"y": -1.95,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Driver Shaft",
|
||||
"shaftType": 0,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -1.46,
|
||||
"y": 1.57,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮A"
|
||||
}
|
||||
],
|
||||
"panelShaftArray": [
|
||||
{
|
||||
"shaftName": "Panel Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.015,
|
||||
"y": 2.63,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.007,
|
||||
"y": -0.39,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.007,
|
||||
"y": -3.04,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/唱片齿轮"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e081524d86aeb75458b61dd0ae76051a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,125 +0,0 @@
|
||||
{
|
||||
"shaftLevelDataArray": [
|
||||
{
|
||||
"shaftName": "Pluggable Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": 1.64,
|
||||
"y": 0.12,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/唱片齿轮"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -2.71,
|
||||
"y": -0.72,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.44,
|
||||
"y": -1.95,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Driver Shaft",
|
||||
"shaftType": 0,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -1.46,
|
||||
"y": 1.57,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮A"
|
||||
}
|
||||
],
|
||||
"panelShaftArray": [
|
||||
{
|
||||
"shaftName": "Panel Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": false,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.015,
|
||||
"y": 2.63,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": false,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.007,
|
||||
"y": -0.39,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": false,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.007,
|
||||
"y": -3.04,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/唱片齿轮"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36bdc4de73170b14aae371506f5a406a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,142 +0,0 @@
|
||||
{
|
||||
"shaftLevelDataArray": [
|
||||
{
|
||||
"shaftName": "Pluggable Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": 1.64,
|
||||
"y": 0.12,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/唱片齿轮"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -2.71,
|
||||
"y": -0.72,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.44,
|
||||
"y": -1.95,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Driver Shaft",
|
||||
"shaftType": 0,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -1.46,
|
||||
"y": 1.57,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/普通齿轮A"
|
||||
}
|
||||
],
|
||||
"panelShaftArray": [
|
||||
{
|
||||
"shaftName": "Panel Shaft1",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "NewGear",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.001,
|
||||
"y": 3.18,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/刻录齿轮"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft2",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "NewGear",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.006,
|
||||
"y": 1.18,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft3",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "NewGear",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.002,
|
||||
"y": -1.12,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Panel Shaft4",
|
||||
"shaftType": 2,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": false,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.006,
|
||||
"y": -3.6,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮B"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 71d9408746a90254e8141e2af220c4cd
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"shaftLevelDataArray": [
|
||||
{
|
||||
"shaftName": "Pluggable Shaft3",
|
||||
"shaftType": 3,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.34,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": true,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": 1.64,
|
||||
"y": 0.12,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/刻录齿轮"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft2",
|
||||
"shaftType": 3,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.02,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -2.71,
|
||||
"y": -0.72,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮B"
|
||||
},
|
||||
{
|
||||
"shaftName": "Pluggable Shaft1",
|
||||
"shaftType": 3,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -0.44,
|
||||
"y": -1.95,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮C"
|
||||
},
|
||||
{
|
||||
"shaftName": "Driver Shaft",
|
||||
"shaftType": 0,
|
||||
"targetSpeed": 0.0,
|
||||
"hasChildGear": true,
|
||||
"radius": 1.7,
|
||||
"gearProp": "",
|
||||
"isGearBroken": false,
|
||||
"isDisc": false,
|
||||
"discIdx": 0,
|
||||
"shaftPos": {
|
||||
"x": -1.46,
|
||||
"y": 1.57,
|
||||
"z": 0.0
|
||||
},
|
||||
"gearPicPath": "Art/Fix/变速箱齿轮/镍铬齿轮A"
|
||||
}
|
||||
],
|
||||
"panelShaftArray": []
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c21db38b4480c6b45a41503bd5f078e4
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1 +0,0 @@
|
||||
{"shaftLevelDataArray":[{"shaftName":"Pluggable Shaft3","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.34,"gearProp":"","isGearBroken":false,"isDisc":true,"discIdx":0,"shaftPos":{"x":1.64,"y":0.12,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/唱片齿轮"},{"shaftName":"Pluggable Shaft2","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.02,"gearProp":"","isGearBroken":false,"isDisc":false,"discIdx":0,"shaftPos":{"x":-2.71,"y":-0.72,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/普通齿轮B"},{"shaftName":"Pluggable Shaft1","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.7,"gearProp":"","isGearBroken":false,"isDisc":false,"discIdx":0,"shaftPos":{"x":-0.44,"y":-1.95,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/普通齿轮C"},{"shaftName":"Driver Shaft","shaftType":0,"targetSpeed":0.0,"hasChildGear":true,"radius":1.7,"gearProp":"","isGearBroken":false,"isDisc":false,"discIdx":0,"shaftPos":{"x":-1.46,"y":1.57,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/普通齿轮A"}],"panelShaftArray":[{"shaftName":"Panel Shaft1","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.7,"gearProp":"","isGearBroken":false,"isDisc":false,"discIdx":0,"shaftPos":{"x":-0.015,"y":2.63,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/普通齿轮C"},{"shaftName":"Panel Shaft2","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.02,"gearProp":"","isGearBroken":false,"isDisc":false,"discIdx":0,"shaftPos":{"x":-0.007,"y":-0.39,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/普通齿轮B"},{"shaftName":"Panel Shaft3","shaftType":2,"targetSpeed":0.0,"hasChildGear":true,"radius":1.34,"gearProp":"","isGearBroken":false,"isDisc":true,"discIdx":0,"shaftPos":{"x":-0.007,"y":-3.04,"z":0.0},"gearPicPath":"Art/Fix/变速箱齿轮/唱片齿轮"}]}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d96def72e7e63ad4bbd261a4888aa809
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user