轻轻松松改成定点数咯

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-10-21 04:04:13 +08:00
parent 0371576f87
commit 930911e7df
46 changed files with 1070 additions and 317 deletions

View File

@@ -1,5 +1,6 @@
using System;
using GAS.Runtime;
using JNGame.Math;
using UnityEngine;
namespace GAS.General
@@ -17,7 +18,7 @@ namespace GAS.General
public static int CurrentFrameCount => _currentFrameCount;
public static void UpdateCurrentFrameCount()
{
_currentFrameCount = Mathf.FloorToInt((Timestamp() - _startTimestamp) / 1000f * JexGasManager.FrameRate);
_currentFrameCount = LMath.FloorToInt((Timestamp() - _startTimestamp) / LFloat.L1000 * JexGasManager.FrameRate);
}
private static long _startTimestamp;

View File

@@ -1,17 +1,18 @@
using UnityEngine;
using JNGame.Math;
using UnityEngine;
namespace GAS.General
{
public static class DebugExtension
{
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DebugBox(Vector2 center, Vector2 size, float angle, Color color, float showTime)
public static void DebugBox(LVector2 center, LVector2 size, LFloat angle, Color color, LFloat showTime)
{
var halfSize = size * 0.5f;
var p1 = new Vector2(center.x - halfSize.x, center.y - halfSize.y);
var p2 = new Vector2(center.x + halfSize.x, center.y - halfSize.y);
var p3 = new Vector2(center.x + halfSize.x, center.y + halfSize.y);
var p4 = new Vector2(center.x - halfSize.x, center.y + halfSize.y);
var halfSize = size * LFloat.L0D5;
var p1 = new LVector2(center.x - halfSize.x, center.y - halfSize.y);
var p2 = new LVector2(center.x + halfSize.x, center.y - halfSize.y);
var p3 = new LVector2(center.x + halfSize.x, center.y + halfSize.y);
var p4 = new LVector2(center.x - halfSize.x, center.y + halfSize.y);
// p1 绕center旋转angle角度
p1 = RotatePoint(center, p1, angle);
p2 = RotatePoint(center, p2, angle);
@@ -23,24 +24,24 @@ namespace GAS.General
DrawLine(p4, p1, color, showTime);
}
public static Vector2 RotatePoint(Vector2 center, Vector2 point, float angle)
public static LVector2 RotatePoint(LVector2 center, LVector2 point, LFloat angle)
{
var cos = Mathf.Cos(angle * Mathf.Deg2Rad);
var sin = Mathf.Sin(angle * Mathf.Deg2Rad);
var cos = LMath.Cos(angle * LMath.Deg2Rad);
var sin = LMath.Sin(angle * LMath.Deg2Rad);
var x = cos * (point.x - center.x) - sin * (point.y - center.y) + center.x;
var y = sin * (point.x - center.x) + cos * (point.y - center.y) + center.y;
return new Vector2(x, y);
return new LVector2(x, y);
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DebugDrawCircle(Vector2 center, float radius, Color color, float showTime, float segments = 120)
public static void DebugDrawCircle(LVector2 center, LFloat radius, Color color, LFloat showTime, LFloat segments = default) // segments = 120
{
var step = 360f / segments;
var from = center + new Vector2(radius, 0);
var step = LFloat.L360 / segments;
var from = center + new LVector2(radius, LFloat.L0);
for (var i = 0; i < segments; i++)
{
var to = center + new Vector2(radius * Mathf.Cos((i + 1) * step * Mathf.Deg2Rad),
radius * Mathf.Sin((i + 1) * step * Mathf.Deg2Rad));
var to = center + new LVector2(radius * LMath.Cos((i + 1) * step * LMath.Deg2Rad),
radius * LMath.Sin((i + 1) * step * LMath.Deg2Rad));
DrawLine(from, to, color, showTime);
from = to;
}
@@ -52,20 +53,20 @@ namespace GAS.General
/// <param name="position">位置, 圆心</param>
/// <param name="rotation">旋转</param>
/// <param name="radius">半径</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))</param>
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCircle(in Vector3 position, in Quaternion rotation, float radius, int segments = 36,
in Color? color = null, float duration = 0f)
public static void DrawCircle(in LVector3 position, in LQuaternion rotation, LFloat radius, int segments = 36,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawArc(position, rotation, radius, 360, segments, color, duration);
}
public static void DrawCircle(in Vector3 position, in Vector3 forward, float radius, int segments = 36,
in Color? color = null, float duration = 0f)
public static void DrawCircle(in LVector3 position, in LVector3 forward, LFloat radius, int segments = 36,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawCircle(position, Quaternion.LookRotation(forward), radius, segments, color, duration);
DrawCircle(position, LQuaternion.LookRotation(forward), radius, segments, color, duration);
}
/// <summary>
@@ -75,33 +76,33 @@ namespace GAS.General
/// <param name="rotation">旋转</param>
/// <param name="radius">半径</param>
/// <param name="angle">角度</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))</param>
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawArc(in Vector3 position, in Quaternion rotation, float radius, float angle, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawArc(in LVector3 position, in LQuaternion rotation, LFloat radius, LFloat angle, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
if (angle <= 0) return;
if (radius <= 0) return;
if (segments <= 0) return;
var angleStep = angle / segments;
var lastPoint = position + rotation * (Vector3.right * radius);
var lastPoint = position + rotation * (LVector3.Right * radius);
for (int i = 1; i <= segments; i++)
{
var currentAngle = i * angleStep;
var nextPoint = position + rotation * (Quaternion.Euler(0, currentAngle, 0) * Vector3.right * radius);
var nextPoint = position + rotation * (LQuaternion.Euler(0, currentAngle, 0) * LVector3.Right * radius);
DrawLine(lastPoint, nextPoint, color, duration);
lastPoint = nextPoint;
}
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawArc(in Vector3 position, in Vector3 forward, float radius, float angle, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawArc(in LVector3 position, in LVector3 forward, LFloat radius, LFloat angle, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawArc(position, Quaternion.LookRotation(forward), radius, angle, segments, color, duration);
DrawArc(position, LQuaternion.LookRotation(forward), radius, angle, segments, color, duration);
}
/// <summary>
@@ -111,27 +112,27 @@ namespace GAS.General
/// <param name="rotation">旋转</param>
/// <param name="outerRadius">外圈半径</param>
/// <param name="innerRadius">内圈半径</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))</param>
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawRing(in Vector3 position, in Quaternion rotation, float outerRadius, float innerRadius, int segments = 36,
in Color? color = null, float duration = 0f)
public static void DrawRing(in LVector3 position, in LQuaternion rotation, LFloat outerRadius, LFloat innerRadius, int segments = 36,
in Color? color = null, LFloat duration = default) //duration = 0
{
if (outerRadius <= 0) return;
if (segments <= 0) return;
innerRadius = Mathf.Clamp(innerRadius, 0, outerRadius);
innerRadius = LMath.Clamp(innerRadius, LFloat.L0, outerRadius);
// 计算圆的每个点的位置
var angleStep = 360f / segments;
var lastOuterPoint = position + rotation * (Vector3.right * outerRadius);
var lastInnerPoint = position + rotation * (Vector3.right * innerRadius);
var angleStep = LFloat.L360 / segments;
var lastOuterPoint = position + rotation * (LVector3.Right * outerRadius);
var lastInnerPoint = position + rotation * (LVector3.Right * innerRadius);
for (int i = 1; i <= segments; i++)
{
var angle = i * angleStep;
var nextOuterPoint = position + rotation * (Quaternion.Euler(0, angle, 0) * Vector3.right * outerRadius);
var nextInnerPoint = position + rotation * (Quaternion.Euler(0, angle, 0) * Vector3.right * innerRadius);
var nextOuterPoint = position + rotation * (LQuaternion.Euler(0, angle, 0) * LVector3.Right * outerRadius);
var nextInnerPoint = position + rotation * (LQuaternion.Euler(0, angle, 0) * LVector3.Right * innerRadius);
DrawLine(lastOuterPoint, nextOuterPoint, color, duration);
DrawLine(lastInnerPoint, nextInnerPoint, color, duration);
DrawLine(nextOuterPoint, nextInnerPoint, color, duration);
@@ -141,10 +142,10 @@ namespace GAS.General
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawRing(in Vector3 position, in Vector3 forward, float outerRadius, float innerRadius, int segments = 36,
in Color? color = null, float duration = 0f)
public static void DrawRing(in LVector3 position, in LVector3 forward, LFloat outerRadius, LFloat innerRadius, int segments = 36,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawRing(position, Quaternion.LookRotation(forward), outerRadius, innerRadius, segments, color, duration);
DrawRing(position, LQuaternion.LookRotation(forward), outerRadius, innerRadius, segments, color, duration);
}
/// <summary>
@@ -156,16 +157,16 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawRectangle(in Vector3 position, in Quaternion rotation, in Vector2 size,
in Color? color = null, float duration = 0f)
public static void DrawRectangle(in LVector3 position, in LQuaternion rotation, in LVector2 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
// 计算矩形的四个角点在局部坐标系中的位置
var halfSize = new Vector3(size.x * 0.5f, 0, size.y * 0.5f);
var corners = new Vector3[4];
corners[0] = new Vector3(-halfSize.x, 0, -halfSize.z); // 左下角
corners[1] = new Vector3(halfSize.x, 0, -halfSize.z); // 右下角
corners[2] = new Vector3(halfSize.x, 0, halfSize.z); // 右上角
corners[3] = new Vector3(-halfSize.x, 0, halfSize.z); // 左上角
var halfSize = new LVector3(size.x * LFloat.L0D5, LFloat.L0, size.y * LFloat.L0D5);
var corners = new LVector3[4];
corners[0] = new LVector3(-halfSize.x, LFloat.L0, -halfSize.z); // 左下角
corners[1] = new LVector3(halfSize.x, LFloat.L0, -halfSize.z); // 右下角
corners[2] = new LVector3(halfSize.x, LFloat.L0, halfSize.z); // 右上角
corners[3] = new LVector3(-halfSize.x, LFloat.L0, halfSize.z); // 左上角
// 旋转角点并转换到世界坐标系
for (int i = 0; i < corners.Length; i++)
@@ -181,10 +182,10 @@ namespace GAS.General
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawRectangle(in Vector3 position, in Vector3 forward, in Vector2 size,
in Color? color = null, float duration = 0f)
public static void DrawRectangle(in LVector3 position, in LVector3 forward, in LVector2 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawRectangle(position, Quaternion.LookRotation(forward), size, color, duration);
DrawRectangle(position, LQuaternion.LookRotation(forward), size, color, duration);
}
/// <summary>
@@ -196,16 +197,16 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawFrontRectangle(in Vector3 position, in Quaternion rotation, in Vector2 size,
in Color? color = null, float duration = 0f)
public static void DrawFrontRectangle(in LVector3 position, in LQuaternion rotation, in LVector2 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
// 计算矩形的四个角点在局部坐标系中的位置
var halfX = size.x * 0.5f;
var corners = new Vector3[4];
corners[0] = new Vector3(-halfX, 0, 0); // 左下角
corners[1] = new Vector3(halfX, 0, 0); // 右下角
corners[2] = new Vector3(halfX, 0, size.y); // 右上角
corners[3] = new Vector3(-halfX, 0, size.y); // 左上角
var halfX = size.x * LFloat.L0D5;
var corners = new LVector3[4];
corners[0] = new LVector3(-halfX, LFloat.L0, LFloat.L0); // 左下角
corners[1] = new LVector3(halfX, LFloat.L0, LFloat.L0); // 右下角
corners[2] = new LVector3(halfX, LFloat.L0, size.y); // 右上角
corners[3] = new LVector3(-halfX, LFloat.L0, size.y); // 左上角
// 旋转角点并转换到世界坐标系
for (int i = 0; i < corners.Length; i++)
@@ -221,10 +222,10 @@ namespace GAS.General
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawFrontRectangle(in Vector3 position, in Vector3 forward, in Vector2 size,
in Color? color = null, float duration = 0f)
public static void DrawFrontRectangle(in LVector3 position, in LVector3 forward, in LVector2 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawFrontRectangle(position, Quaternion.LookRotation(forward), size, color, duration);
DrawFrontRectangle(position, LQuaternion.LookRotation(forward), size, color, duration);
}
/// <summary>
@@ -236,24 +237,24 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCube(in Vector3 position, in Quaternion rotation, in Vector3 size,
in Color? color = null, float duration = 0f)
public static void DrawCube(in LVector3 position, in LQuaternion rotation, in LVector3 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
// 计算立方体的八个顶点在局部坐标系中的位置
var halfSize = size * 0.5f;
var vertices = new Vector3[8];
var halfSize = size * LFloat.L0D5;
var vertices = new LVector3[8];
// 下底面四个顶点
vertices[0] = new Vector3(-halfSize.x, -halfSize.y, -halfSize.z);
vertices[1] = new Vector3(halfSize.x, -halfSize.y, -halfSize.z);
vertices[2] = new Vector3(halfSize.x, -halfSize.y, halfSize.z);
vertices[3] = new Vector3(-halfSize.x, -halfSize.y, halfSize.z);
vertices[0] = new LVector3(-halfSize.x, -halfSize.y, -halfSize.z);
vertices[1] = new LVector3(halfSize.x, -halfSize.y, -halfSize.z);
vertices[2] = new LVector3(halfSize.x, -halfSize.y, halfSize.z);
vertices[3] = new LVector3(-halfSize.x, -halfSize.y, halfSize.z);
// 上顶面四个顶点
vertices[4] = new Vector3(-halfSize.x, halfSize.y, -halfSize.z);
vertices[5] = new Vector3(halfSize.x, halfSize.y, -halfSize.z);
vertices[6] = new Vector3(halfSize.x, halfSize.y, halfSize.z);
vertices[7] = new Vector3(-halfSize.x, halfSize.y, halfSize.z);
vertices[4] = new LVector3(-halfSize.x, halfSize.y, -halfSize.z);
vertices[5] = new LVector3(halfSize.x, halfSize.y, -halfSize.z);
vertices[6] = new LVector3(halfSize.x, halfSize.y, halfSize.z);
vertices[7] = new LVector3(-halfSize.x, halfSize.y, halfSize.z);
// 旋转顶点并转换到世界坐标系
for (int i = 0; i < vertices.Length; i++)
@@ -279,10 +280,10 @@ namespace GAS.General
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCube(in Vector3 position, in Vector3 forward, in Vector3 size,
in Color? color = null, float duration = 0f)
public static void DrawCube(in LVector3 position, in LVector3 forward, in LVector3 size,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawCube(position, Quaternion.LookRotation(forward), size, color, duration);
DrawCube(position, LQuaternion.LookRotation(forward), size, color, duration);
}
/// <summary>
@@ -296,10 +297,10 @@ namespace GAS.General
/// <param name="color"></param>
/// <param name="duration"></param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCylinder(in Vector3 position, in Quaternion rotation, float radius, float height, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawCylinder(in LVector3 position, in LQuaternion rotation, LFloat radius, LFloat height, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
var offset = rotation * Vector3.up * (height * 0.5f);
var offset = rotation * LVector3.Up * (height * LFloat.L0D5);
var topCenter = position + offset;
var bottomCenter = position - offset;
DrawCylinder(topCenter, bottomCenter, radius, segments, color, duration);
@@ -316,42 +317,42 @@ namespace GAS.General
/// <param name="color"></param>
/// <param name="duration"></param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCylinder(in Vector3 position, in Vector3 forward, float radius, float height, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawCylinder(in LVector3 position, in LVector3 forward, LFloat radius, LFloat height, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawCylinder(position, Quaternion.LookRotation(forward), radius, height, segments, in color, duration);
DrawCylinder(position, LQuaternion.LookRotation(forward), radius, height, segments, in color, duration);
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawCylinder(in Vector3 topCenter, in Vector3 bottomCenter, float radius, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawCylinder(in LVector3 topCenter, in LVector3 bottomCenter, LFloat radius, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
if (radius <= 0) return;
if (segments <= 0) return;
if (Vector3.Distance(topCenter, bottomCenter) <= Mathf.Epsilon) return;
if (LVector3.Distance(topCenter, bottomCenter) <= LFloat.EPSILON) return;
var direction = (topCenter - bottomCenter).normalized;
var direction = (topCenter - bottomCenter).Normalized;
// 计算一个垂直于direction的向量作为forward
var forward = Vector3.Cross(direction, Vector3.up).normalized;
var forward = LVector3.Cross(direction, LVector3.Up).Normalized;
// 如果forward和direction平行即direction和Vector3.up共线则选择一个不同的方向作为forward
if (forward == Vector3.zero)
// 如果forward和direction平行即direction和LVector3.up共线则选择一个不同的方向作为forward
if (forward == LVector3.Zero)
{
forward = Vector3.Cross(direction, Vector3.right).normalized;
forward = LVector3.Cross(direction, LVector3.Right).Normalized;
}
var rotation = Quaternion.LookRotation(forward, direction);
var rotation = LQuaternion.LookRotation(forward, direction);
var angleStep = 360f / segments;
var offset = rotation * (Vector3.right * radius);
var angleStep = LFloat.L360 / segments;
var offset = rotation * (LVector3.Right * radius);
var lastTopPoint = topCenter + offset;
var lastBottomPoint = bottomCenter + offset;
for (int i = 1; i <= segments; i++)
{
var currentAngle = i * angleStep;
offset = rotation * (Quaternion.Euler(0, currentAngle, 0) * (Vector3.right * radius));
offset = rotation * (LQuaternion.Euler(0, currentAngle, 0) * (LVector3.Right * radius));
var nextTopPoint = topCenter + offset;
var nextBottomPoint = bottomCenter + offset;
DrawLine(lastTopPoint, nextTopPoint, color, duration);
@@ -369,21 +370,21 @@ namespace GAS.General
/// <param name="rotation">旋转</param>
/// <param name="radius">扇形的半径</param>
/// <param name="angle">扇形的角度(度)</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))</param>
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawSector(Vector3 position, Quaternion rotation, float radius, float angle, int segments = 12,
Color? color = null, float duration = 0f)
public static void DrawSector(LVector3 position, LQuaternion rotation, LFloat radius, LFloat angle, int segments = 12,
Color? color = null, LFloat duration = default) //duration = 0
{
DrawAnnularSector(position, rotation, radius, 0, angle, segments, color, duration);
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawSector(in Vector3 position, in Vector3 forward, float radius, float angle, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawSector(in LVector3 position, in LVector3 forward, LFloat radius, LFloat angle, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
DrawSector(position, Quaternion.LookRotation(forward), radius, angle, segments, color, duration);
DrawSector(position, LQuaternion.LookRotation(forward), radius, angle, segments, color, duration);
}
@@ -395,29 +396,29 @@ namespace GAS.General
/// <param name="outerRadius">扇形的外半径</param>
/// <param name="innerRadius">扇形的内半径, 为0时为标准扇形</param>
/// <param name="angle">扇形的角度(度)</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = Mathf.CeilToInt(angle / 10))</param>
/// <param name="segments">分段数(建议与角度适配, 如每10°分一段: segments = LMath.CeilToInt(angle / 10))</param>
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawAnnularSector(in Vector3 position, in Quaternion rotation, float outerRadius, float innerRadius, float angle, int segments = 12,
in Color? color = null, float duration = 0f)
public static void DrawAnnularSector(in LVector3 position, in LQuaternion rotation, LFloat outerRadius, LFloat innerRadius, LFloat angle, int segments = 12,
in Color? color = null, LFloat duration = default) //duration = 0
{
if (outerRadius <= 0) return;
if (segments <= 0) return;
if (angle <= 0) return;
innerRadius = Mathf.Clamp(innerRadius, 0, outerRadius);
innerRadius = LMath.Clamp(innerRadius, LFloat.L0, outerRadius);
var angleStep = angle / segments;
var currentAngle = -angle * 0.5f;
var currentAngle = -angle * LFloat.L0D5;
var outerPoints = new Vector3[segments + 1];
var innerPoints = new Vector3[segments + 1];
var outerPoints = new LVector3[segments + 1];
var innerPoints = new LVector3[segments + 1];
// 计算内外扇形的点
for (var i = 0; i <= segments; i++)
{
var currentDirection = rotation * Quaternion.Euler(0, currentAngle, 0) * Vector3.forward;
var currentDirection = rotation * LQuaternion.Euler(0, currentAngle, 0) * LVector3.Forward;
outerPoints[i] = position + currentDirection * outerRadius;
innerPoints[i] = position + currentDirection * innerRadius;
currentAngle += angleStep;
@@ -443,9 +444,9 @@ namespace GAS.General
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawAnnularSector(in Vector3 position, in Vector3 forward, float outerRadius, float innerRadius, float angle, int segments = 12, in Color? color = null, float duration = 0f)
public static void DrawAnnularSector(in LVector3 position, in LVector3 forward, LFloat outerRadius, LFloat innerRadius, LFloat angle, int segments = 12, in Color? color = null, LFloat duration = default) //duration = 0
{
DrawAnnularSector(position, Quaternion.LookRotation(forward), outerRadius, innerRadius, angle, segments, color, duration);
DrawAnnularSector(position, LQuaternion.LookRotation(forward), outerRadius, innerRadius, angle, segments, color, duration);
}
/// <summary>
@@ -456,9 +457,9 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawLine(in Vector3 start, in Vector3 end, in Color? color = null, float duration = 0f)
public static void DrawLine(in LVector3 start, in LVector3 end, in Color? color = null, LFloat duration = default) //duration = 0
{
Debug.DrawLine(start, end, color ?? Color.cyan, duration);
Debug.DrawLine(start.ToVector3(), end.ToVector3(), color ?? Color.cyan, duration);
}
/// <summary>
@@ -469,12 +470,12 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawArrow(in Vector3 origin, in Vector3 destination, in Color? color = null, float duration = 0f)
public static void DrawArrow(in LVector3 origin, in LVector3 destination, in Color? color = null, LFloat duration = default) //duration = 0
{
DrawLine(origin, destination, color, duration);
var direction = destination - origin;
var right = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 + 30, 0) * Vector3.forward;
var left = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 - 30, 0) * Vector3.forward;
var right = LQuaternion.LookRotation(direction) * LQuaternion.Euler(0, 180 + 30, 0) * LVector3.Forward;
var left = LQuaternion.LookRotation(direction) * LQuaternion.Euler(0, 180 - 30, 0) * LVector3.Forward;
DrawLine(destination, destination + right, color, duration);
DrawLine(destination, destination + left, color, duration);
}
@@ -489,17 +490,17 @@ namespace GAS.General
/// <param name="color">颜色</param>
/// <param name="duration">绘制时长(0为1帧)</param>
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawArrow(in Vector3 origin, in Quaternion rotation, float length, in Color? color = null, float duration = 0f)
public static void DrawArrow(in LVector3 origin, in LQuaternion rotation, LFloat length, in Color? color = null, LFloat duration = default) //duration = 0
{
var direction = rotation * Vector3.forward;
var direction = rotation * LVector3.Forward;
var destination = origin + direction * length;
DrawArrow(origin, destination, color, duration);
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void DrawArrow(in Vector3 origin, in Vector3 direction, float length, in Color? color = null, float duration = 0f)
public static void DrawArrow(in LVector3 origin, in LVector3 direction, LFloat length, in Color? color = null, LFloat duration = default) //duration = 0
{
var destination = origin + direction.normalized * length;
var destination = origin + direction.Normalized * length;
DrawArrow(origin, destination, color, duration);
}
}

View File

@@ -1,4 +1,5 @@
using System;
using JNGame.Math;
namespace GAS.Runtime
{
@@ -137,11 +138,11 @@ namespace GAS.Runtime
Owner.GetAttributeCurrentValue(modifier.AttributeSetName, modifier.AttributeShortName);
if (modifier.Operation == GEOperation.Add)
if (attributeCurrentValue + costValue < 0)
if (attributeCurrentValue != null && (attributeCurrentValue.Value + costValue) < LFloat.L0)
return false;
if (modifier.Operation == GEOperation.Minus)
if (attributeCurrentValue - costValue < 0)
if (attributeCurrentValue != null && (attributeCurrentValue.Value - costValue) < LFloat.L0)
return false;
}

View File

@@ -1,4 +1,5 @@
using UnityEngine.Profiling;
using JNGame.Math;
using UnityEngine.Profiling;
namespace GAS.Runtime
{
@@ -19,7 +20,7 @@ namespace GAS.Runtime
/// <summary>
/// 不受播放速率影响的总时间
/// </summary>
public float TotalTime => _player.TotalTime;
public LFloat TotalTime => _player.TotalTime;
/// <summary>
/// 向性技能的作用目标
@@ -41,7 +42,7 @@ namespace GAS.Runtime
_player.Play();
}
public virtual float GetPlaySpeed()
public virtual LFloat GetPlaySpeed()
{
return Data.AbilityAsset.Speed;
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Reflection;
using GAS.General;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine;
@@ -39,7 +40,7 @@ namespace GAS.Runtime
[LabelText(GASTextDefine.ABILITY_PLAY_RATE)]
[LabelWidth(100)]
[MinValue(0)]
public float Speed = 1.0f;
public LFloat Speed = 1;
[TabGroup("Data/H1/V1", "Timeline")]
[LabelText(GASTextDefine.ABILITY_MANUAL_ENDABILITY)]

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using UnityEngine;
//using UnityEngine.Profiling;
@@ -54,7 +55,7 @@ namespace GAS.Runtime
private readonly List<AbilitySystemComponent> _targets = new();
private int _currentFrame;
private float _playTotalTime;
private LFloat _playTotalTime;
public TimelineAbilityPlayer(TimelineAbilitySpecT<AbilityT, AssetT> abilitySpec)
{
@@ -71,7 +72,7 @@ namespace GAS.Runtime
/// <summary>
/// 不受播放速率影响的总时间
/// </summary>
public float TotalTime => (float)FrameCount / FrameRate;
public LFloat TotalTime => (LFloat)FrameCount / FrameRate;
private void Cache()
{

View File

@@ -126,13 +126,13 @@ namespace GAS.Runtime
// public LayerMask checkLayer;
// public CenterType centerType;
//
// public Vector3 center;
// public LVector3 center;
//
// // Circle2D,Sphere3D
// public float radius;
// public LFloat radius;
//
// // Box2D,Box3D
// public Vector3 size;
// public LVector3 size;
//
// // Custom
// public string customMethodRegisterKey;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -118,13 +119,13 @@ namespace GAS.Runtime
/// 3._modifierCache的AttributeBased类的MMCTrack类属性变化时
/// </summary>
/// <returns></returns>
float CalculateNewValue()
LFloat CalculateNewValue()
{
switch (_processedAttribute.CalculateMode)
{
case CalculateMode.Stacking:
{
float newValue = _processedAttribute.BaseValue;
LFloat newValue = _processedAttribute.BaseValue;
foreach (var modifierSpec in _modifierCache)
{
var spec = modifierSpec.SpecRef;
@@ -163,7 +164,7 @@ namespace GAS.Runtime
case CalculateMode.MinValueOnly:
{
var hasOverride = false;
var min = float.MaxValue;
var min = LFloat.MaxValue;
foreach (var modifierSpec in _modifierCache)
{
var spec = modifierSpec.SpecRef;
@@ -180,7 +181,7 @@ namespace GAS.Runtime
}
var magnitude = modifier.CalculateMagnitude(spec, modifier.ModiferMagnitude);
min = Mathf.Min(min, magnitude);
min = LMath.Min(min, magnitude);
hasOverride = true;
}
@@ -189,7 +190,7 @@ namespace GAS.Runtime
case CalculateMode.MaxValueOnly:
{
var hasOverride = false;
var max = float.MinValue;
var max = LFloat.MinValue;
foreach (var modifierSpec in _modifierCache)
{
var spec = modifierSpec.SpecRef;
@@ -206,7 +207,7 @@ namespace GAS.Runtime
}
var magnitude = modifier.CalculateMagnitude(spec, modifier.ModiferMagnitude);
max = Mathf.Max(max, magnitude);
max = LMath.Max(max, magnitude);
hasOverride = true;
}
@@ -217,17 +218,17 @@ namespace GAS.Runtime
}
}
void UpdateCurrentValueWhenBaseValueIsDirty(AttributeBase attribute, float oldBaseValue, float newBaseValue)
void UpdateCurrentValueWhenBaseValueIsDirty(AttributeBase attribute, LFloat oldBaseValue, LFloat newBaseValue)
{
if (Mathf.Approximately(oldBaseValue, newBaseValue)) return;
if (LMath.Approximately(oldBaseValue, newBaseValue)) return;
float newValue = CalculateNewValue();
LFloat newValue = CalculateNewValue();
_processedAttribute.SetCurrentValue(newValue);
}
void UpdateCurrentValueWhenModifierIsDirty()
{
float newValue = CalculateNewValue();
LFloat newValue = CalculateNewValue();
_processedAttribute.SetCurrentValue(newValue);
}
@@ -275,7 +276,7 @@ namespace GAS.Runtime
}
}
private void OnAttributeChanged(AttributeBase attribute, float oldValue, float newValue)
private void OnAttributeChanged(AttributeBase attribute, LFloat oldValue, LFloat newValue)
{
if (IsTrackingAttribute(attribute))
UpdateCurrentValueWhenModifierIsDirty();

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -10,34 +11,34 @@ namespace GAS.Runtime
public readonly string Name;
public readonly string SetName;
public readonly string ShortName;
protected event Action<AttributeBase, float, float> _onPostCurrentValueChange;
protected event Action<AttributeBase, float, float> _onPostBaseValueChange;
protected event Action<AttributeBase, float> _onPreCurrentValueChange;
protected event Func<AttributeBase, float, float> _onPreBaseValueChange;
protected IEnumerable<Func<AttributeBase, float, float>> _preBaseValueChangeListeners;
protected event Action<AttributeBase, LFloat, LFloat> _onPostCurrentValueChange;
protected event Action<AttributeBase, LFloat, LFloat> _onPostBaseValueChange;
protected event Action<AttributeBase, LFloat> _onPreCurrentValueChange;
protected event Func<AttributeBase, LFloat, LFloat> _onPreBaseValueChange;
protected IEnumerable<Func<AttributeBase, LFloat, LFloat>> _preBaseValueChangeListeners;
private AttributeValue _value;
private AbilitySystemComponent _owner;
public AbilitySystemComponent Owner => _owner;
public AttributeBase(string attrSetName, string attrName, float value = 0,
public AttributeBase(string attrSetName, string attrName,
LFloat value,LFloat minValue, LFloat maxValue,
CalculateMode calculateMode = CalculateMode.Stacking,
SupportedOperation supportedOperation = SupportedOperation.All,
float minValue = float.MinValue, float maxValue = float.MaxValue)
SupportedOperation supportedOperation = SupportedOperation.All)
{
SetName = attrSetName;
Name = $"{attrSetName}.{attrName}";
ShortName = attrName;
_value = new AttributeValue(value, calculateMode, supportedOperation, minValue, maxValue);
_value = new AttributeValue(value, minValue,maxValue,calculateMode, supportedOperation);
}
public AttributeValue Value => _value;
public float BaseValue => _value.BaseValue;
public float CurrentValue => _value.CurrentValue;
public LFloat BaseValue => _value.BaseValue;
public LFloat CurrentValue => _value.CurrentValue;
public float MinValue => _value.MinValue;
public float MaxValue => _value.MaxValue;
public LFloat MinValue => _value.MinValue;
public LFloat MaxValue => _value.MaxValue;
public CalculateMode CalculateMode => _value.CalculateMode;
public SupportedOperation SupportedOperation => _value.SupportedOperation;
@@ -47,17 +48,17 @@ namespace GAS.Runtime
_owner = owner;
}
public void SetMinValue(float min)
public void SetMinValue(LFloat min)
{
_value.SetMinValue(min);
}
public void SetMaxValue(float max)
public void SetMaxValue(LFloat max)
{
_value.SetMaxValue(max);
}
public void SetMinMaxValue(float min, float max)
public void SetMinMaxValue(LFloat min, LFloat max)
{
_value.SetMinValue(min);
_value.SetMaxValue(max);
@@ -68,26 +69,26 @@ namespace GAS.Runtime
return _value.IsSupportOperation(operation);
}
public void Init(float baseValue)
public void Init(LFloat baseValue)
{
SetBaseValue(baseValue);
SetCurrentValue(baseValue);
}
public void SetCurrentValue(float value)
public void SetCurrentValue(LFloat value)
{
value = Mathf.Clamp(value, _value.MinValue, _value.MaxValue);
value = LMath.Clamp(value, _value.MinValue, _value.MaxValue);
_onPreCurrentValueChange?.Invoke(this, value);
var oldValue = CurrentValue;
_value.SetCurrentValue(value);
if (!Mathf.Approximately(oldValue, value))
if (!LMath.Approximately(oldValue, value))
_onPostCurrentValueChange?.Invoke(this, oldValue, value);
}
public void SetBaseValue(float value)
public void SetBaseValue(LFloat value)
{
if (_onPreBaseValueChange != null)
{
@@ -97,60 +98,60 @@ namespace GAS.Runtime
var oldValue = _value.BaseValue;
_value.SetBaseValue(value);
if (!Mathf.Approximately(oldValue, value))
if (!LMath.Approximately(oldValue, value))
_onPostBaseValueChange?.Invoke(this, oldValue, value);
}
public void SetCurrentValueWithoutEvent(float value)
public void SetCurrentValueWithoutEvent(LFloat value)
{
_value.SetCurrentValue(value);
}
public void SetBaseValueWithoutEvent(float value)
public void SetBaseValueWithoutEvent(LFloat value)
{
_value.SetBaseValue(value);
}
public void RegisterPreBaseValueChange(Func<AttributeBase, float, float> func)
public void RegisterPreBaseValueChange(Func<AttributeBase, LFloat, LFloat> func)
{
_onPreBaseValueChange += func;
_preBaseValueChangeListeners =
_onPreBaseValueChange?.GetInvocationList().Cast<Func<AttributeBase, float, float>>();
_onPreBaseValueChange?.GetInvocationList().Cast<Func<AttributeBase, LFloat, LFloat>>();
}
public void RegisterPostBaseValueChange(Action<AttributeBase, float, float> action)
public void RegisterPostBaseValueChange(Action<AttributeBase, LFloat, LFloat> action)
{
_onPostBaseValueChange += action;
}
public void RegisterPreCurrentValueChange(Action<AttributeBase, float> action)
public void RegisterPreCurrentValueChange(Action<AttributeBase, LFloat> action)
{
_onPreCurrentValueChange += action;
}
public void RegisterPostCurrentValueChange(Action<AttributeBase, float, float> action)
public void RegisterPostCurrentValueChange(Action<AttributeBase, LFloat, LFloat> action)
{
_onPostCurrentValueChange += action;
}
public void UnregisterPreBaseValueChange(Func<AttributeBase, float, float> func)
public void UnregisterPreBaseValueChange(Func<AttributeBase, LFloat, LFloat> func)
{
_onPreBaseValueChange -= func;
_preBaseValueChangeListeners =
_onPreBaseValueChange?.GetInvocationList().Cast<Func<AttributeBase, float, float>>();
_onPreBaseValueChange?.GetInvocationList().Cast<Func<AttributeBase, LFloat, LFloat>>();
}
public void UnregisterPostBaseValueChange(Action<AttributeBase, float, float> action)
public void UnregisterPostBaseValueChange(Action<AttributeBase, LFloat, LFloat> action)
{
_onPostBaseValueChange -= action;
}
public void UnregisterPreCurrentValueChange(Action<AttributeBase, float> action)
public void UnregisterPreCurrentValueChange(Action<AttributeBase, LFloat> action)
{
_onPreCurrentValueChange -= action;
}
public void UnregisterPostCurrentValueChange(Action<AttributeBase, float, float> action)
public void UnregisterPostCurrentValueChange(Action<AttributeBase, LFloat, LFloat> action)
{
_onPostCurrentValueChange -= action;
}
@@ -163,7 +164,7 @@ namespace GAS.Runtime
_onPostCurrentValueChange = null;
}
private float InvokePreBaseValueChangeListeners(float value)
private LFloat InvokePreBaseValueChangeListeners(LFloat value)
{
if (_preBaseValueChangeListeners == null) return value;

View File

@@ -1,4 +1,5 @@
using Sirenix.OdinInspector;
using JNGame.Math;
using Sirenix.OdinInspector;
namespace GAS.Runtime
{
@@ -16,10 +17,11 @@ namespace GAS.Runtime
public struct AttributeValue
{
public AttributeValue(float baseValue,
public AttributeValue(
LFloat baseValue,LFloat minValue, LFloat maxValue,
CalculateMode calculateMode = CalculateMode.Stacking,
SupportedOperation supportedOperation = SupportedOperation.All,
float minValue = float.MinValue, float maxValue = float.MaxValue)
SupportedOperation supportedOperation = SupportedOperation.All
)
{
BaseValue = baseValue;
SupportedOperation = supportedOperation;
@@ -32,36 +34,36 @@ namespace GAS.Runtime
public CalculateMode CalculateMode { get; }
public SupportedOperation SupportedOperation { get; }
public float BaseValue { get; private set; }
public float CurrentValue { get; private set; }
public LFloat BaseValue { get; private set; }
public LFloat CurrentValue { get; private set; }
public float MinValue { get; private set; }
public float MaxValue { get; private set; }
public LFloat MinValue { get; private set; }
public LFloat MaxValue { get; private set; }
/// <summary>
/// ignore min and max value, set current value directly
/// </summary>
public void SetCurrentValue(float value)
public void SetCurrentValue(LFloat value)
{
CurrentValue = value;
}
public void SetBaseValue(float value)
public void SetBaseValue(LFloat value)
{
BaseValue = value;
}
public void SetMinValue(float min)
public void SetMinValue(LFloat min)
{
MinValue = min;
}
public void SetMaxValue(float max)
public void SetMaxValue(LFloat max)
{
MaxValue = max;
}
public void SetMinMaxValue(float min, float max)
public void SetMinMaxValue(LFloat min, LFloat max)
{
MinValue = min;
MaxValue = max;

View File

@@ -1,4 +1,6 @@
namespace GAS.Runtime
using JNGame.Math;
namespace GAS.Runtime
{
public abstract class AttributeSet
{
@@ -7,7 +9,7 @@
public abstract AttributeBase this[string key] { get; }
public abstract string[] AttributeNames { get; }
public abstract void SetOwner(AbilitySystemComponent owner);
public void ChangeAttributeBase(string attributeShortName, float value)
public void ChangeAttributeBase(string attributeShortName, LFloat value)
{
if (this[attributeShortName] != null)
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
namespace GAS.Runtime
{
@@ -97,22 +98,22 @@ namespace GAS.Runtime
: (CalculateMode?)null;
}
public float? GetAttributeBaseValue(string attrSetName, string attrShortName)
public LFloat? GetAttributeBaseValue(string attrSetName, string attrShortName)
{
return _attributeSets.TryGetValue(attrSetName, out var set) ? set[attrShortName].BaseValue : (float?)null;
return _attributeSets.TryGetValue(attrSetName, out var set) ? set[attrShortName].BaseValue : (LFloat?)null;
}
public float? GetAttributeCurrentValue(string attrSetName, string attrShortName)
public LFloat? GetAttributeCurrentValue(string attrSetName, string attrShortName)
{
return _attributeSets.TryGetValue(attrSetName, out var set)
? set[attrShortName].CurrentValue
: (float?)null;
: (LFloat?)null;
}
public Dictionary<string, float> Snapshot()
public Dictionary<string, LFloat> Snapshot()
{
var snapshot = JexGasObjectPool.Instance.Fetch<Dictionary<string, float>>();
var snapshot = JexGasObjectPool.Instance.Fetch<Dictionary<string, LFloat>>();
foreach (var kv in _attributeSets)
{
var attributeSet = kv.Value;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -270,13 +271,13 @@ namespace GAS.Runtime
return value;
}
public float? GetAttributeCurrentValue(string setName, string attributeShortName)
public LFloat? GetAttributeCurrentValue(string setName, string attributeShortName)
{
var value = AttributeSetContainer.GetAttributeCurrentValue(setName, attributeShortName);
return value;
}
public float? GetAttributeBaseValue(string setName, string attributeShortName)
public LFloat? GetAttributeBaseValue(string setName, string attributeShortName)
{
var value = AttributeSetContainer.GetAttributeBaseValue(setName, attributeShortName);
return value;
@@ -288,7 +289,7 @@ namespace GAS.Runtime
GameplayEffectContainer.Tick(dt);
}
public Dictionary<string, float> DataSnapshot()
public Dictionary<string, LFloat> DataSnapshot()
{
return AttributeSetContainer.Snapshot();
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using JNGame.Math;
namespace GAS.Runtime
{
@@ -33,14 +34,14 @@ namespace GAS.Runtime
void Tick(int dt);
Dictionary<string, float> DataSnapshot();
Dictionary<string, LFloat> DataSnapshot();
AbilitySpec GrantAbility(AbstractAbility ability);
void RemoveAbility(string abilityName);
float? GetAttributeCurrentValue(string setName, string attributeShortName);
float? GetAttributeBaseValue(string setName, string attributeShortName);
LFloat? GetAttributeCurrentValue(string setName, string attributeShortName);
LFloat? GetAttributeBaseValue(string setName, string attributeShortName);
bool TryActivateAbility(string abilityName, object arg = null);
void TryEndAbility(string abilityName);

View File

@@ -1,4 +1,5 @@
using System;
using JNGame.Math;
namespace GAS.Runtime
{
@@ -11,13 +12,13 @@ namespace GAS.Runtime
/// </summary>
public sealed class CompositeAttribute
{
public float Value { get; private set; }
public float MinValue { get; private set; }
public float MaxValue { get; private set; }
public LFloat Value { get; private set; }
public LFloat MinValue { get; private set; }
public LFloat MaxValue { get; private set; }
public delegate float OnPreValueChange(CompositeAttribute compositeAttribute, float oldValue, float newValue);
public delegate LFloat OnPreValueChange(CompositeAttribute compositeAttribute, LFloat oldValue, LFloat newValue);
public delegate void OnPostValueChange(CompositeAttribute compositeAttribute, float oldValue, float newValue);
public delegate void OnPostValueChange(CompositeAttribute compositeAttribute, LFloat oldValue, LFloat newValue);
private OnPreValueChange _onPreValueChange;
private event OnPostValueChange _onPostValueChange;
@@ -55,12 +56,12 @@ namespace GAS.Runtime
/// <param name="maxValue">最大值</param>
public CompositeAttribute(
AttributeBase @base,
LFloat minValue,
LFloat maxValue,
AttributeBase baseAdditiveBonus = null,
AttributeBase additiveBonus = null,
AttributeBase multiplicativeBonus = null,
AttributeBase maxValuePenalty = null,
float minValue = float.MinValue,
float maxValue = float.MaxValue)
AttributeBase maxValuePenalty = null)
{
Base = @base;
BaseAdditiveBonus = baseAdditiveBonus;
@@ -94,23 +95,23 @@ namespace GAS.Runtime
MaxValuePenalty?.SetOwner(owner);
}
public void Init(float baseValue) => Base.Init(baseValue);
public void Init(LFloat baseValue) => Base.Init(baseValue);
public void SetBaseValue(float baseValue) => Base.SetBaseValue(baseValue);
public void SetBaseValue(LFloat baseValue) => Base.SetBaseValue(baseValue);
public void SetMinValue(float minValue)
public void SetMinValue(LFloat minValue)
{
MinValue = minValue;
Value = CalculateValue();
}
public void SetMaxValue(float maxValue)
public void SetMaxValue(LFloat maxValue)
{
MaxValue = maxValue;
Value = CalculateValue();
}
public void SetMinMaxValue(float minValue, float maxValue)
public void SetMinMaxValue(LFloat minValue, LFloat maxValue)
{
MinValue = minValue;
MaxValue = maxValue;
@@ -154,7 +155,7 @@ namespace GAS.Runtime
MaxValuePenalty?.UnregisterPostCurrentValueChange(OnAttributeChanged);
}
private void OnAttributeChanged(AttributeBase attribute, float attrOldValue, float attrNewValue)
private void OnAttributeChanged(AttributeBase attribute, LFloat attrOldValue, LFloat attrNewValue)
{
var oldValue = Value;
var newValue = CalculateValue();
@@ -174,12 +175,12 @@ namespace GAS.Runtime
_onPostValueChange?.Invoke(this, oldValue, newValue);
}
private float CalculateValue()
private LFloat CalculateValue()
{
return CalculateTotalValue(Base, BaseAdditiveBonus, AdditiveBonus, MultiplicativeBonus, MaxValuePenalty);
}
public static float CalculateTotalValue(
public static LFloat CalculateTotalValue(
AttributeBase @base,
AttributeBase baseAdditiveBonus = null,
AttributeBase additiveBonus = null,

View File

@@ -1,8 +1,10 @@
namespace GAS.Runtime
using JNGame.Math;
namespace GAS.Runtime
{
public struct CooldownTimer
{
public float TimeRemaining;
public float Duration;
public LFloat TimeRemaining;
public LFloat Duration;
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -38,7 +39,7 @@ namespace GAS.Runtime
public readonly string GameplayEffectName;
public readonly EffectsDurationPolicy DurationPolicy;
public readonly int Duration; // -1 represents infinite duration
public readonly float Period;
public readonly LFloat Period;
public readonly GameplayEffect PeriodExecution;
public readonly GameplayEffectTagContainer TagContainer;
@@ -71,7 +72,7 @@ namespace GAS.Runtime
public EntityRef<GameplayEffectSpec> CreateSpec(
AbilitySystemComponent creator,
AbilitySystemComponent owner,
float level = 1,
LFloat level,
object userData = null)
{
var spec = JexGasObjectPool.Instance.Fetch<GameplayEffectSpec>();

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -224,8 +225,8 @@ namespace GAS.Runtime
public CooldownTimer CheckCooldownFromTags(in GameplayTagSet tags)
{
float longestCooldown = 0;
float maxDuration = 0;
LFloat longestCooldown = 0;
LFloat maxDuration = 0;
// Check if the cooldown tag is granted to the player, and if so, capture the remaining duration for that tag
foreach (var spec in _gameplayEffectSpecs)

View File

@@ -1,4 +1,5 @@
using UnityEngine;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
{
@@ -6,7 +7,7 @@ namespace GAS.Runtime
{
public ulong InstanceId { get; private set; }
private float _periodRemaining;
private LFloat _periodRemaining;
private GameplayEffectSpec _spec;
public void Awake(GameplayEffectSpec spec)
@@ -23,7 +24,7 @@ namespace GAS.Runtime
_periodRemaining = default;
}
private float Period => _spec.GameplayEffect.Period;
private LFloat Period => _spec.GameplayEffect.Period;
public void Tick(int dt)
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using GAS.General;
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -10,8 +11,8 @@ namespace GAS.Runtime
/// </summary>
public sealed class GameplayEffectSpec : IEntity, IPool
{
private Dictionary<GameplayTag, float> _valueMapWithTag;
private Dictionary<string, float> _valueMapWithName;
private Dictionary<GameplayTag, LFloat> _valueMapWithTag;
private Dictionary<string, LFloat> _valueMapWithName;
private List<GameplayCueDurationalSpec> _cueDurationalSpecs;
public object UserData { get; set; }
@@ -131,7 +132,7 @@ namespace GAS.Runtime
JexGasObjectPool.Instance.Recycle(this);
}
public void Init(AbilitySystemComponent source, AbilitySystemComponent owner, float level = 1)
public void Init(AbilitySystemComponent source, AbilitySystemComponent owner, LFloat level)
{
Source = source;
Owner = owner;
@@ -140,7 +141,8 @@ namespace GAS.Runtime
{
if (GameplayEffect.PeriodExecution is not null)
{
PeriodExecution = GameplayEffect.PeriodExecution.CreateSpec(source, owner);
//TODO 不知道为什么没有传Level
PeriodExecution = GameplayEffect.PeriodExecution.CreateSpec(source, owner,1);
}
SetGrantedAbility(GameplayEffect.GrantedAbilities);
@@ -151,7 +153,7 @@ namespace GAS.Runtime
public GameplayEffect GameplayEffect { get; private set; }
public int ActivationTime { get; private set; }
public float Level { get; private set; }
public LFloat Level { get; private set; }
public AbilitySystemComponent Source { get; private set; }
public AbilitySystemComponent Owner { get; private set; }
public bool IsApplied { get; private set; }
@@ -165,23 +167,23 @@ namespace GAS.Runtime
public GameplayEffectStacking Stacking { get; private set; }
public GameplayEffectSnapshotPolicy SnapshotPolicy => GameplayEffect.SnapshotPolicy;
public Dictionary<string, float> SnapshotSourceAttributes { get; private set; }
public Dictionary<string, float> SnapshotTargetAttributes { get; private set; }
public Dictionary<string, LFloat> SnapshotSourceAttributes { get; private set; }
public Dictionary<string, LFloat> SnapshotTargetAttributes { get; private set; }
/// <summary>
/// 堆叠数
/// </summary>
public int StackCount { get; private set; } = 1;
public float DurationRemaining()
public LFloat DurationRemaining()
{
if (DurationPolicy == EffectsDurationPolicy.Infinite)
return -1;
return Mathf.Max(0, Duration - ActivationTime);
return LMath.Max(0, Duration - ActivationTime);
}
public void SetLevel(float level)
public void SetLevel(LFloat level)
{
Level = level;
}
@@ -487,7 +489,7 @@ namespace GAS.Runtime
{
case GameplayEffectSpecifiedSnapshotConfig.ESnapshotTarget.Source:
{
SnapshotSourceAttributes ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, float>>();
SnapshotSourceAttributes ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, LFloat>>();
var attribute = Source.AttributeSetContainer.GetAttributeAttributeValue(config.AttributeSetName, config.AttributeShortName);
if (attribute != null)
{
@@ -502,7 +504,7 @@ namespace GAS.Runtime
}
case GameplayEffectSpecifiedSnapshotConfig.ESnapshotTarget.Target:
{
SnapshotTargetAttributes ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, float>>();
SnapshotTargetAttributes ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, LFloat>>();
var attribute = Owner.AttributeSetContainer.GetAttributeAttributeValue(config.AttributeSetName, config.AttributeShortName);
if (attribute != null)
{
@@ -538,15 +540,15 @@ namespace GAS.Runtime
}
}
public void RegisterValue(in GameplayTag tag, float value)
public void RegisterValue(in GameplayTag tag, LFloat value)
{
_valueMapWithTag ??= JexGasObjectPool.Instance.Fetch<Dictionary<GameplayTag, float>>();
_valueMapWithTag ??= JexGasObjectPool.Instance.Fetch<Dictionary<GameplayTag, LFloat>>();
_valueMapWithTag[tag] = value;
}
public void RegisterValue(string name, float value)
public void RegisterValue(string name, LFloat value)
{
_valueMapWithName ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, float>>();
_valueMapWithName ??= JexGasObjectPool.Instance.Fetch<Dictionary<string, LFloat>>();
_valueMapWithName[name] = value;
}
@@ -562,16 +564,16 @@ namespace GAS.Runtime
return _valueMapWithName.Remove(name);
}
public float? GetMapValue(in GameplayTag tag)
public LFloat? GetMapValue(in GameplayTag tag)
{
if (_valueMapWithTag == null) return null;
return _valueMapWithTag.TryGetValue(tag, out var value) ? value : (float?)null;
return _valueMapWithTag.TryGetValue(tag, out var value) ? value : (LFloat?)null;
}
public float? GetMapValue(string name)
public LFloat? GetMapValue(string name)
{
if (_valueMapWithName == null) return null;
return _valueMapWithName.TryGetValue(name, out var value) ? value : (float?)null;
return _valueMapWithName.TryGetValue(name, out var value) ? value : (LFloat?)null;
}
private void TryActivateGrantedAbilities()
@@ -640,7 +642,7 @@ namespace GAS.Runtime
if (stackCount <= Stacking.limitCount)
{
// 更新栈数
StackCount = Mathf.Max(1, stackCount); // 最小层数为1
StackCount = LMath.Max(1, stackCount); // 最小层数为1
// 是否刷新Duration
if (Stacking.durationRefreshPolicy == DurationRefreshPolicy.RefreshOnSuccessfulApplication)
{

View File

@@ -1,3 +1,4 @@
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -19,11 +20,11 @@ namespace GAS.Runtime
[TabGroup("Default", "AttributeBasedModCalculation")]
[Title("堆叠幅值计算")]
[LabelText("系数(sK)")]
public float sK = 1;
public LFloat sK = 1;
[TabGroup("Default", "AttributeBasedModCalculation")]
[LabelText("常量(sB)")]
public float sB = 0;
public LFloat sB = 0;
[TabGroup("Default", "AttributeBasedModCalculation")]
[Title("最终结果")]
@@ -52,7 +53,7 @@ namespace GAS.Runtime
}
}
public override float CalculateMagnitude(GameplayEffectSpec spec, float modifierMagnitude)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat modifierMagnitude)
{
var attrMagnitude = base.CalculateMagnitude(spec, modifierMagnitude);

View File

@@ -52,7 +52,7 @@ namespace GAS.Runtime
[ReadOnly]
public string attributeShortName;
[InfoBox("计算逻辑与ScalableFloatModCalculation一致, 公式AttributeValue * k + b")]
[InfoBox("计算逻辑与ScalableLFloatModCalculation一致, 公式AttributeValue * k + b")]
[TabGroup("Default", "AttributeBasedModCalculation")]
[LabelText("系数(k)")]
public LFloat k = 1;
@@ -61,9 +61,9 @@ namespace GAS.Runtime
[LabelText("常量(b)")]
public LFloat b = 0;
public override float CalculateMagnitude(GameplayEffectSpec spec, float modifierMagnitude)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat modifierMagnitude)
{
float attributeValue;
LFloat attributeValue;
if (attributeFromType == AttributeFrom.Source)
{
if (captureType == GEAttributeCaptureType.SnapShot)

View File

@@ -1,4 +1,5 @@
using System;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -69,9 +70,9 @@ namespace GAS.Runtime
[LabelText("运算参数", SdfIconType.Activity)]
[LabelWidth(LABEL_WIDTH)]
[Tooltip("修改器的基础数值。这个数值如何使用由MMC的运行逻辑决定。\nMMC未指定时直接使用这个值。")]
[ValidateInput("@Operation != GEOperation.Divide || ModiferMagnitude != 0", "除数不能为零")]
// [ValidateInput("@Operation != GEOperation.Divide || ModiferMagnitude != 0", "除数不能为零")]
[PropertyOrder(3)]
public float ModiferMagnitude;
public LFloat ModiferMagnitude;
[LabelText("运算法则", SdfIconType.PlusSlashMinus)]
[LabelWidth(LABEL_WIDTH)]
@@ -95,7 +96,7 @@ namespace GAS.Runtime
public GameplayEffectModifier(
string attributeName,
float modiferMagnitude,
LFloat modiferMagnitude,
GEOperation operation,
ModifierMagnitudeCalculation mmc = null)
{
@@ -108,12 +109,12 @@ namespace GAS.Runtime
MMC = mmc;
}
public float CalculateMagnitude(GameplayEffectSpec spec, float modifierMagnitude)
public LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat modifierMagnitude)
{
return MMC == null ? ModiferMagnitude : MMC.CalculateMagnitude(spec, modifierMagnitude);
}
public void SetModiferMagnitude(float value)
public void SetModiferMagnitude(LFloat value)
{
ModiferMagnitude = value;
}

View File

@@ -1,5 +1,6 @@
using System.Linq;
using GAS.General;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -41,7 +42,7 @@ namespace GAS.Runtime
public string[] InheritanceChain => GetType().GetInheritanceChain().Reverse().ToArray();
#endif
public abstract float CalculateMagnitude(GameplayEffectSpec spec, float modifierMagnitude);
public abstract LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat modifierMagnitude);
#if UNITY_EDITOR
private void OnValidate()

View File

@@ -1,22 +1,23 @@
using Sirenix.OdinInspector;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
namespace GAS.Runtime
{
[CreateAssetMenu(fileName = "ScalableFloatModCalculation", menuName = "GAS/MMC/ScalableFloatModCalculation")]
public class ScalableFloatModCalculation : ModifierMagnitudeCalculation
[CreateAssetMenu(fileName = "ScalableLFloatModCalculation", menuName = "GAS/MMC/ScalableLFloatModCalculation")]
public class ScalableLFloatModCalculation : ModifierMagnitudeCalculation
{
private const string Desc = "计算公式ModifierMagnitude * k + b";
private const string Detail =
"ScalableFloatModCalculation可缩放浮点数计算\n该类型是根据Magnitude计算Modifier模值的计算公式为ModifierMagnitude * k + b 实际上就是一个线性函数k和b为可编辑参数可以在编辑器中设置。";
"ScalableLFloatModCalculation可缩放浮点数计算\n该类型是根据Magnitude计算Modifier模值的计算公式为ModifierMagnitude * k + b 实际上就是一个线性函数k和b为可编辑参数可以在编辑器中设置。";
[DetailedInfoBox(Desc, Detail, InfoMessageType.Info)] [SerializeField]
private float k = 1f;
private LFloat k = LFloat.L1;
[SerializeField] private float b = 0f;
[SerializeField] private LFloat b = LFloat.L0;
public override float CalculateMagnitude(GameplayEffectSpec spec, float input)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat input)
{
return input * k + b;
}

View File

@@ -1,3 +1,4 @@
using JNGame.Math;
using UnityEngine;
namespace GAS.Runtime
@@ -6,7 +7,7 @@ namespace GAS.Runtime
public class SetByCallerFromNameModCalculation : ModifierMagnitudeCalculation
{
[SerializeField] private string valueName;
public override float CalculateMagnitude(GameplayEffectSpec spec,float input)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec,LFloat input)
{
var value = spec.GetMapValue(valueName);
#if UNITY_EDITOR

View File

@@ -1,3 +1,4 @@
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -10,7 +11,7 @@ namespace GAS.Runtime
[ValueDropdown("@ValueDropdownHelper.GameplayTagChoices", HideChildProperties = true)]
private GameplayTag _tag;
public override float CalculateMagnitude(GameplayEffectSpec spec, float input)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat input)
{
var value = spec.GetMapValue(_tag);
#if UNITY_EDITOR

View File

@@ -1,4 +1,5 @@
using Sirenix.OdinInspector;
using JNGame.Math;
using Sirenix.OdinInspector;
using UnityEngine;
namespace GAS.Runtime
@@ -6,16 +7,16 @@ namespace GAS.Runtime
[CreateAssetMenu( fileName = "StackModCalculation", menuName = "GAS/MMC/StackModCalculation" )]
public class StackModCalculation:ModifierMagnitudeCalculation
{
[InfoBox("计算逻辑与ScalableFloatModCalculation一致, 公式:(StackCount) * k + b")]
[InfoBox("计算逻辑与ScalableLFloatModCalculation一致, 公式:(StackCount) * k + b")]
[TabGroup("Default", "StackModCalculation")]
[LabelText("系数(k)")]
public float k = 1;
public LFloat k = 1;
[TabGroup("Default", "StackModCalculation")]
[LabelText("常量(b)")]
public float b = 0;
public LFloat b = 0;
public override float CalculateMagnitude(GameplayEffectSpec spec, float modifierMagnitude)
public override LFloat CalculateMagnitude(GameplayEffectSpec spec, LFloat modifierMagnitude)
{
if (spec.Stacking.stackingType == StackingType.None) return 0;

View File

@@ -1,11 +1,12 @@
using System;
using JNGame.Math;
namespace GAS.Runtime
{
public class AttributeChangedEventArgs : EventArgs
{
public AttributeChangedEventArgs(AbilitySystemComponent owner, AttributeBase attribute, float oldValue,
float newValue)
public AttributeChangedEventArgs(AbilitySystemComponent owner, AttributeBase attribute, LFloat oldValue,
LFloat newValue)
{
Owner = owner;
Attribute = attribute;
@@ -15,13 +16,13 @@ namespace GAS.Runtime
public AbilitySystemComponent Owner { get; }
public AttributeBase Attribute { get; }
public float OldValue { get; }
public float NewValue { get; }
public LFloat OldValue { get; }
public LFloat NewValue { get; }
}
public class AttributeChangedEvent:EventBase<AttributeChangedEventArgs>
{
public void Publish(AbilitySystemComponent owner, AttributeBase attribute, float oldValue, float newValue)
public void Publish(AbilitySystemComponent owner, AttributeBase attribute, LFloat oldValue, LFloat newValue)
{
Publish(new AttributeChangedEventArgs(owner, attribute, oldValue, newValue));
}

View File

@@ -20,17 +20,17 @@ GameplayEffectModifier
AttributeNameAS_Fight.Health
ModifierMagnitude50
OperationAdd
MMCScalableFloatModCalculation -> k=-1,b=0 (下文会介绍ScalableFloatModCalculation的k,b含义)
MMCScalableLFloatModCalculation -> k=-1,b=0 (下文会介绍ScalableLFloatModCalculation的k,b含义)
```
## MMC的类型
MMC的基类为抽象类ModifierMagnitudeCalculation它的子类有以下几种
- ScalableFloatModCalculation可缩放浮点数计算
- ScalableLFloatModCalculation可缩放浮点数计算
- 该类型是根据ModifierMagnitude计算Modifier模值的计算公式为`ModifierMagnitude * k + b`
实际上就是一个线性函数k和b为可编辑参数可以在编辑器中设置。
- AttributeBasedModCalculation基于属性的计算
- 该类型是根据属性值计算Modifier模值的计算公式为`AttributeValue * k + b`
计算逻辑与ScalableFloatModCalculation一致。
计算逻辑与ScalableLFloatModCalculation一致。
- 重点在于属性值的来源确定属性值来源的参数有3个
- attributeFromType属性值从谁身上取是从游戏效果的来源创建者还是目标拥有者
- attributeName属性值的名称比如战斗属性集里的生命值AS_Fight.Health