This commit is contained in:
2026-10-08 07:57:37 +08:00
parent 3940299dbd
commit 95dbc287db
3 changed files with 121 additions and 46 deletions
@@ -32,9 +32,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 224064349272752296}
m_LocalEulerAnglesHint: {x: 0, y: -0, z: -0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 80, y: 66.5}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 314, y: 66.5}
m_SizeDelta: {x: 230, y: 133}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &222953972021046440
@@ -107,9 +107,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 224064349272752296}
m_LocalEulerAnglesHint: {x: 0, y: -0, z: -0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 234, y: 166}
m_SizeDelta: {x: 468, y: 332}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &222774089246940628
@@ -198,7 +198,7 @@ Canvas:
m_GameObject: {fileID: 1507404544299976}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 2
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
@@ -244,9 +244,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 224064349272752296}
m_LocalEulerAnglesHint: {x: 0, y: -0, z: -0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -75, y: -21.5}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 159, y: 144.5}
m_SizeDelta: {x: 313, y: 289}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &222588606521285762
@@ -1,4 +1,5 @@
using Assets.MyGame.Scripts.Net.APIResponses.Enum;
using DG.Tweening;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
@@ -108,6 +109,12 @@ public class XingJiXunHangEvent : BJRedPacketEvent
public GameObject textCritSelf;
[Tooltip("满屏暴击-他人(PW_Effect_TextCrit_Other_XingJiXunHang)")]
public GameObject textCritOther;
[Tooltip("暴击分数 TMP 所在子物体名(预制体里数字节点,默认 Text)")]
public string critTextNodeName = "Text";
[Tooltip("暴击图子物体名(预制体里\"暴击\"图,从 0 延时弹出,默认 Crit)")]
public string critNodeName = "Crit";
[Tooltip("暴击文字弹出后停留时长(秒),之后整体缩小消失(默认0.8)")]
public float critHoldDuration = 0.8f;
// ==================== 道具出场特效 ====================
@@ -400,6 +407,7 @@ public class XingJiXunHangEvent : BJRedPacketEvent
/// <summary>根据武器 ID 选择对应的预制体和标签</summary>
private void SelectWeaponPrefabs()
{
_weaponId = 6;
switch (_weaponId)
{
case 0:
@@ -1397,9 +1405,15 @@ public class XingJiXunHangEvent : BJRedPacketEvent
/// 自己看 TextCrit_Self,他人看 TextCrit_Other。
///
/// ⭐ 文字内容:预制体里写死的是占位 '123',必须由代码写入「爆奖小鱼死亡累加的面板分」
/// (<see cref="_bossPanelScore"/>,与奖励框上滚动的分同一个值,封顶 maxScore)。
/// ⭐ 层级:克隆体根上挂着嵌套 Canvas,美术里是无效层ID + order 5,
/// 会被 FullScreen 框(Default, order 12)压在下面 → 这里显式改成 Default + 更高 order。
/// (<see cref="_bossPanelScore"/>,与奖励框上滚动的分同一个值,封顶 maxScore),前缀 "+"。
/// ⭐ 两个预制体都自带 Canvas(RenderMode=WorldSpace,美术里是无效层ID + order 5),
/// 必须统一挂到游戏 UI 层、用 anchoredPosition 定位:
/// 自己 → 屏幕中心;他人 → 击杀者座位(座位世界坐标 → 画布坐标)。
/// (之前"他人"走 SpawnWorldEffect 挂到 bjEffectRoot(场景根、不在 Canvas 下),
/// 它的 WorldSpace 画布会按世界单位渲染 100×100 → 尺寸/位置全错。)
/// ⭐ 层级:预制体自带的是无效层ID + order 5,会被 FullScreen 框(Default, order 12)
/// 压在下面 → 这里显式改成 Default + 更高 order。
/// ⭐ 动画:对齐 lua CritTextEffect —— Text/Crit 从 0 弹出、停留后整体缩小消失并销毁。
/// </summary>
private void PlayTextCrit()
{
@@ -1410,35 +1424,49 @@ public class XingJiXunHangEvent : BJRedPacketEvent
return;
}
GameObject critObj;
if (isSelf)
{
// ⭐ 满屏暴击文字是 UI → 放 UI 中心,加入统一销毁列表
critObj = SpawnUiEffect(critPrefab);
Debug.Log("[XingJiXunHang] 播放满屏暴击(自己,UI中心)");
}
else
{
Vector3 critPos = GetSeatPosition() + Vector3.up * 2f;
critObj = SpawnWorldEffect(critPrefab, critPos);
if (critObj != null)
critObj.transform.localScale = Vector3.one * 0.6f;
Debug.Log($"[XingJiXunHang] 播放满屏暴击(他人) pos={critPos}");
}
// ⭐ 自己/他人统一挂 UI 层(同一个渲染空间),位置:自己=屏幕中心,他人=击杀者座位
GameObject critObj = SpawnUiEffect(critPrefab);
if (critObj == null)
{
Debug.LogWarning("[XingJiXunHang] 暴击文字生成失败,跳过分数写入");
return;
}
// ⭐ 写入分数:爆奖过程中小鱼死亡累加的面板分(_bossPanelScore)
// 该 TMP 的 spriteAsset 已配好「数字→图片」映射,直接赋数字即可
var critTmp = critObj.GetComponentInChildren<TMPro.TextMeshProUGUI>(true);
if (isSelf)
{
Debug.Log("[XingJiXunHang] 播放满屏暴击(自己,UI中心)");
}
else
{
// ⭐ 他人:座位世界坐标 → 画布 anchoredPosition(与其它 UI 飘字同一套换算)
var critRt = critObj.GetComponent<RectTransform>();
EnsureUiLayer();
if (critRt != null && _uiCanvas != null)
{
Vector3 seatPos = GetSeatPosition() + Vector3.up * 2f;
critRt.anchoredPosition =
CoordinateTransformation.WorldPos_ToCanvas(seatPos, _uiCanvas);
Debug.Log($"[XingJiXunHang] 播放满屏暴击(他人,UI层) seat={seatPos} anchored={critRt.anchoredPosition}");
}
else
{
Debug.LogWarning("[XingJiXunHang] 播放满屏暴击(他人):Canvas 缺失,退回 UI 中心");
}
}
// ⭐ 取分数 TMP:优先按名字找数字节点(lua 也是按名字取 Text),回退第一个 TMP
Transform textNode = string.IsNullOrEmpty(critTextNodeName)
? null
: FindChildRecursive(critObj.transform, critTextNodeName);
var critTmp = textNode != null
? textNode.GetComponent<TMPro.TextMeshProUGUI>()
: critObj.GetComponentInChildren<TMPro.TextMeshProUGUI>(true);
if (critTmp != null)
{
critTmp.text = _bossPanelScore.ToString();
Debug.Log($"[XingJiXunHang] 暴击文字分数 = {_bossPanelScore}(上限{maxScore})");
// lua: "+" .. num(该 TMP 的 spriteAsset 已配好「数字→图片」映射)
critTmp.text = "+" + _bossPanelScore;
Debug.Log($"[XingJiXunHang] 暴击文字分数 = +{_bossPanelScore}(上限{maxScore})");
if (_bossPanelScore <= 0)
Debug.LogWarning("[XingJiXunHang] 暴击文字分数为 0:本次没有小鱼死亡累加(面板分仍为 0)");
}
@@ -1447,7 +1475,7 @@ public class XingJiXunHangEvent : BJRedPacketEvent
Debug.LogWarning($"[XingJiXunHang] 暴击文字 {critObj.name} 上没找到 TMP,分数未写入");
}
// ⭐ 修层级:嵌套 Canvas → Default(0) + 高于 FullScreen(order 12),
// ⭐ 修层级:预制体自带 Canvas → Default(0) + 高于 FullScreen(order 12),
// 否则暴击文字会被全屏特效框挡住(美术里的 -559336389 在本项目 TagManager 里不存在)
var critCanvas = critObj.GetComponent<Canvas>();
if (critCanvas == null)
@@ -1463,6 +1491,50 @@ public class XingJiXunHangEvent : BJRedPacketEvent
{
Debug.LogWarning($"[XingJiXunHang] 暴击文字 {critObj.name} 上没找到 Canvas,层级未修正");
}
// ⭐ 弹出动画 + 定时消失(原版有,之前完全没做 → 静止挂在屏幕中央直到爆奖结束)
PlayCritAnim(critObj, textNode);
}
/// <summary>
/// 暴击文字弹出动画(对齐 lua CritTextEffect):
/// Text / Crit 从 scale 0 弹回原始 scale(OutElastic,Crit 延时 0.15s)
/// → 停留 critHoldDuration 秒 → 整体缩小到 0 并销毁。
/// ⭐ 弹回目标用"原始 scale":预制体里 Text 带美术缩放(如 1.727),直接弹到 1 会变小。
/// </summary>
private void PlayCritAnim(GameObject critObj, Transform textNode)
{
if (critObj == null) return;
if (textNode != null)
{
Vector3 target = textNode.localScale;
textNode.localScale = Vector3.zero;
textNode.DOScale(target, 0.3f).SetEase(Ease.OutElastic);
}
Transform critNode = string.IsNullOrEmpty(critNodeName)
? null
: FindChildRecursive(critObj.transform, critNodeName);
if (critNode != null)
{
Vector3 target = critNode.localScale;
critNode.localScale = Vector3.zero;
critNode.DOScale(target, 0.2f).SetEase(Ease.OutElastic).SetDelay(0.15f);
}
critObj.transform.DOScale(Vector3.zero, 0.2f)
.SetEase(Ease.InBack)
.SetDelay(Mathf.Max(0f, critHoldDuration))
.OnComplete(() =>
{
if (critObj != null)
{
// 已自行销毁 → 从统一销毁列表移除,避免 die() 时重复 Destroy
_spawnedEffects.Remove(critObj);
Destroy(critObj);
}
});
}
// ==================== 伽马风暴暴击框 ====================
@@ -45,31 +45,31 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
bjEndUI: {fileID: -382508373279050920, guid: 75a52b8c1537cad49b3d521483fe134e, type: 3}
useScorePanel: 0
tMP_Score: {fileID: 0}
scorePanelPrefab: {fileID: 0}
currScore: 0
maxScore: 0
scoreCount: 0
bjEndUIOffsetY: 150
posID: 0
paoBei: 0
fishScore: 0
bJbeishu: 0
maxScore: 0
isSelf: 0
isScoreEnd: 0
useScorePanel: 0
tMP_Score: {fileID: 0}
scorePanelPrefab: {fileID: 0}
currScore: 0
scoreCount: 0
bigPrizeFishMode: 0
showDelay: 3
moveDuration: 0.5
moveEase: 6
startOffset: {x: 0, y: 0, z: -100}
bjEndUIOffsetY: 150
coinFlyDuration: 0.5
coinArrivalInterval: 0.1
showAddScoreFX: 1
isSelf: 0
autoFinishOnScoreFull: 1
totalBJCount: 0
currBJCount: 0
isEffEnd: 0
isScoreStart: 0
isScoreEnd: 0
isGoldEffectStart: 0
settleFuJiaTianXia: {fileID: 4220318943093749188, guid: 75a52b8c1537cad49b3d521483fe134e,
type: 3}
@@ -112,6 +112,9 @@ MonoBehaviour:
type: 3}
textCritOther: {fileID: 5649031448262014505, guid: cf3fd14139494c118ebe448adaa39fe7,
type: 3}
critTextNodeName: Text
critNodeName: Crit
critHoldDuration: 0.8
appearPropEffect: {fileID: 1507404544299976, guid: aa6d30193550ca949a8a9098575de5e0,
type: 3}
tapTipName: tap_tip
@@ -120,7 +123,7 @@ MonoBehaviour:
ironFistHoleName: Hole
ironFistHandName: Hand
ironFistCornerOffset: {x: 15, y: 10, z: 0}
ironFistHoldDelay: 0.5
ironFistHoldDelay: 1
ironFistKillRadius: 100
ironFistKillLayer:
serializedVersion: 2