refactor(fix-system): 移除 Gear 齿轮小游戏系统

Made-with: Cursor
This commit is contained in:
2026-03-06 15:24:06 +08:00
parent 0d929558c0
commit 62d8945832
26 changed files with 0 additions and 1913 deletions
@@ -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
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 1154f3a67286c58469e2d89e75b23f39
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-173
View File
@@ -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
}
}
-11
View File
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: c6cc6c2a67bfbc540b276c3c4a144275
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-23
View File
@@ -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:
-403
View File
@@ -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
-343
View File
@@ -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:
-318
View File
@@ -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: