This commit is contained in:
2026-08-19 14:45:43 +08:00
parent d495c0a1fb
commit dac32abdc4
45 changed files with 202 additions and 20 deletions
@@ -287,3 +287,5 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 1
@@ -94526,6 +94526,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 1000
bossName: "\u7206\u88C2\u91D1\u9CA8"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -5207,3 +5207,5 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 12
@@ -2627,6 +2627,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 13
--- !u!1 &1624971963216334
GameObject:
m_ObjectHideFlags: 0
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 0
sortOrder2D: 14
--- !u!1 &1044009816677565
GameObject:
m_ObjectHideFlags: 0
@@ -221,6 +221,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 15
--- !u!1 &1255429736181811
GameObject:
m_ObjectHideFlags: 0
@@ -325,6 +325,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 16
--- !u!1 &1884890488517839
GameObject:
m_ObjectHideFlags: 0
@@ -286,6 +286,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 17
--- !u!1 &1795071719860704
GameObject:
m_ObjectHideFlags: 0
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 18
--- !u!1 &1132027008156180
GameObject:
m_ObjectHideFlags: 0
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 19
--- !u!1 &1184502978110074
GameObject:
m_ObjectHideFlags: 0
@@ -131,6 +131,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 20
--- !u!1 &1725329062678283
GameObject:
m_ObjectHideFlags: 0
@@ -4870,6 +4870,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 21
--- !u!1 &1449117207360349
GameObject:
m_ObjectHideFlags: 0
@@ -2558,6 +2558,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 22
--- !u!1 &1691579565554018
GameObject:
m_ObjectHideFlags: 0
@@ -9974,6 +9974,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 23
bossName: "\u9ED1\u6D1E\u98DE\u8239"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 113
bossName: "\u5C0F\u4E11\u6251\u514B"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -98,6 +98,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 114
bossName: "\u5E78\u8FD0\u98DE\u789F"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -4807,6 +4807,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 115
bossName: "\u70C8\u7130\u98CE\u66B4"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -202,6 +202,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 2
--- !u!1 &1595304841115646
GameObject:
m_ObjectHideFlags: 0
@@ -307,6 +307,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 2000
bossName: "\u5973\u9F99\u738B"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 3
--- !u!1 &1336747816721637
GameObject:
m_ObjectHideFlags: 0
@@ -431,6 +431,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 3000
bossName: "\u673A\u68B0\u874E"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -5040,6 +5040,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 10
--- !u!1 &1846468676422031
GameObject:
m_ObjectHideFlags: 0
@@ -2455,6 +2455,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 11
--- !u!1 &1108378699968777
GameObject:
m_ObjectHideFlags: 0
@@ -202,6 +202,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 4
--- !u!1 &1479081812760233
GameObject:
m_ObjectHideFlags: 0
@@ -111076,6 +111076,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 116
bossName: "\u661F\u9645\u5DE1\u822A"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -202,6 +202,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 5
--- !u!1 &1870431410166554
GameObject:
m_ObjectHideFlags: 0
@@ -54311,7 +54311,9 @@ MonoBehaviour:
isRotate: 0
isNot1: 0
ischild0: 0
depthOffset: 0
depthOffset: -30
is2DFish: 0
sortOrder2D: 0
bossName: "\u7834\u574F\u7403"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -182,6 +182,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 6
--- !u!1 &1708309997000407
GameObject:
m_ObjectHideFlags: 0
@@ -173981,7 +173981,9 @@ MonoBehaviour:
isRotate: 0
isNot1: 0
ischild0: 0
depthOffset: 0
depthOffset: -50
is2DFish: 0
sortOrder2D: 0
bossName: "\u5E78\u8FD0\u8F6E"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -97,6 +97,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 7
--- !u!1 &1563192231362970
GameObject:
m_ObjectHideFlags: 0
@@ -287,3 +287,5 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 8
@@ -2600,6 +2600,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 9
--- !u!1 &1897836496076248
GameObject:
m_ObjectHideFlags: 0
@@ -354,6 +354,11 @@ public class MonsterContral : MonoBehaviour
_cachedChild = null;
}
// ⭐ 2D鱼:重置渲染器缓存(池回收后子层级可能变化)并重新应用sortingOrder层级
_cached2DRenderers = null;
_appliedSortOrder = int.MinValue;
Apply2DOrder();
// ⭐ 池回收的鱼(isInitialized=false)不立即 ChangeState(move),
// 避免 OnMoveUpdata 用旧 moveTime/moveLine 误触发 Id_DieFish_NotFX
// Init 调用后会设置 isInitialized=true 并 ChangeState(move)
@@ -788,6 +793,51 @@ public class MonsterContral : MonoBehaviour
}
public bool ischild0 = false;
public int depthOffset;
// ----------------------------------------------------------------
// ⭐ 2D层级(2D鱼用,与3D鱼的z轴depthOffset深度兼容并存)
// ----------------------------------------------------------------
[Header("2D层级(2D鱼)")]
[Tooltip("是否为2D渲染鱼:用sortingOrder控制层级(3D鱼继续用z轴depthOffset深度,互不影响)")]
public bool is2DFish = false;
[Tooltip("2D鱼的sortingOrder层级值,运行时可调 Set2DOrder(int) 修改")]
public int sortOrder2D = 0;
/// <summary>2D鱼渲染器缓存(设置sortingOrder用,OnEnable重建,避免重复GetComponentsInChildren)</summary>
private Renderer[] _cached2DRenderers;
/// <summary>已应用的sortingOrder值(值未变化时跳过重复设置)</summary>
private int _appliedSortOrder = int.MinValue;
/// <summary>
/// 设置2D层级(sortingOrder)。对鱼身上所有渲染器统一生效,
/// 多渲染器按层级顺序依次 +1 递增,保持鱼内部前后遮挡关系不变。
/// 仅 is2DFish=true 时生效;3D鱼仍走 z 轴 depthOffset,兼容现有逻辑。
/// </summary>
public void Set2DOrder(int order)
{
sortOrder2D = order;
Apply2DOrder();
}
/// <summary>应用sortingOrder到全部子渲染器(值相同则跳过)</summary>
private void Apply2DOrder()
{
if (!is2DFish) return;
if (_appliedSortOrder == sortOrder2D) return;
if (_cached2DRenderers == null)
_cached2DRenderers = GetComponentsInChildren<Renderer>(true);
_appliedSortOrder = sortOrder2D;
for (int i = 0; i < _cached2DRenderers.Length; i++)
{
var r = _cached2DRenderers[i];
if (r != null)
r.sortingOrder = sortOrder2D + i;
}
}
// ================================================================
// 动画
// ================================================================
@@ -238,6 +238,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 200
bossName: "\u7206\u88C2\u91D1\u9CA8"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -386,7 +386,9 @@ MonoBehaviour:
isRotate: 0
isNot1: 0
ischild0: 0
depthOffset: 0
depthOffset: -60
is2DFish: 0
sortOrder2D: 0
bossName: "\u5C0F\u4E11\u6251\u514B"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -133,6 +133,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 212
bossName: "\u9ED1\u6D1E\u98DE\u8239"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -2788,10 +2788,12 @@ MonoBehaviour:
createVideoClip: {fileID: 0}
rotationPY: 60
baseMmove: 0
isRotate: 1
isRotate: 0
isNot1: 0
ischild0: 0
depthOffset: 0
ischild0: 1
depthOffset: -70
is2DFish: 0
sortOrder2D: 0
bossName:
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -45,6 +45,12 @@ public class JiXieXieEvent : BJEventBase
[Tooltip("拆红包每份最少金币(默认 1,保证每张卡都有钱)")]
public long minPartAmount = 1;
[Tooltip("紫色卡保底倍数:至少一张紫卡,金额 = 炮倍 × 该值(默认300倍档)")]
public int purpleBaseBeishu = 300;
[Tooltip("拆红包集中度(1=全部均分,2=二倍均值法,默认1.4 更集中、分得不散)")]
public float splitConcentration = 1.4f;
[Tooltip("宝石在屏幕靠上位置出现的间隔(秒,越小越像同时出现)")]
public float gemAppearInterval = 0.03f;
@@ -187,18 +193,50 @@ public class JiXieXieEvent : BJEventBase
// ============================================================
/// <summary>
/// 八连抽只发金币:用【拆红包算法】把总金币(maxScore)随机拆成 chipCount 份,
/// 每份数量随机(二倍均值法),但 8 份之和恒等于 maxScore。
/// 机械蝎爆奖:至少一张紫色卡(保底倍数),其余红包随机。
/// 总金币(全部数据 maxScore)= 紫色保底金额 + 红包抽出来的金币数,总和恒等于 maxScore。
/// 紫色保底金额 = 炮倍 × purpleBaseBeishu(默认300倍档)。
/// 卡牌颜色分级【金币阈值 = 炮倍(paoBei) × 阈值倍数】:
/// num < 炮倍×100 → 绿;< 炮倍×200 → 蓝;< 炮倍×500 → 紫;≥ 炮倍×500 → 红(金色不用)
/// 每张卡 num 不同 → 颜色可能不同。
/// </summary>
private List<DropItemInfo> ParseDropInfos()
{
List<DropItemInfo> result = new List<DropItemInfo>();
// ⭐ 拆红包:随机拆成 chipCount 份,总和 == maxScore
long[] amounts = SplitRedPacket(maxScore, chipCount, minPartAmount);
// ⭐ 紫色保底:至少一张紫色卡,金额 = 炮倍 × 紫色保底倍数
long purpleBaseAmount = paoBei * (long)purpleBaseBeishu;
if (purpleBaseAmount < minPartAmount)
purpleBaseAmount = minPartAmount;
// 紫色卡放随机位置
int purpleIndex = Random.Range(0, chipCount);
long[] amounts = new long[chipCount];
if (maxScore > purpleBaseAmount)
{
// ⭐ 分成两部分:保底 + 红包
// 红包部分 = maxScore - 保底,拆成 chipCount 个红包(每张卡一个红包)
// ⭐ 集中度 splitConcentration 控制分布(更集中 → 蓝卡数量多、不散)
long rest = maxScore - purpleBaseAmount;
long[] redPackets = SplitRedPacket(rest, chipCount, minPartAmount, splitConcentration);
// ⭐ 紫卡分红 = 红包里金额最大的一份(晋级红色概率高一点)
int maxIdx = 0;
for (int i = 1; i < redPackets.Length; i++)
if (redPackets[i] > redPackets[maxIdx]) maxIdx = i;
for (int i = 0; i < chipCount; i++)
amounts[i] = redPackets[i];
// 紫卡 = 保底 + 最大红包;原紫卡红包换给 maxIdx 那张(总和守恒)
amounts[purpleIndex] = purpleBaseAmount + redPackets[maxIdx];
amounts[maxIdx] = redPackets[purpleIndex];
}
else
{
// 总金额不够紫色保底:全部给紫色那张
for (int i = 0; i < chipCount; i++)
amounts[i] = (i == purpleIndex) ? maxScore : 0;
}
// ⭐ 金币阈值 = 炮倍 × 阈值倍数(用户口径:100/200/300/500 倍档)
long greenMax = paoBei * (long)greenLimitBeishu; // 炮倍×100
@@ -212,7 +250,7 @@ public class JiXieXieEvent : BJEventBase
info.rewardID = 0; // 金币图(goodsSprites 里 ID=0 那张)
info.num = amounts[i];
// ⭐ 每张卡按自己的金币数量 × 阈值判定颜色(num 不同 → 颜色可不同)
// ⭐ 颜色按金额阈值分级:紫色保底卡金额 = 保底+红包分红,达到红卡阈值(≥炮倍×500)则晋级红色
info.cardColor = info.num < greenMax ? 1
: info.num < blueMax ? 2
: info.num < redMin ? 3
@@ -235,15 +273,16 @@ public class JiXieXieEvent : BJEventBase
_earnTotal = maxScore;
// ⭐ 日志打印每份金额 + 颜色,方便确认
Debug.Log($"[JiXieXie] 金币拆红包 {result.Count} 份: [{string.Join(",", amounts)}] 总={_earnTotal} paoBei={paoBei} 阈值={greenMax}/{blueMax}/{redMin}");
Debug.Log($"[JiXieXie] 金币拆红包(至少1紫){result.Count} 份: [{string.Join(",", amounts)}] 总={_earnTotal} 紫色保底={purpleBaseAmount}@{purpleIndex} paoBei={paoBei} 阈值={greenMax}/{blueMax}/{redMin}");
return result;
}
/// <summary>
/// 拆红包算法(二倍均值法):把 total 随机拆成 count 份,
/// 每份 ≥ min,所有份之和恒等于 total。
/// 拆红包算法:把 total 随机拆成 count 份,每份 ≥ min,所有份之和恒等于 total。
/// ⭐ concentration 集中度:1 = 全部均分(每份=均值);越大波动越大(2 = 原二倍均值法)。
/// 集中度小 → 金额贴近均值,颜色集中(蓝卡多、不散)。
/// </summary>
private long[] SplitRedPacket(long total, int count, long min)
private long[] SplitRedPacket(long total, int count, long min, float concentration = 2f)
{
if (count <= 0)
{
@@ -268,12 +307,20 @@ public class JiXieXieEvent : BJEventBase
return result;
}
float conc = concentration < 1f ? 1f : concentration;
long remain = total;
for (int i = 0; i < count - 1; i++)
{
int left = count - i; // 剩余份数
long max = (remain - (left - 1) * min) * 2 / left; // 二倍均值上限
long avg = remain / left; // 当前均值
// 原二倍均值上限(保证剩余够分):(remain - (left-1)*min) * 2 / left
long maxAvail = (remain - (left - 1) * min) * 2 / left;
// ⭐ 集中度上限:均值 × 集中度(1=完全均分,越大越散)
long max = (long)(avg * conc);
if (max > maxAvail) max = maxAvail;
if (max < min) max = min;
long span = max - min + 1;
// ⭐ 用 double 计算避免大金额时 float 精度不足导致数值相同/重复
long amt = min + (long)((double)Random.value * span); // [min, max] 随机
@@ -148,6 +148,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 220
bossName: "\u673A\u68B0\u874E"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -151,6 +151,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 221
bossName: "\u70C8\u7130\u98CE\u66B4"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -164,5 +166,4 @@ MonoBehaviour:
v3: {x: 0, y: 0, z: 0}
isLocalCoin: 0
killerSitPos: -1
secondDeathDelay: 1.5
firstDeathBjEndUI: {fileID: 0}
useServerParam: 1
@@ -318,6 +318,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 300
bossName: "\u7834\u574F\u7403"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -137,6 +137,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 225
bossName: "\u5C0F\u4E11\u6251\u514B"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -159,6 +159,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 250
bossName: "\u661F\u9645\u5DE1\u822A"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -140,6 +140,8 @@ MonoBehaviour:
isNot1: 0
ischild0: 0
depthOffset: 0
is2DFish: 1
sortOrder2D: 251
bossName: "\u5E78\u8FD0\u98DE\u789F"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -1342,7 +1342,9 @@ MonoBehaviour:
isRotate: 0
isNot1: 0
ischild0: 0
depthOffset: 0
depthOffset: -30
is2DFish: 0
sortOrder2D: 0
bossName: "\u5E78\u8FD0\u8F6E"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}