切割功能

This commit is contained in:
2025-05-02 16:06:06 +08:00
parent 4f7dece3ca
commit 10179d5453
9 changed files with 178 additions and 135 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0eb67c8a4cbd32440a35be19a8b7b9dc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+17 -109
View File
@@ -279,90 +279,6 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &50965008
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 50965009}
- component: {fileID: 50965010}
m_Layer: 0
m_Name: Circle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &50965009
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 50965008}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -11, y: 0.81, z: 0}
m_LocalScale: {x: 0.4, y: 0.4, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1610923217}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &50965010
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 50965008}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 1986402817
m_SortingLayer: 19
m_SortingOrder: 0
m_Sprite: {fileID: -2413806693520163455, guid: a86470a33a6bf42c4b3595704624658b, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &70700667
GameObject:
m_ObjectHideFlags: 0
@@ -654,11 +570,11 @@ Transform:
m_GameObject: {fileID: 124853503}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -3.2441864, y: -2.9744186, z: 0}
m_LocalPosition: {x: 0.009813547, y: -0.4144187, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 770430378}
m_Father: {fileID: 1305312188}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &124853505
SpriteRenderer:
@@ -5401,6 +5317,7 @@ Transform:
- {fileID: 1474095201}
- {fileID: 859533817}
- {fileID: 2114957730}
- {fileID: 1497264578}
m_Father: {fileID: 719924201}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &703071695
@@ -6135,11 +6052,6 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 124853504}
- {fileID: 1157582230}
- {fileID: 1808349580}
- {fileID: 1497264578}
- {fileID: 925801570}
- {fileID: 1708742664}
m_Father: {fileID: 265073919}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -7352,11 +7264,11 @@ Transform:
m_GameObject: {fileID: 925801569}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -2.223256, y: 0.63953495, z: 0}
m_LocalPosition: {x: -1.0452552, y: 0.063534975, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 770430378}
m_Father: {fileID: 1365632492}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &925801571
SpriteRenderer:
@@ -8666,11 +8578,11 @@ Transform:
m_GameObject: {fileID: 1157582229}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -1.86, y: 2.076744, z: 0}
m_LocalPosition: {x: -1.1900005, y: -0.083256006, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 770430378}
m_Father: {fileID: 1672490540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1157582231
SpriteRenderer:
@@ -9553,6 +9465,7 @@ Transform:
m_Children:
- {fileID: 1056483153}
- {fileID: 836879224}
- {fileID: 124853504}
m_Father: {fileID: 719924201}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1305312189
@@ -10159,6 +10072,7 @@ Transform:
- {fileID: 1425842438}
- {fileID: 1159839957}
- {fileID: 878474148}
- {fileID: 925801570}
m_Father: {fileID: 719924201}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1365632493
@@ -10293,6 +10207,7 @@ Transform:
m_Children:
- {fileID: 14820817}
- {fileID: 1166446918}
- {fileID: 1808349580}
m_Father: {fileID: 719924201}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1451220531
@@ -10656,11 +10571,11 @@ Transform:
m_GameObject: {fileID: 1497264577}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -3.1209307, y: 2.598, z: 0}
m_LocalPosition: {x: 0.19307017, y: -0.004999876, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 770430378}
m_Father: {fileID: 703071694}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1497264579
SpriteRenderer:
@@ -11772,11 +11687,6 @@ MonoBehaviour:
m_EditorClassIdentifier:
taskTextPrefab: {fileID: 5295477770541402281, guid: ab166642babe53e4993fa1bd9bd57204, type: 3}
taskListParent: {fileID: 1101482910}
--- !u!4 &1610923217 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4256475766480134775, guid: 95188b5d2a557274fb52febde14400b8, type: 3}
m_PrefabInstance: {fileID: 7026926953013077400}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1612743779
GameObject:
m_ObjectHideFlags: 0
@@ -12277,6 +12187,7 @@ Transform:
m_Children:
- {fileID: 411686990}
- {fileID: 667704761}
- {fileID: 1157582230}
m_Father: {fileID: 719924201}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1672490541
@@ -12984,11 +12895,11 @@ Transform:
m_GameObject: {fileID: 1808349579}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -4.702326, y: 2.1372094, z: 0}
m_LocalPosition: {x: 0.47267628, y: 0.06120944, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 770430378}
m_Father: {fileID: 1451220530}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1808349581
SpriteRenderer:
@@ -16469,13 +16380,10 @@ PrefabInstance:
- target: {fileID: 8890064519865571154, guid: 95188b5d2a557274fb52febde14400b8, type: 3}
propertyPath: cursor
value:
objectReference: {fileID: 50965010}
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 4256475766480134775, guid: 95188b5d2a557274fb52febde14400b8, type: 3}
insertIndex: -1
addedObject: {fileID: 50965009}
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 95188b5d2a557274fb52febde14400b8, type: 3}
--- !u!1 &7169523939405871121
@@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.Linq;
using AibisDream.Framework;
using AibisDream.Kit;
using AibisDream.Utility;
using DG.Tweening;
using Newtonsoft.Json;
using UnityEngine;
@@ -129,13 +131,20 @@ namespace AibisDream.FixSystem
{
_cutLine.OnCuttingDown -= OnCuttingDown;
_cutting = false;
// TODO 播放切割动画
// 模块脱落
_cutLine.HideLine();
_bodyModuleSystem.RemoveModule(this);
ActionKit.Sequence()
.Delay(0.5f)
.DOTween(() => transform.DOMoveY(ConstRef.TweenEndY,
(transform.position.y - ConstRef.TweenEndY) / ConstRef.FallSpeed).SetEase(Ease.InQuad))
.Start(this, () => Destroy(gameObject));
}
private void ShowCutLine()
{
// 切割线不存在,就新建一个
if (_cutLine == null)
if (!_cutLine)
{
var prefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.CutLinePrefabName);
var cutLineObj = Instantiate(prefab, transform);
@@ -1,5 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using AibisDream.Framework;
using Cinemachine;
@@ -11,7 +12,7 @@ namespace AibisDream.FixSystem
{
#region
public BodyModule[] BodyModules { get; private set; }
public List<BodyModule> BodyModules { get; private set; }
private GameObject _bodyModuleGroup;
private GameObject _headModuleGroup;
@@ -200,10 +201,19 @@ namespace AibisDream.FixSystem
}
// 重新获取ModuleGroup
var root = moduleState == ModuleState.Body ? _bodyModuleGroup : _headModuleGroup;
BodyModules = root?.GetComponentsInChildren<BodyModule>();
BodyModules = root?.GetComponentsInChildren<BodyModule>().ToList();
// 更改data
_data.moduleState = moduleState;
}
/// <summary>
/// 从模块中清除
/// </summary>
/// <param name="module">将要被移除的模块</param>
public void RemoveModule(BodyModule module)
{
BodyModules.Remove(module);
}
}
[LoadIndex(2)]
@@ -12,7 +12,7 @@ namespace AibisDream
private static readonly int RangeCount = Shader.PropertyToID("_RangeCount");
#endregion
private LineRenderer _lineRenderer;
private Material _lineMaterial;
@@ -36,6 +36,8 @@ namespace AibisDream
_lineMaterial = _lineRenderer.materials[0];
}
_lineRenderer.gameObject.SetActive(true);
// 清除旧数据
ClearOldData();
// 生成归一化点
@@ -64,7 +66,7 @@ namespace AibisDream
// 设置Shader
_lineMaterial.SetFloat(TotalLength, _totalLength);
_lineMaterial.SetInt(RangeCount, 1);
_lineMaterial.SetVectorArray(Ranges, new List<Vector4> {Vector4.zero} );
_lineMaterial.SetVectorArray(Ranges, new List<Vector4> { Vector4.zero });
}
private void UpdateMaterial()
@@ -73,7 +75,7 @@ namespace AibisDream
{
return;
}
// 将Range组装成Shader可以读取的格式
var ranges = new List<Vector4>();
@@ -97,7 +99,7 @@ namespace AibisDream
_linePoints = shapePoints
.Select(item => new Vector2(item.x, item.y))
.ToArray();
var segmentLengths = new List<float>();
// 计算总长度和各段长度
@@ -159,7 +161,7 @@ namespace AibisDream
// 如果未覆盖直接计算下一段
continue;
}
// 将线段范围转成整体范围
var normalizedStart = _normalizedLinePoints[i - 1];
var normalizedEnd = _normalizedLinePoints[i];
@@ -177,7 +179,7 @@ namespace AibisDream
// 合并所有重叠区间
MergeRanges();
// 判断当前切割有没有割到95%
if (CalcTotalRange() >= 0.95)
{
@@ -193,8 +195,9 @@ namespace AibisDream
{
log += $"{range.x:F2}-{range.y:F2}; ";
}
Debug.Log(log);
UpdateMaterial();
}
@@ -204,7 +207,7 @@ namespace AibisDream
// 计算线段方向向量和长度
Vector2 lineDir = lineEnd - lineStart;
float lineLength = lineDir.magnitude;
// 如果线段长度为零(两个端点重合)
if (Mathf.Approximately(lineLength, 0f))
{
@@ -213,7 +216,7 @@ namespace AibisDream
rawRange = distance <= radius ? new Vector2(0f, 1f) : default;
return distance <= radius;
}
// 计算点到线段所在直线距离
Vector2 lineDirNormalized = lineDir / lineLength; // 归一化方向向量
Vector2 pointToStart = point - lineStart; // 计算点到线段起点的向量
@@ -221,23 +224,24 @@ namespace AibisDream
float closestT = Mathf.Clamp01(projection / lineLength); // 计算实际最近点在线段上的比例位置
Vector2 closestPoint = lineStart + closestT * lineDir; // 计算最近点坐标
float distanceToLine = Vector2.Distance(point, closestPoint); // 计算点到最近点的距离
// 如果距离大于半径,完全没有覆盖
if (distanceToLine > radius)
{
rawRange = default;
return false;
}
// 计算覆盖范围
float halfCoveredLength = Mathf.Sqrt(radius * radius - distanceToLine * distanceToLine); // 计算实际覆盖的线段长度(勾股定理)
float halfCoveredLength =
Mathf.Sqrt(radius * radius - distanceToLine * distanceToLine); // 计算实际覆盖的线段长度(勾股定理)
float startCoverage = (projection - halfCoveredLength) / lineLength;
float endCoverage = (projection + halfCoveredLength) / lineLength; // 计算覆盖的起点和终点比例
startCoverage = Mathf.Clamp01(startCoverage);
endCoverage = Mathf.Clamp01(endCoverage); // 限制在0-1范围内
// 如果起点和终点相同,表示只覆盖了一个点
if (Mathf.Approximately(startCoverage, endCoverage))
{
@@ -287,7 +291,12 @@ namespace AibisDream
#endregion
// 获取当前所有记录的范围(0-1之间的值)
public void HideLine()
{
gameObject.SetActive(false);
}
// 获取当前所有记录的范围(0-1之间的值)
public List<Vector2> GetRecordedRanges()
{
return new List<Vector2>(_recordedRanges);
@@ -0,0 +1,95 @@
using System;
using DG.Tweening;
namespace AibisDream.Kit
{
public class DOTweenAction : IAction
{
private DOTweenAction()
{
}
private static readonly SimpleObjectPool<DOTweenAction> Pool = new(() => new DOTweenAction(), null, 10);
private Func<Tween> _tweenGetter;
public static DOTweenAction Allocate(Func<Tween> tweenGetter)
{
var doTweenAction = Pool.Allocate();
doTweenAction.ActionID = ActionKit.IDGenerator++;
doTweenAction.IsFinalized = false;
doTweenAction.Reset();
doTweenAction._tweenGetter = tweenGetter;
return doTweenAction;
}
private Tween _executingTween;
public void OnStart()
{
_executingTween = _tweenGetter();
_executingTween.Restart();
var tween = _tweenGetter();
tween.Restart();
}
public void OnExecute(float dt)
{
if (_executingTween != null && !_executingTween.IsPlaying())
{
this.Finish();
}
}
public void OnFinish()
{
_executingTween = null;
}
public bool Paused { get; set; }
public void Deinit()
{
if (!IsFinalized)
{
IsFinalized = true;
if (_executingTween != null)
{
if (_executingTween.IsPlaying())
{
_executingTween.Kill();
}
}
_executingTween = null;
Pool.Recycle(this);
}
}
public void Reset()
{
Status = ActionStatus.NotStart;
Paused = false;
_executingTween = null;
}
public bool IsFinalized { get; set; }
public ulong ActionID { get; set; }
public ActionStatus Status { get; set; }
}
public static class ActionKitDOTweenExtension
{
public static IAction ToAction(this Tween self)
{
self.Pause();
return DOTweenAction.Allocate(() => self);
}
public static ISequence DOTween(this ISequence self, Func<Tween> tweenGetter)
{
return self.Append(DOTweenAction.Allocate(tweenGetter));
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 03d3c34c1dec4eb8841838c896164072
timeCreated: 1649214191
@@ -1,6 +1,5 @@
using System;
using AibisDream.FixSystem;
using AibisDream.Utility;
using UnityEngine;
namespace AibisDream.Framework
@@ -12,8 +11,6 @@ namespace AibisDream.Framework
public static MonoCenter Mono;
private static IOCContainer _iocContainer;
public SpriteRenderer cursor;
private void Awake()
{
if (Mono)
@@ -46,9 +43,6 @@ namespace AibisDream.Framework
private void Update()
{
OnUpdate?.Invoke();
// var worldPos = CommonUtil.GetMouseWorldPos(Input.mousePosition);
// worldPos.z = 0;
// cursor.transform.position = worldPos;
}
}
+7
View File
@@ -27,5 +27,12 @@ namespace AibisDream.Utility
public const string CutLinePrefabName = "CutLine";
#endregion
#region
public const float TweenEndY = -10;
public const float FallSpeed = 10;
#endregion
}
}