using Assets.Framework.Tool; using Assets.MyGame.Scripts.Net; using DG.Tweening; using UnityEngine; using UnityEngine.UI; /// /// 鱼死亡掉落道具脚本(与 CoinScript 同级,均继承 BJBase)。 /// 行为类似金币:原地掉落 → 飞向击杀者座位 → 回收。 /// 掉落数据由服务端 RoomKillNotice.drop 下发(propNumber/propName/count), /// 道具图标按 /uploads/{propNumber}.png 从服务端下载。 /// public class FishKillProp : BJBase { /// 道具图标(Inspector 绑定) public Image propIco; /// /// 重写基类方法:道具不显示金币数字,而是下载并设置道具图标。 /// 和 CoinScript.SetCoinCount() 对称,供外部统一调用。 /// public override void SetCoinCount() { // 修正 z 轴(和 CoinScript 一致,防止 UI 层级下 z 不为 0 导致被遮挡) var v3 = transform.position; v3.z = 0; transform.position = v3; } /// /// 初始化道具(扩展 BJBase.Init,增加道具编号)。 /// 由 CreateFishManager 在收到服务端掉落推送时调用。 /// /// 道具编号(用于下载图标 /uploads/编号.png) /// 掉落数量 /// 掉落起点(鱼死亡位置) /// 飞行终点(击杀者座位位置) /// 击杀者 ID /// 座位 ID /// 附加数据(透传,回调时原样返回) public void InitProp(string propNumber, int propCount, Vector3 startPoint, Vector3 endPoint, string userID = "", int sitID = 999, object jobj = null) { this.startPoint = startPoint; // 复用基类 Init 设置通用字段(道具不涉及金币数量,coinCount 传 0) Init(0, endPoint, userID, sitID, jobj); // 下载道具图标:固定格式 /uploads/{propNumber}.png DownloadPropIcon(propNumber); } /// /// 从服务端下载道具图标并设置到 propIco。 /// 失败时 propIco 保留预制体上配置好的默认图(不强制兜底重试)。 /// private void DownloadPropIcon(string propNumber) { if (string.IsNullOrEmpty(propNumber) || propIco == null) return; string url = APIManager.baseURL + "/uploads/" + propNumber + ".png"; WebTool.DownImage(url, tex => { // 回调时本物体可能已被销毁(飞到座位后回池/切场景),需判空 if (this == null || propIco == null) return; if (tex != null) { propIco.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.one * 0.5f); propIco.SetNativeSize(); propIco.gameObject.SetActive(true); } }); } /// /// 飞到座位位置并回收(效果同 coinEvent.HuiShou)。 /// 可由动画事件调用(预制体有掉落动画时),也可直接调用实现原地掉落后立即飞向座位。 /// public void FlyToSeat() { transform.DOMove(endPoint, 0.5f).OnComplete(() => { // 拾取回调(由 CreateFishManager 设置 JiaFen) JiaFen?.Invoke(0); // 拾取音效(复用金币拾取音效) AudioManager.Instance.PlayerFX(61009); // 池化回收 EffectPool.Instance.Return(gameObject); }); } }