From 3d2d9d29a5ce766956abb44ceab3e445ce6ac0d9 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期二, 14 四月 2026 18:51:05 +0800
Subject: [PATCH] 602 坐骑优化-客户端

---
 Main/Config/Configs/HorseSkinConfig.cs                                                    |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs      |   14 
 Main/System/Horse/HorseCarouselView.cs.meta                                               |   11 
 Main/Config/ConfigManager.cs                                                              |    3 
 Main/System/Horse/HorseManager.cs                                                         |  206 ++++++++++
 Main/System/Horse/HorseItem.cs                                                            |   43 ++
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs               |   20 +
 Main/System/Horse/GetHorseWin.cs.meta                                                     |   11 
 Main/System/Horse/HorseSkinWin.cs                                                         |   26 
 Main/System/Guild/GuildBossWin.cs                                                         |    2 
 Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs                                     |   11 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta          |   11 
 Main/System/Horse/HorseSkinCell.cs                                                        |    2 
 Main/System/Main/HomeWin.cs                                                               |   17 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta           |   11 
 Main/System/Tip/ConfirmCancel.cs                                                          |    1 
 Main/System/Horse/HorseSuccessWin.cs                                                      |   74 +++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta |   11 
 Main/System/Horse/HorseCarouselView.cs                                                    |  229 ++++++++++++
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                      |    1 
 Main/Config/Configs/HorseIDConfig.cs.meta                                                 |   11 
 Main/Config/Configs/HorseIDConfig.cs                                                      |   53 ++
 Main/Config/PartialConfigs/HorseSkinConfig.cs                                             |    8 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs                |   19 +
 Main/System/Horse/GetHorseWin.cs                                                          |   38 ++
 Main/System/Horse/HorseWin.cs                                                             |  210 ++++++++++
 Main/System/Horse/HorseItem.cs.meta                                                       |   11 
 Main/System/Horse/HorseRankUPWin.cs                                                       |   56 ++
 28 files changed, 1,048 insertions(+), 73 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index d3cf7bd..9c732d4 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -79,6 +79,7 @@
             typeof(HeroQualityLVConfig),
             typeof(HeroSkinAttrConfig),
             typeof(HorseClassConfig),
+            typeof(HorseIDConfig),
             typeof(HorseSkinConfig),
             typeof(ItemCompoundConfig),
             typeof(ItemConfig),
@@ -350,6 +351,8 @@
         ClearConfigDictionary<HeroSkinAttrConfig>();
         // 娓呯┖ HorseClassConfig 瀛楀吀
         ClearConfigDictionary<HorseClassConfig>();
+        // 娓呯┖ HorseIDConfig 瀛楀吀
+        ClearConfigDictionary<HorseIDConfig>();
         // 娓呯┖ HorseSkinConfig 瀛楀吀
         ClearConfigDictionary<HorseSkinConfig>();
         // 娓呯┖ ItemCompoundConfig 瀛楀吀
diff --git a/Main/Config/Configs/HorseIDConfig.cs b/Main/Config/Configs/HorseIDConfig.cs
new file mode 100644
index 0000000..0b55719
--- /dev/null
+++ b/Main/Config/Configs/HorseIDConfig.cs
@@ -0,0 +1,53 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Monday, April 13, 2026
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class HorseIDConfig : ConfigBase<int, HorseIDConfig>
+{
+    static HorseIDConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int HorseID;
+	public int UnlockWay;
+	public int UnlockValue;
+	public int UnlockNeedCnt;
+	public int AttrID;
+	public float AttrMultiValue;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out HorseID); 
+
+			int.TryParse(tables[1],out UnlockWay); 
+
+			int.TryParse(tables[2],out UnlockValue); 
+
+			int.TryParse(tables[3],out UnlockNeedCnt); 
+
+			int.TryParse(tables[4],out AttrID); 
+
+			float.TryParse(tables[5],out AttrMultiValue); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/HorseIDConfig.cs.meta b/Main/Config/Configs/HorseIDConfig.cs.meta
new file mode 100644
index 0000000..e033c49
--- /dev/null
+++ b/Main/Config/Configs/HorseIDConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d3c2fe448c55f7c4a82cd8dc635934d6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/HorseSkinConfig.cs b/Main/Config/Configs/HorseSkinConfig.cs
index b2bfe44..07f4660 100644
--- a/Main/Config/Configs/HorseSkinConfig.cs
+++ b/Main/Config/Configs/HorseSkinConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�11鏈�23鏃�
+//    [  Date ]:           Monday, April 13, 2026
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -31,6 +31,9 @@
 	public int[] Poses;
 	public int heroFirst;
 	public string getWay;
+	public string Icon;
+	public int showType;
+	public int sortOrder;
 
     public override int LoadKey(string _key)
     {
@@ -119,6 +122,12 @@
 			int.TryParse(tables[13],out heroFirst); 
 
 			getWay = tables[14];
+
+			Icon = tables[15];
+
+			int.TryParse(tables[16],out showType); 
+
+			int.TryParse(tables[17],out sortOrder); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/PartialConfigs/HorseSkinConfig.cs b/Main/Config/PartialConfigs/HorseSkinConfig.cs
index 216784e..a4ffee8 100644
--- a/Main/Config/PartialConfigs/HorseSkinConfig.cs
+++ b/Main/Config/PartialConfigs/HorseSkinConfig.cs
@@ -2,6 +2,8 @@
 public partial class HorseSkinConfig : ConfigBase<int, HorseSkinConfig>
 {
     public static List<int> itemsList = new List<int>(); //鐨偆閬撳叿瑙i攣/鍗囨槦
+    //鍧愰獞ID,鐨偆ID
+    public static Dictionary<int, int> horseIDTohorseSkinIDDict = new();
     protected override void OnConfigParseCompleted()
     {
 
@@ -13,7 +15,11 @@
             }
         }
 
+        if (UnlockWay == 3)
+        {
+            horseIDTohorseSkinIDDict[UnlockValue] = SkinID;
+        }
     }
 
-   
+
 }
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs
new file mode 100644
index 0000000..8aa87d6
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 04 鍧愰獞ID鎿嶄綔 #tagCSHorseIDOP
+
+public class CB204_tagCSHorseIDOP : GameNetPackBasic {
+    public byte OPType;    // 鎿嶄綔 1-婵�娲伙紱2-浣╂埓锛�
+    public byte HorseID;
+
+    public CB204_tagCSHorseIDOP () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB204;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (OPType, NetDataType.BYTE);
+        WriteBytes (HorseID, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta
new file mode 100644
index 0000000..fe8b561
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 89a08c975b158c54eac484cba180a62b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs
new file mode 100644
index 0000000..717442d
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 05 鍧愰獞ID淇℃伅 #tagSCHorseIDInfo
+
+public class DTCA305_tagSCHorseIDInfo : DtcBasic
+{
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA305_tagSCHorseIDInfo vNetData = vNetPack as HA305_tagSCHorseIDInfo;
+        HorseManager.Instance.UpdateHorseIDInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta
new file mode 100644
index 0000000..2eaa2a8
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 24c3deaa0b65c2f45a4f0d7a0cfda6ee
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 13e25bb..2fdaf6a 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -162,6 +162,7 @@
         Register(typeof(HA924_tagSCQunyingMatchList), typeof(DTCA924_tagSCQunyingMatchList));
         Register(typeof(HA925_tagSCQunyingPlayerInfo), typeof(DTCA925_tagSCQunyingPlayerInfo));
         Register(typeof(HC010_tagSCCrossZoneInfo), typeof(DTCC010_tagSCCrossZoneInfo));
+        Register(typeof(HA305_tagSCHorseIDInfo), typeof(DTCA305_tagSCHorseIDInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs
new file mode 100644
index 0000000..7446554
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 05 鍧愰獞ID淇℃伅 #tagSCHorseIDInfo
+
+public class HA305_tagSCHorseIDInfo : GameNetPackBasic {
+    public uint HorseIDState;    // 鍧愰獞ID瑙i攣鐘舵�侊紝鎸変簩杩涘埗浣嶈繍绠楀垽鏂潗楠慖D鏄惁宸茶В閿�
+    public byte HorseID;    // 褰撳墠浣╂埓鐨勫潗楠慖D
+
+    public HA305_tagSCHorseIDInfo () {
+        _cmd = (ushort)0xA305;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out HorseIDState, vBytes, NetDataType.DWORD);
+        TransBytes (out HorseID, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta
new file mode 100644
index 0000000..d21f5a6
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 38ac993795b713545bc24a1fce151d67
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildBossWin.cs b/Main/System/Guild/GuildBossWin.cs
index 7c57f73..e8d0f75 100644
--- a/Main/System/Guild/GuildBossWin.cs
+++ b/Main/System/Guild/GuildBossWin.cs
@@ -525,7 +525,7 @@
 
     void InitAttack()
     {
-        var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(false));
+        var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
         heroModel.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID(), 1.2f);
         heroModel.GetHero().SetSpeed(heroAtkSpeed);
         for (int i = 0; i < hurtValues.Length; i++)
diff --git a/Main/System/Horse/GetHorseWin.cs b/Main/System/Horse/GetHorseWin.cs
new file mode 100644
index 0000000..2ee5b2f
--- /dev/null
+++ b/Main/System/Horse/GetHorseWin.cs
@@ -0,0 +1,38 @@
+using System;
+using UnityEngine;
+
+public class GetHorseWin : UIBase
+{
+    [SerializeField] ImageEx iconImg;
+    [SerializeField] TextEx nameTxt;
+    [SerializeField] TextEx attrTxt;
+    [SerializeField] ButtonEx okBtn;
+
+    protected override void InitComponent()
+    {
+        okBtn.AddListener(CloseWindow);
+    }
+
+    protected override void OnPreOpen()
+    {
+        int horseID = HorseManager.Instance.unLockHorseID;
+        int skinID = HorseManager.Instance.unLockSkinID;
+
+        var horseIDConfig = HorseIDConfig.Get(horseID);
+        if (horseIDConfig == null)
+            return;
+
+        var horseSkinConfig = HorseSkinConfig.Get(skinID);
+        if (horseSkinConfig == null)
+            return;
+
+        nameTxt.text = horseSkinConfig.Name;
+        iconImg.overrideSprite = UILoader.LoadSprite("HorseIcon", horseSkinConfig.Icon);
+        iconImg.SetNativeSize();
+
+        attrTxt.text = StringUtility.Concat(PlayerPropertyConfig.Get(horseIDConfig.AttrID).ShowName, " ", "+", PlayerPropertyConfig.GetValueDescription(horseIDConfig.AttrID, HorseManager.Instance.GetNowAttrValue(horseIDConfig.AttrID)));
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/Horse/GetHorseWin.cs.meta b/Main/System/Horse/GetHorseWin.cs.meta
new file mode 100644
index 0000000..cba1bb8
--- /dev/null
+++ b/Main/System/Horse/GetHorseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3a845cc8515c95b4bafd63b59c6d7a0e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Horse/HorseCarouselView.cs b/Main/System/Horse/HorseCarouselView.cs
new file mode 100644
index 0000000..ef0914e
--- /dev/null
+++ b/Main/System/Horse/HorseCarouselView.cs
@@ -0,0 +1,229 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.Events;
+using UnityEngine.UI;
+using System;
+using System.Linq;
+
+public class HorseCarouselView : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler
+{
+    /// 褰撳墠閫変腑绱㈠紩鍙樺寲鏃惰Е鍙�
+    public event Action OnSelectedIndexChanged;
+
+    [Header("UI References")]
+    public RectTransform content;          // 瀛樻斁Item鐨勭埗鑺傜偣
+    public GameObject horseItemPrefab;     // 鍧愰獞Item棰勫埗浣�
+
+    [Header("Carousel Settings")]
+    List<HorseIDConfig> horseConfigs;  // 鍧愰獞閰嶇疆鍒楄〃
+    public float itemSpacing = 150f;       // 姣忎釜鍧愰獞鐨勯棿璺�
+    public float scaleMax = 1.3f;          // 灞呬腑鏃剁殑鏈�澶х缉鏀�
+    public float scaleMin = 0.8f;          // 杈圭紭鏃剁殑鏈�灏忕缉鏀�
+
+    private List<HorseItem> items = new List<HorseItem>();
+
+    // 褰撳墠閫昏緫涓績鐨勫亸绉婚噺 (娴偣鏁帮紝鐢ㄤ簬骞虫粦婊戝姩)
+    private float currentCenterOffset = 0f;
+    private float targetCenterOffset = 0f;
+
+    private bool isDragging = false;
+    private int currentSelectedIndex = 0;
+
+    /// <summary>
+    /// 褰撳墠閫変腑鐨勫潗楠慖D
+    /// </summary>
+    public int CurrentHorseId
+    {
+        get
+        {
+            if (horseConfigs != null && horseConfigs.Count > 0 && currentSelectedIndex >= 0)
+            {
+                int realIndex = (currentSelectedIndex % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+                return horseConfigs[realIndex].HorseID;
+            }
+            return 0;
+        }
+    }
+
+    void Start()
+    {
+        // 鍒濆鍖栨睜瀛愶細涓轰簡淇濊瘉宸﹀彸婊戝姩涓嶇┛甯紝瑙嗛噹鍐呮樉绀�5涓紝姹犲瓙鍙互寤�7涓� (5 + 宸﹀彸鍚勫1涓紦鍐�)
+        int poolSize = 7;
+        for (int i = 0; i < poolSize; i++)
+        {
+            GameObject go = Instantiate(horseItemPrefab, content);
+            HorseItem item = go.GetComponent<HorseItem>();
+            items.Add(item);
+        }
+        // 鍔ㄦ�佽幏鍙栨墍鏈夊潗楠戦厤缃�
+        horseConfigs = HorseIDConfig.GetValues();
+        // 鎸塇orseSkinConfig鐨剆ortOrder鍜孲kinID鎺掑簭
+        horseConfigs = horseConfigs.OrderBy(c =>
+        {
+            int skinID = HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var id) ? id : int.MaxValue;
+            var skinConfig = HorseSkinConfig.Get(skinID);
+            return skinConfig?.sortOrder ?? int.MaxValue;
+        }).ThenBy(c =>
+        {
+            return HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var skinID) ? skinID : int.MaxValue;
+        }).ToList();
+        
+        // 鑾峰彇褰撳墠楠戜箻鍧愰獞鐨勭储寮�
+        int currentHorseID = HorseManager.Instance.horseID;
+        int index = horseConfigs.FindIndex(c => c.HorseID == currentHorseID);
+        InitWithHorse(index >= 0 ? index : 0);
+    }
+
+    // 鐣岄潰鎵撳紑鏃惰皟鐢紝浼犲叆褰撳墠楠戜箻鐨勫潗楠慖D鎴栧簭鍙�
+    public void InitWithHorse(int horseIndex)
+    {
+        currentSelectedIndex = horseIndex;
+        currentCenterOffset = horseIndex;
+        targetCenterOffset = horseIndex;
+        UpdateItems();
+    }
+
+    // 鐐瑰嚮閫変腑鎸囧畾绱㈠紩鐨勫潗楠�
+    public void SelectIndex(int index)
+    {
+        int oldIndex = currentSelectedIndex;
+        currentSelectedIndex = index;
+        targetCenterOffset = index;
+        currentCenterOffset = index;
+        UpdateItems();
+
+        if (oldIndex != currentSelectedIndex)
+        {
+            OnSelectedIndexChanged?.Invoke();
+        }
+    }
+
+    /// <summary>
+    /// 鍒囨崲鍒颁笂涓�涓潗楠�
+    /// </summary>
+    public void SelectPrevious()
+    {
+        int newIndex = (currentSelectedIndex - 1 + horseConfigs.Count) % horseConfigs.Count;
+        SelectIndex(newIndex);
+    }
+
+    /// <summary>
+    /// 鍒囨崲鍒颁笅涓�涓潗楠�
+    /// </summary>
+    public void SelectNext()
+    {
+        int newIndex = (currentSelectedIndex + 1) % horseConfigs.Count;
+        SelectIndex(newIndex);
+    }
+
+    /// <summary>
+    /// 鍒锋柊鎵�鏈塇orseItem鐨勬樉绀猴紙澶栭儴璋冪敤鎺ュ彛锛�
+    /// </summary>
+    public void RefreshAllItems()
+    {
+        if (horseConfigs != null && horseConfigs.Count > 0)
+        {
+            UpdateItems();
+        }
+    }
+
+    void Update()
+    {
+        // 娌″湪鎷栨嫿鏃讹紝骞虫粦鍚搁檮鍒扮洰鏍囦綅缃�
+        if (!isDragging && Mathf.Abs(currentCenterOffset - targetCenterOffset) > 0.001f)
+        {
+            currentCenterOffset = Mathf.Lerp(currentCenterOffset, targetCenterOffset, Time.deltaTime * 10f);
+            UpdateItems();
+        }
+    }
+
+    // 鏍稿績鍒锋柊閫昏緫
+    private void UpdateItems()
+    {
+        int poolSize = items.Count;
+        // 璁$畻褰撳墠涓績浣嶇疆宸︿晶搴旇浠庡摢涓亸绉婚噺寮�濮嬫覆鏌�
+        int startOffset = Mathf.FloorToInt(currentCenterOffset) - (poolSize / 2);
+
+        for (int i = 0; i < poolSize; i++)
+        {
+            // 1. 璁$畻閫昏緫绱㈠紩 (鍖呭惈璐熸暟鎯呭喌)
+            int logicIndex = startOffset + i;
+
+            // 2. 灏嗛�昏緫绱㈠紩鏄犲皠鍒板疄闄呯殑鍧愰獞搴忓彿 (鏍稿績锛氬疄鐜伴灏剧浉杩炵殑鏃犻檺寰幆)
+            // 姣斿 horseConfigs.Count=10锛屽綋 logicIndex=-1鏃讹紝realIndex=9 (鏈綅)
+            int realIndex = (logicIndex % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+
+            // 3. 璁$畻璇� Item 搴旇鍦ㄧ殑 X 鍧愭爣浣嶇疆
+            // logicIndex - currentCenterOffset 琛ㄧず璇� item 璺濈涓績鐨勯�昏緫璺濈
+            float distanceToCenter = logicIndex - currentCenterOffset;
+            float posX = distanceToCenter * itemSpacing;
+
+            // 4. 鏇存柊 UI 鏄剧ず
+            HorseItem itemUI = items[i];
+            itemUI.rectTransform.anchoredPosition = new Vector2(posX, 0);
+
+            // 5. 璁$畻缂╂斁涓庨�変腑鐘舵�� (鏍规嵁璺濈涓績鐨勭粷瀵硅窛绂�)
+            float absDist = Mathf.Abs(distanceToCenter);
+            // 璺濈灏忎簬1鏃跺紑濮嬫斁澶э紝澶т簬绛変簬1鏃朵负鏈�灏忕缉鏀�
+            float scaleProgress = Mathf.Clamp01(1f - absDist);
+            float currentScale = Mathf.Lerp(scaleMin, scaleMax, scaleProgress);
+            itemUI.rectTransform.localScale = Vector3.one * currentScale;
+
+            // 6. 鏁版嵁涓庤〃鐜版洿鏂� (鍒锋柊澶村儚銆佸悕瀛楃瓑)
+            itemUI.UpdateData(horseConfigs[realIndex], realIndex);
+            itemUI.onItemClick = SelectIndex;
+        }
+    }
+
+    #region 鎷栨嫿涓庡惛闄勯�昏緫
+
+    public void OnBeginDrag(PointerEventData eventData)
+    {
+        isDragging = true;
+    }
+
+    public void OnDrag(PointerEventData eventData)
+    {
+        // 灏嗛紶鏍�/鎵嬫寚鐨勬粦鍔ㄥ儚绱犺浆鍖栦负閫昏緫鍋忕Щ閲�
+        float dragDeltaX = eventData.delta.x;
+        // 闃诲凹绯绘暟锛屾帶鍒舵粦鍔ㄩ�熷害
+        currentCenterOffset -= dragDeltaX / itemSpacing;
+        UpdateItems();
+    }
+
+    public void OnEndDrag(PointerEventData eventData)
+    {
+        isDragging = false;
+
+        // 鏉炬墜鏃讹紝璁$畻搴旇鍚搁檮鍒板摢涓�涓暣鏁扮储寮�
+        // 鍔犲叆鎯�у垽鏂細濡傛灉婊戝姩閫熷害澶熷揩锛岀洿鎺ヨ繘涓�浣嶆垨閫�涓�浣�
+        float speedX = eventData.delta.x;
+        if (speedX > 5f)
+        {
+            targetCenterOffset = Mathf.Floor(currentCenterOffset);
+        }
+        else if (speedX < -5f)
+        {
+            targetCenterOffset = Mathf.Ceil(currentCenterOffset);
+        }
+        else
+        {
+            // 鍚﹀垯灏辫繎鍥涜垗浜斿叆鍚搁檮
+            targetCenterOffset = Mathf.Round(currentCenterOffset);
+        }
+
+        // 鏇存柊鏈�缁堥�変腑鐨勭湡瀹炵储寮�
+        int oldIndex = currentSelectedIndex;
+        currentSelectedIndex = (Mathf.RoundToInt(targetCenterOffset) % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+
+        if (oldIndex != currentSelectedIndex)
+        {
+            OnSelectedIndexChanged?.Invoke();
+        }
+
+        Debug.Log("褰撳墠閫変腑鍧愰獞搴忓彿: " + currentSelectedIndex);
+    }
+
+    #endregion
+}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseCarouselView.cs.meta b/Main/System/Horse/HorseCarouselView.cs.meta
new file mode 100644
index 0000000..5fbc2e6
--- /dev/null
+++ b/Main/System/Horse/HorseCarouselView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b1022553a62dd7d47afae33bd87625e3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Horse/HorseItem.cs b/Main/System/Horse/HorseItem.cs
new file mode 100644
index 0000000..7aa429e
--- /dev/null
+++ b/Main/System/Horse/HorseItem.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class HorseItem : MonoBehaviour
+{
+    public RectTransform rectTransform;
+    public Image iconImg;
+    public Image attrNameBg;
+    public TextEx attrName;
+    public Image lockImg;
+    public TextEx useTxt;
+    public ButtonEx clickBtn;
+
+    // 鐐瑰嚮鍥炶皟锛屼紶閫掕Item瀵瑰簲鐨剅ealIndex
+    public System.Action<int> onItemClick;
+    public int realIndex;
+
+    // 鍒锋柊鏁版嵁
+    public void UpdateData(HorseIDConfig config, int index)
+    {
+        if (config == null)
+            return;
+        if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(config.HorseID, out int skinID))
+            return;
+        var horseSkinConfig = HorseSkinConfig.Get(skinID);
+        if (horseSkinConfig == null)
+            return;
+
+        iconImg.overrideSprite = UILoader.LoadSprite("HorseIcon", horseSkinConfig.Icon);
+        iconImg.SetNativeSize();
+
+        bool hasArrtId = PlayerPropertyConfig.HasKey(config.AttrID);
+        attrNameBg.SetActive(hasArrtId);
+        attrName.text = hasArrtId ? PlayerPropertyConfig.Get(config.AttrID).Name : string.Empty;
+
+        lockImg.SetActive(!HorseManager.Instance.IsHorseUnlocked(config.HorseID));
+        useTxt.SetActive(config.HorseID == HorseManager.Instance.horseID);
+
+        realIndex = index;
+        clickBtn.onClick.RemoveAllListeners();
+        clickBtn.onClick.AddListener(() => onItemClick?.Invoke(realIndex));
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseItem.cs.meta b/Main/System/Horse/HorseItem.cs.meta
new file mode 100644
index 0000000..4219927
--- /dev/null
+++ b/Main/System/Horse/HorseItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e7860cf1649b57e479b5a50f0058a8c8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Horse/HorseManager.cs b/Main/System/Horse/HorseManager.cs
index 73ac403..b4b60d4 100644
--- a/Main/System/Horse/HorseManager.cs
+++ b/Main/System/Horse/HorseManager.cs
@@ -1,11 +1,13 @@
 using System;
-using LitJson;
-
 using System.Collections.Generic;
 using System.Linq;
 
 public class HorseManager : GameSystemManager<HorseManager>
 {
+
+    public int unLockSkinID;
+    public int unLockHorseID;
+
     public int classLV;    //褰撳墠闃剁骇锛屼粠0寮�濮�
     public int horseLV;    //褰撳墠闃剁瓑绾э紝浠�1寮�濮�
     public int exp;    //褰撳墠闃剁瓑绾х粡楠岋紝姣忕骇浠�0寮�濮�
@@ -35,6 +37,8 @@
     public int lvUPItemID;
     public int rankUPItemID;
     public int quickRankLV;
+    public int defaultSkinID;
+
 
     public override void Init()
     {
@@ -52,12 +56,15 @@
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
     }
 
+
+
     void ParseConfig()
     {
         var config = FuncConfigConfig.Get("HorseUpItem");
         lvUPItemID = int.Parse(config.Numerical1);
         rankUPItemID = int.Parse(config.Numerical2);
         quickRankLV = int.Parse(config.Numerical3);
+        defaultSkinID = int.Parse(config.Numerical4);
     }
 
     void OnBeforePlayerDataInitialize()
@@ -66,6 +73,8 @@
         horseLV = 0;
         exp = 0;
         skinDic.Clear();
+        horseIDState = 0;
+        horseID = 0;
     }
 
     void OnPlayerLoginOk()
@@ -90,14 +99,15 @@
     }
 
     //鑾峰彇褰撳墠浣跨敤鍧愰獞鐨偆ID
-    public int GetUsingHorseSkinID(bool useDefault = false)
+    public int GetUsingHorseSkinID(bool useDefault = true)
     {
         var id = (int)PlayerDatas.Instance.baseData.equipShowSwitch % 1000;
-        if (id == 0)
+        // 0 鏈够鍖�
+        if (id == 0 || !HorseSkinConfig.HasKey(id))
         {
             if (useDefault)
             {
-                return 1;
+                return defaultSkinID;
             }
         }
         return id;
@@ -106,9 +116,29 @@
     //鑾峰彇鍏朵粬鐜╁浣跨敤鍧愰獞鐨偆ID
     public int GetOtherPlayerHorseSkinID(int value)
     {
-        return value % 1000;
+        int id = value % 1000;
+        if (id == 0 || !HorseSkinConfig.HasKey(id))
+            return defaultSkinID;
+        return id;
     }
 
+    //鏄惁澶勪簬骞诲寲鐘舵��
+    public bool IsChangeState(int skinID)
+    {
+        if (skinID == 0) return false;
+        if (!HorseSkinConfig.HasKey(skinID)) return false;
+
+        var config = HorseSkinConfig.Get(skinID);
+        if (config == null) return false;
+        return config.showType == 1;
+    }
+
+    public bool IsHorseIDSkin(int skinID)
+    {
+        var config = HorseSkinConfig.Get(skinID);
+        if (config == null) return false;
+        return config.showType == 2;
+    }
 
     public void UpdateHorseInfo(HA303_tagSCHorseClassInfo netPack)
     {
@@ -153,6 +183,87 @@
             UIManager.Instance.OpenWindow<HorseSkinGetWin>(netPack.HorseSkinList[0].HorseSkinID);
         }
 
+    }
+    public void SendHorseIDOP(int horseID, int opType)
+    {
+        CB204_tagCSHorseIDOP pack = new CB204_tagCSHorseIDOP()
+        {
+            HorseID = (byte)horseID,
+            OPType = (byte)opType
+        };
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    //鍧愰獞ID淇℃伅
+    public uint horseIDState;
+    public int horseID;
+    public event Action OnUpdateHorseIDInfoEvent;
+    /// <summary>鏂拌В閿佸潗楠戜簨浠讹紝鍙傛暟锛氭柊瑙i攣鐨勫潗楠慖D (0-31)</summary>
+    public event Action<int> OnHorseUnlockedEvent;
+    /// <summary>浣╂埓鍧愰獞鍙樺寲浜嬩欢锛屽弬鏁帮細(鏃D, 鏂癐D)</summary>
+    public event Action<int, int> OnHorseChangedEvent;
+    public void UpdateHorseIDInfo(HA305_tagSCHorseIDInfo netPack)
+    {
+        // 1. 妫�娴嬫柊瑙i攣鐨勫潗楠� (horseID 浠� 0 寮�濮�)
+        uint diff = horseIDState ^ netPack.HorseIDState; // 宸紓浣�
+        uint newUnlock = netPack.HorseIDState & diff;       // 鏂板瑙i攣鐨勪綅
+
+        if (newUnlock != 0)
+        {
+            for (int i = 0; i < 32; i++)
+            {
+                if ((newUnlock & (1u << i)) != 0)
+                {
+                    OnHorseUnlockedEvent?.Invoke(i); // i 灏辨槸鍧愰獞ID (0-31)
+                }
+            }
+        }
+
+        // 2. 妫�娴嬩僵鎴碔D鍙樺寲
+        if (horseID != netPack.HorseID)
+        {
+            byte oldID = (byte)horseID;
+            horseID = netPack.HorseID;
+            OnHorseChangedEvent?.Invoke(oldID, horseID);
+        }
+
+        // 鏇存柊鐘舵��
+        horseIDState = netPack.HorseIDState;
+        RefreshAttr();
+        OnUpdateHorseIDInfoEvent?.Invoke();
+    }
+
+    /// <summary>
+    /// 鍒ゆ柇鍧愰獞ID鏄惁宸茶В閿� (horseID 浠� 0 寮�濮�)
+    /// </summary>
+    /// <param name="horseID">鍧愰獞ID (0-31)</param>
+    public bool IsHorseUnlocked(int horseID)
+    {
+        var config = HorseIDConfig.Get(horseID);
+        if (config == null) return false;
+
+        if (config.UnlockWay == 1) return true;
+
+        if (horseID < 0 || horseID > 31) return false;
+        return (horseIDState & (1u << horseID)) != 0;
+    }
+    public int GetNowAttrValue(int attrID)
+    {
+        int totalValue = 0;
+        // 浠�0闃剁疮鍔犲埌褰撳墠闃�
+        for (int lv = 0; lv <= classLV; lv++)
+        {
+            var config = HorseClassConfig.Get(lv);
+            if (config.ClassSpecAttrIDList != null)
+            {
+                int index = Array.IndexOf(config.ClassSpecAttrIDList, attrID);
+                if (index >= 0 && config.ClassSpecAttrValueList != null && index < config.ClassSpecAttrValueList.Length)
+                {
+                    totalValue += config.ClassSpecAttrValueList[index];
+                }
+            }
+        }
+        return totalValue;
     }
 
     #region 绾㈢偣
@@ -203,9 +314,13 @@
         }
 
 
+
         //鍗囨槦/瑙i攣绾㈢偣
         foreach (var skin in HorseSkinConfig.GetValues())
         {
+            if (skin.showType != 1)
+                continue;
+
             if (IsSkinActive(skin.SkinID))
             {
                 if (skin.StarMax > 0)
@@ -225,7 +340,7 @@
 
                 if (skin.UnlockWay == 1)
                 {
-                    if (classLV >= skin.UnlockValue &&  skin.UnlockValue > 0)
+                    if (classLV >= skin.UnlockValue && skin.UnlockValue > 0)
                     {
                         skinRedpoint.state = RedPointState.Simple;
                         return;
@@ -272,7 +387,8 @@
     public bool IsShowTheHorseRedImg(int skinID)
     {
         var skin = HorseSkinConfig.Get(skinID);
-
+        if (skin.showType != 1)
+            return false;
         if (IsSkinActive(skin.SkinID))
         {
             if (skin.StarMax > 0)
@@ -305,7 +421,7 @@
                 {
                     return true;
                 }
-            }            
+            }
         }
         return false;
     }
@@ -342,6 +458,7 @@
     {
         specialAttrDic.Clear();
         attrDic.Clear();
+
         for (int lv = 0; lv <= classLV; lv++)
         {
             //鎸夐樁鍔犳垚
@@ -385,6 +502,7 @@
                 }
             }
         }
+
     }
 
     //鍒锋柊鐨偆灞炴��
@@ -431,6 +549,53 @@
         }
     }
 
+
+    public Dictionary<int, long> GetMergedAttrDic()
+    {
+
+        Dictionary<int, long> resultDic = new Dictionary<int, long>();
+        // 鍚堝苟 specialAttrDic
+        foreach (var kvp in specialAttrDic)
+        {
+            resultDic[kvp.Key] = kvp.Value;
+        }
+
+
+        HorseIDConfig horseIDConfig = HorseIDConfig.Get(horseID);
+        int horseIDAttrID = horseIDConfig.AttrID;
+        float attrMultiValue = horseIDConfig.AttrMultiValue;
+        var keys = resultDic.Keys.ToList();
+        foreach (var key in keys)
+        {
+            if (key == horseIDAttrID)
+            {
+                resultDic[key] = (long)(resultDic[key] * attrMultiValue);
+            }
+        }
+
+
+        // 鍚堝苟 attrDic
+        foreach (var kvp in attrDic)
+        {
+            if (resultDic.ContainsKey(kvp.Key))
+                resultDic[kvp.Key] += kvp.Value;
+            else
+                resultDic[kvp.Key] = kvp.Value;
+        }
+
+        // 鍚堝苟 skinAttrDic
+        foreach (var kvp in skinAttrDic)
+        {
+            if (resultDic.ContainsKey(kvp.Key))
+                resultDic[kvp.Key] += kvp.Value;
+            else
+                resultDic[kvp.Key] = kvp.Value;
+        }
+
+        return resultDic;
+    }
+
+
     public long GetAttrValue(int attrID)
     {
         attrDic.TryGetValue(attrID, out long value);
@@ -458,7 +623,15 @@
     public List<int> sortSkinList = new List<int>();
     public void SortHorseSkinList()
     {
-        sortSkinList = HorseSkinConfig.GetKeys();
+        sortSkinList.Clear();
+        var temp = HorseSkinConfig.GetValues();
+        foreach (var config in temp)
+        {
+            if (config.showType == 1)
+            {
+                sortSkinList.Add(config.SkinID);
+            }
+        }
         sortSkinList.Sort((a, b) =>
         {
             var isActiveA = IsSkinActive(a);
@@ -469,9 +642,19 @@
             }
             var skinA = HorseSkinConfig.Get(a);
             var skinB = HorseSkinConfig.Get(b);
+
+            // isActive 鐩稿悓鏃讹紝鍏堟寜 sortOrder 鎺掑簭
+            if (skinA.sortOrder != skinB.sortOrder)
+            {
+                return skinA.sortOrder - skinB.sortOrder;
+            }
+
+            // sortOrder 鐩稿悓鏃讹紝鍐嶆寜 SkinID 鎺掑簭
             return skinA.SkinID - skinB.SkinID;
         });
     }
+
+
 
     public Dictionary<int, long> GetAttrBySkinID(HorseSkinConfig config)
     {
@@ -524,7 +707,8 @@
     }
 }
 
-public class HorseSkin {
+public class HorseSkin
+{
     public int State;        //鏄惁宸叉縺娲�
     public int EndTime;        //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
     public int Star;        //鏄熺骇
diff --git a/Main/System/Horse/HorseRankUPWin.cs b/Main/System/Horse/HorseRankUPWin.cs
index e21a8db..b7602ac 100644
--- a/Main/System/Horse/HorseRankUPWin.cs
+++ b/Main/System/Horse/HorseRankUPWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,14 +12,17 @@
 {
     [SerializeField] Text curLVText;
     [SerializeField] Text nextLVText;
-    [SerializeField] Text[] attrNameTexts;
-    [SerializeField] Text[] attrValueTexts;
-    [SerializeField] Text[] nextAttrValueTexts;
 
     [SerializeField] Transform[] specialAttrRect;
     [SerializeField] Text[] specialAttrNameTexts;
     [SerializeField] Text[] specialAttrValueTexts;
     [SerializeField] Text[] specialNextAttrValueTexts;
+
+    [SerializeField] Transform riderAttrRect;
+    [SerializeField] Text riderAttrNameText;
+    [SerializeField] Text riderAttrValueText;
+    [SerializeField] Text riderNextAttrValueText;
+    [SerializeField] Text noRiderText;
 
     [SerializeField] Text costText;
     [SerializeField] Image costItemImg;
@@ -50,18 +54,6 @@
 
         var keys = HorseManager.Instance.attrDic.Keys.ToList();
         keys.Sort();
-        for (int i = 0; i < attrNameTexts.Length; i++)
-        {
-            if (i < keys.Count)
-            {
-                var curValue = HorseManager.Instance.attrDic[keys[i]];
-                attrNameTexts[i].text = PlayerPropertyConfig.Get(keys[i]).Name;
-                attrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], curValue, 2);
-
-                nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i],
-                    curValue + nextConfig.ClassAttrValueList[i] + nextConfig.PerLVAttrValueList[i], 2);
-            }
-        }
 
         var nextKeys = HorseManager.Instance.specialAttrDic.Keys.ToList();
         nextKeys.Sort();
@@ -92,6 +84,38 @@
         costText.text = UIHelper.ShowUseItem(PackType.Item, HorseManager.Instance.rankUPItemID, HorseClassConfig.Get(HorseManager.Instance.classLV).ClassUPItemCnt);
         costItemImg.SetItemSprite(HorseManager.Instance.rankUPItemID);
 
+        int nowhorseID = HorseManager.Instance.horseID;
+        HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+        var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+        var horseIDConfig = HorseIDConfig.Get(nowhorseID);
+        if (horseIdSkinConfig == null || horseIDConfig == null) return;
+        int attrID = horseIDConfig.AttrID;
+        int attrValue = HorseManager.Instance.GetNowAttrValue(attrID);
+
+        // 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
+        var propConfig = PlayerPropertyConfig.Get(attrID);
+        if (propConfig == null)
+        {
+            // 娌℃湁灞炴��
+            noRiderText.SetActive(true);
+            riderAttrRect.SetActive(false);
+        }
+        else
+        {
+            // 鏈夊睘鎬�
+            noRiderText.SetActive(false);
+            riderAttrRect.SetActive(true);
+            riderAttrNameText.text = propConfig.Name;
+            riderAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(attrValue * horseIDConfig.AttrMultiValue), 2);
+
+            // 涓嬩竴闃剁殑灞炴�у��
+            int index = Array.IndexOf(nextConfig.ClassSpecAttrIDList, attrID);
+            if (index < 0 || index > nextConfig.ClassSpecAttrIDList.Length)
+                return;
+            long nextAttrValue = (long)((attrValue + nextConfig.ClassSpecAttrValueList[index]) * horseIDConfig.AttrMultiValue);
+            riderNextAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, nextAttrValue, 2);
+        }
+
     }
 
     //鍗囬樁
@@ -107,7 +131,7 @@
         var pack = new CB202_tagCSHorseClassUP();
         GameNetSystem.Instance.SendInfo(pack);
         CloseWindow();
-        
+
         if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt))
         {
             TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt);
diff --git a/Main/System/Horse/HorseSkinCell.cs b/Main/System/Horse/HorseSkinCell.cs
index 013193b..8711af6 100644
--- a/Main/System/Horse/HorseSkinCell.cs
+++ b/Main/System/Horse/HorseSkinCell.cs
@@ -31,7 +31,7 @@
     {
         skinID = _skinID;
         horseModel.Create(skinID, 0, 0.6f);
-        emptyImg.SetActive(skinID == 0);
+        emptyImg.SetActive(skinID == 999);
         usingObj.SetActive(HorseManager.Instance.GetUsingHorseSkinID() == skinID);
         bool isShowRed = HorseManager.Instance.IsShowTheHorseRedImg(skinID);
         redObj.SetActive(isShowRed);
diff --git a/Main/System/Horse/HorseSkinWin.cs b/Main/System/Horse/HorseSkinWin.cs
index 10d1ec7..1a46207 100644
--- a/Main/System/Horse/HorseSkinWin.cs
+++ b/Main/System/Horse/HorseSkinWin.cs
@@ -1,5 +1,6 @@
 using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -22,8 +23,7 @@
     [SerializeField] Image lvUpItemImg;
     [SerializeField] Button changeSkinBtn;
     [SerializeField] Text timeText;
-    [SerializeField] Transform inSkinMarkObj;   //骞诲寲涓�
-
+    [SerializeField] Button removeBtn;  //瑙i櫎骞诲寲
     [SerializeField] Button unlockBtn;
     [SerializeField] Text unlockCostText;
     [SerializeField] Image unlockItemImg;
@@ -34,11 +34,15 @@
         lvUpBtn.AddListener(OnLvUpBtnClick);
         changeSkinBtn.AddListener(OnChangeSkinBtnClick);
         unlockBtn.AddListener(OnUnlockBtnClick);
+        removeBtn.AddListener(OnRemoveBtnClick);
     }
 
     protected override void OnPreOpen()
     {
-        HorseManager.Instance.selectSkinID = HorseManager.Instance.GetUsingHorseSkinID();
+        HorseManager.Instance.SortHorseSkinList();
+
+        int usingHorseSkinID = HorseManager.Instance.GetUsingHorseSkinID();
+        HorseManager.Instance.selectSkinID = usingHorseSkinID == 0 || !HorseManager.Instance.sortSkinList.Contains(usingHorseSkinID) ? HorseManager.Instance.sortSkinList[0] : usingHorseSkinID;
         HorseManager.Instance.SortHorseSkinList();
         HorseManager.Instance.OnSkinUpdateEvent += OnSkinUpdateEvent;
         HorseManager.Instance.OnSelectEvent += OnSelectEvent;
@@ -140,12 +144,12 @@
             if (HorseManager.Instance.selectSkinID == HorseManager.Instance.GetUsingHorseSkinID())
             {
                 changeSkinBtn.SetActive(false);
-                inSkinMarkObj.SetActive(true);
+                removeBtn.SetActive(true);
             }
             else
             {
                 changeSkinBtn.SetActive(true);
-                inSkinMarkObj.SetActive(false);
+                removeBtn.SetActive(false);
             }
 
             ShowTime();
@@ -210,12 +214,14 @@
         var _cell = cell as HorseSkinLineCell;
         _cell.Display(cell.index);
     }
-    
+
 
     void OnSeeAttrBtnClick()
     {
-        AttributeManager.Instance.OpenSimpleAttributeWin(HorseManager.Instance.skinAttrDic, "AttributeTitle04");
+        Dictionary<int, long> totalAttrDic = HorseManager.Instance.GetMergedAttrDic();
+        AttributeManager.Instance.OpenSimpleAttributeWin(totalAttrDic, "AttributeTitle04");
     }
+
 
 
     string GetSkinAttrSring(HorseSkinConfig config)
@@ -279,5 +285,9 @@
             HorseManager.Instance.SendSkinOP(1, HorseManager.Instance.selectSkinID);
         }
     }
-    
+
+    void OnRemoveBtnClick()
+    {
+        HorseManager.Instance.SendSkinOP(2, 0);
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Horse/HorseSuccessWin.cs b/Main/System/Horse/HorseSuccessWin.cs
index f21c45d..82ccbf7 100644
--- a/Main/System/Horse/HorseSuccessWin.cs
+++ b/Main/System/Horse/HorseSuccessWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,9 +12,6 @@
 {
     [SerializeField] Text curLVText;
     [SerializeField] Text nextLVText;
-    [SerializeField] Text[] attrNameTexts;
-    [SerializeField] Text[] attrValueTexts;
-    [SerializeField] Text[] nextAttrValueTexts;
 
     [SerializeField] Transform[] specialAttrRect;
     [SerializeField] Text[] specialAttrNameTexts;
@@ -21,6 +19,11 @@
     [SerializeField] Text[] specialNextAttrValueTexts;
     [SerializeField] Button okBtn;
 
+    [SerializeField] Transform riderAttrRect;
+    [SerializeField] Text riderAttrNameText;
+    [SerializeField] Text riderAttrValueText;
+    [SerializeField] Text riderNextAttrValueText;
+    [SerializeField] Text noRiderText;
 
 
     protected override void InitComponent()
@@ -49,17 +52,6 @@
 
         var keys = HorseManager.Instance.attrDic.Keys.ToList();
         keys.Sort();
-        for (int i = 0; i < attrNameTexts.Length; i++)
-        {
-            if (i < keys.Count)
-            {
-                var curValue = HorseManager.Instance.attrDic[keys[i]];
-                attrNameTexts[i].text = PlayerPropertyConfig.Get(keys[i]).Name;
-                attrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], 
-                    curValue - nextConfig.ClassAttrValueList[i] - nextConfig.PerLVAttrValueList[i], 2);
-                nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], curValue, 2);
-            }
-        }
 
         var nextKeys = HorseManager.Instance.specialAttrDic.Keys.ToList();
         nextKeys.Sort();
@@ -72,9 +64,9 @@
                 specialAttrNameTexts[i].text = PlayerPropertyConfig.Get(id).Name;
                 if (i < nextKeys.Count)
                 {
-                    specialAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id, 
+                    specialAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
                         HorseManager.Instance.specialAttrDic[nextKeys[i]] - nextConfig.ClassSpecAttrValueList[i], 2);
-                    specialNextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id, 
+                    specialNextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
                         HorseManager.Instance.specialAttrDic[nextKeys[i]], 2);
                 }
                 else
@@ -88,8 +80,56 @@
                 specialAttrRect[i].SetActive(false);
             }
         }
+        int nowhorseID = HorseManager.Instance.horseID;
+        HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+        var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+        var horseIDConfig = HorseIDConfig.Get(nowhorseID);
+        if (horseIdSkinConfig == null || horseIDConfig == null) return;
 
+        int attrID = horseIDConfig.AttrID;
+        // 銆愭敞鎰忋�戝洜涓哄凡缁忚繘闃舵垚鍔燂紝姝ゅ鑾峰彇鐨勬槸杩涢樁銆愬悗銆戠殑鏈�鏂版�诲��
+        int newAttrValue = HorseManager.Instance.GetNowAttrValue(attrID);
+
+        // 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
+        var propConfig = PlayerPropertyConfig.Get(attrID);
+        if (propConfig == null)
+        {
+            // 娌℃湁灞炴��
+            noRiderText.SetActive(true);
+            riderAttrRect.SetActive(false);
+        }
+        else
+        {
+            // 鏈夊睘鎬�
+            noRiderText.SetActive(false);
+            riderAttrRect.SetActive(true);
+            riderAttrNameText.text = propConfig.Name;
+
+            // 璁$畻杩涢樁鍓嶇殑鏃у��
+            int oldAttrValue = newAttrValue; // 榛樿濡傛灉娌℃湁澧為噺锛屾棫鍊肩瓑浜庢柊鍊�
+
+            // nextConfig 鍙橀噺鍦ㄨ繖閲屽叾瀹炰唬琛ㄧ殑鏄�滃垰杈惧埌鐨勬柊闃剁骇閰嶇疆鈥�
+            if (nextConfig.ClassSpecAttrIDList != null)
+            {
+                // 鍦� ID 鍒楄〃涓鎵惧搴斿睘鎬х殑绱㈠紩
+                int index = Array.IndexOf(nextConfig.ClassSpecAttrIDList, attrID);
+
+                // 纭繚鎵惧埌浜嗭紝涓旂储寮曟病鏈夎秺鐣岋紙閬垮厤鐩存帴return瀵艰嚧UI娌″埛鏂帮級
+                if (index >= 0 && nextConfig.ClassSpecAttrValueList != null && index < nextConfig.ClassSpecAttrValueList.Length)
+                {
+                    // 鏃у�� = 鏈�鏂版�诲�� - 鏈杩涢樁澧炲姞鐨勬暟鍊�
+                    oldAttrValue = newAttrValue - nextConfig.ClassSpecAttrValueList[index];
+                }
+            }
+
+            float multi = horseIDConfig.AttrMultiValue;
+
+            // 宸﹁竟鏄剧ず鍗囬樁鍓嶇殑鏃у��
+            riderAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(oldAttrValue * multi), 2);
+
+            // 鍙宠竟鏄剧ず鍗囬樁鍚庣殑鏂板��
+            riderNextAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(newAttrValue * multi), 2);
+        }
 
     }
-
 }
\ No newline at end of file
diff --git a/Main/System/Horse/HorseWin.cs b/Main/System/Horse/HorseWin.cs
index 4400858..134a9eb 100644
--- a/Main/System/Horse/HorseWin.cs
+++ b/Main/System/Horse/HorseWin.cs
@@ -13,7 +13,6 @@
     [SerializeField] HorseController modelImg;
     [SerializeField] UIEffectPlayer lvUPEffect;
     [SerializeField] Text nameText;
-    [SerializeField] Text specialAttrText;
     [SerializeField] Button skinBtn;
     [SerializeField] Text[] attrNameTexts;
     [SerializeField] Text[] attrValueTexts;
@@ -29,8 +28,20 @@
     [SerializeField] Text needUPText;
     [SerializeField] Button rankUpBtn;
 
+    [SerializeField] TextEx[] specialAttrNameTexts;
+    [SerializeField] TextEx[] specialAttrValueTexts;
 
-
+    [SerializeField] Button lastHorseBtn;
+    [SerializeField] Button nextHorseBtn;
+    [SerializeField] HorseCarouselView carouselView;
+    [SerializeField] ImageEx attrImg;
+    [SerializeField] TextEx attrTxt;
+    [SerializeField] TextEx noAttrTxt;
+    [SerializeField] ButtonEx unlockBtn;
+    [SerializeField] TextEx moneyTxt;
+    [SerializeField] ImageEx moneyImg;
+    [SerializeField] ButtonEx useBtn;
+    [SerializeField] TextEx usingTxt;
     int beforeLV;
 
     protected override void InitComponent()
@@ -43,6 +54,64 @@
         lvupBtn.onPress.AddListener(HorseUpgrade);
         quickUpToggle.onValueChanged.AddListener((bool value) => { OnToggle(value); });
         rankUpBtn.AddListener(HorseRankUpgrade);
+        lastHorseBtn.AddListener(OnLastHorse);
+        nextHorseBtn.AddListener(OnNextHorse);
+        useBtn.AddListener(() =>
+        {
+            HorseManager.Instance.SendHorseIDOP(carouselView.CurrentHorseId, 2);
+
+            if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(carouselView.CurrentHorseId, out var skinID))
+                return;
+            bool isChangeState = HorseManager.Instance.IsChangeState(HorseManager.Instance.GetUsingHorseSkinID(false));
+            if (!isChangeState)
+            {
+                HorseManager.Instance.SendSkinOP(2, skinID);
+            }
+        });
+        unlockBtn.AddListener(() =>
+        {
+            if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(carouselView.CurrentHorseId, out var skinID))
+                return;
+            var skinConfig = HorseSkinConfig.Get(skinID);
+            if (skinConfig == null)
+                return;
+
+            var horseConfig = HorseIDConfig.Get(carouselView.CurrentHorseId);
+            if (horseConfig == null)
+                return;
+
+            ConfirmCancel.MoneyIconToggleConfirmByType(
+                ToggleCheckType.Horse,
+                horseConfig.UnlockNeedCnt,
+                horseConfig.UnlockValue,
+                Language.Get("Horse20", UIHelper.GetIconNameWithMoneyType(horseConfig.UnlockValue), horseConfig.UnlockNeedCnt),
+                () =>
+                {
+                    if (!UIHelper.CheckMoneyCount(horseConfig.UnlockValue, horseConfig.UnlockNeedCnt, 2))
+                    {
+                        return;
+                    }
+
+                    HorseManager.Instance.unLockHorseID = carouselView.CurrentHorseId;
+                    HorseManager.Instance.SendHorseIDOP(carouselView.CurrentHorseId, 1);
+                    HorseManager.Instance.unLockSkinID = skinID;
+                    bool isChangeState = HorseManager.Instance.IsChangeState(HorseManager.Instance.GetUsingHorseSkinID(false));
+                    if (!isChangeState)
+                    {
+                        HorseManager.Instance.SendSkinOP(2, skinID);
+                    }
+                });
+        });
+    }
+
+    void OnLastHorse()
+    {
+        carouselView?.SelectPrevious();
+    }
+
+    void OnNextHorse()
+    {
+        carouselView?.SelectNext();
     }
 
     protected override void OnPreOpen()
@@ -53,6 +122,30 @@
         HorseManager.Instance.OnHorseUpdateEvent += OnHorseUpdateEvent;
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
         PackManager.Instance.RefreshItemEvent += OnRefreshItemEvent;
+        HorseManager.Instance.OnUpdateHorseIDInfoEvent += OnUpdateHorseIDInfoEvent;
+        carouselView.OnSelectedIndexChanged += OnSelectedIndexChanged;
+        HorseManager.Instance.OnHorseUnlockedEvent += OnHorseUnlockedEvent;
+
+        // 姣忔鎵撳紑鏃讹紝鎭㈠鍒板綋鍓嶉獞涔樼殑鍧愰獞
+        if (carouselView != null)
+        {
+            int currentHorseID = HorseManager.Instance.horseID;
+            // 鍔ㄦ�佽幏鍙栨墍鏈夊潗楠戦厤缃�
+            var horseConfigs = HorseIDConfig.GetValues();
+            // 鎸塇orseSkinConfig鐨剆ortOrder鍜孲kinID鎺掑簭
+            horseConfigs = horseConfigs.OrderBy(c =>
+            {
+                int skinID = HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var id) ? id : int.MaxValue;
+                var skinConfig = HorseSkinConfig.Get(skinID);
+                return skinConfig?.sortOrder ?? int.MaxValue;
+            }).ThenBy(c =>
+            {
+                return HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var skinID) ? skinID : int.MaxValue;
+            }).ToList();
+
+            int index = horseConfigs.FindIndex(c => c.HorseID == currentHorseID);
+            carouselView.InitWithHorse(index >= 0 ? index : 0);
+        }
 
         Display();
     }
@@ -62,6 +155,28 @@
         HorseManager.Instance.OnHorseUpdateEvent -= OnHorseUpdateEvent;
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
         PackManager.Instance.RefreshItemEvent -= OnRefreshItemEvent;
+        HorseManager.Instance.OnUpdateHorseIDInfoEvent -= OnUpdateHorseIDInfoEvent;
+        carouselView.OnSelectedIndexChanged -= OnSelectedIndexChanged;
+        HorseManager.Instance.OnHorseUnlockedEvent -= OnHorseUnlockedEvent;
+    }
+
+    private void OnHorseUnlockedEvent(int horseID)
+    {
+        if (!UIManager.Instance.IsOpened<GetHorseWin>())
+        {
+            UIManager.Instance.OpenWindow<GetHorseWin>();
+        }
+    }
+
+    private void OnUpdateHorseIDInfoEvent()
+    {
+        Display();
+        carouselView.RefreshAllItems();
+    }
+
+    private void OnSelectedIndexChanged()
+    {
+        DisplayModel();
     }
 
     void OnHorseUpdateEvent()
@@ -112,12 +227,69 @@
         UIManager.Instance.OpenWindow<HorseRankUPWin>();
     }
 
+    void DisplayModel()
+    {
+        int nowSkinID = HorseManager.Instance.GetUsingHorseSkinID(false);
+
+        int nowhorseID = HorseManager.Instance.horseID;
+        int showHorseID = carouselView.CurrentHorseId;
+        HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(showHorseID, out int horseSkinID);
+        var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+
+        bool isChangeState = HorseManager.Instance.IsChangeState(nowSkinID);
+        modelImg.Create(isChangeState ? nowSkinID : horseSkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
+        nameText.text = isChangeState ? HorseSkinConfig.Get(nowSkinID).Name : horseIdSkinConfig.Name;
+        HorseIDConfig horseIDConfig = HorseIDConfig.Get(showHorseID);
+
+        float attrMultiValue = horseIDConfig.AttrMultiValue;
+        var attrConfig = PlayerPropertyConfig.Get(horseIDConfig.AttrID);
+        bool hasAttr = attrConfig != null;
+
+        attrImg.SetActive(hasAttr);
+        noAttrTxt.SetActive(!hasAttr);
+        if (hasAttr)
+        {
+            attrTxt.text = StringUtility.Concat(attrConfig.ShowName, " ", "+", PlayerPropertyConfig.GetValueDescription(horseIDConfig.AttrID, GetAttrValue(horseIDConfig.AttrID, attrMultiValue)));
+        }
+        useBtn.SetActive(carouselView.CurrentHorseId != nowhorseID && HorseManager.Instance.IsHorseUnlocked(carouselView.CurrentHorseId));
+        usingTxt.SetActive(carouselView.CurrentHorseId == nowhorseID);
+
+        bool isUnlock = HorseManager.Instance.IsHorseUnlocked(carouselView.CurrentHorseId);
+        unlockBtn.SetActive(!isUnlock);
+        if (!isUnlock)
+        {
+            moneyImg.SetIconWithMoneyType(horseIDConfig.UnlockValue);
+            moneyTxt.text = horseIDConfig.UnlockNeedCnt.ToString();
+        }
+
+    }
+
+    public int GetAttrValue(int attrID, float attrMultiValue)
+    {
+        int totalValue = 0;
+        int currentClassLV = HorseManager.Instance.classLV;
+
+        // 浠�0闃剁疮鍔犲埌褰撳墠闃�
+        for (int lv = 0; lv <= currentClassLV; lv++)
+        {
+            var config = HorseClassConfig.Get(lv);
+            if (config.ClassSpecAttrIDList != null)
+            {
+                int index = Array.IndexOf(config.ClassSpecAttrIDList, attrID);
+                if (index >= 0 && config.ClassSpecAttrValueList != null && index < config.ClassSpecAttrValueList.Length)
+                {
+                    totalValue += config.ClassSpecAttrValueList[index];
+                }
+            }
+        }
+        return totalValue * (int)attrMultiValue;
+    }
+
+
     void Display()
     {
-        var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
-        modelImg.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
-        nameText.text = skinConfig.Name;
-        specialAttrText.text = GetSpecialAttr();
+        DisplayModel();
+        DisplaySpecialAttr();
 
         var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
         lvText.text = Language.Get("Horse8", HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
@@ -194,17 +366,27 @@
         }
     }
 
-    string GetSpecialAttr()
+    public void DisplaySpecialAttr()
     {
-        if (HorseManager.Instance.specialAttrDic.Count == 0)
-            return "";
+        var specialAttrDic = HorseManager.Instance.specialAttrDic;
+        var attrs = specialAttrDic.Keys.ToList();
+        int arrtCnt = attrs.Count;
 
-        List<string> attrList = new List<string>();
-        foreach (var attrID in HorseManager.Instance.specialAttrDic.Keys)
+        for (int i = 0; i < specialAttrNameTexts.Length; i++)
         {
-            attrList.Add(UIHelper.AppendColor(TextColType.itemchuanqi, PlayerPropertyConfig.GetFullDescription(attrID, HorseManager.Instance.specialAttrDic[attrID])));
+            if (i < arrtCnt)
+            {
+                specialAttrNameTexts[i].SetActive(true);
+                specialAttrValueTexts[i].SetActive(true);
+                specialAttrNameTexts[i].text = PlayerPropertyConfig.Get(attrs[i]).Name;
+                specialAttrValueTexts[i].text = StringUtility.Concat("+", PlayerPropertyConfig.GetValueDescription(attrs[i], specialAttrDic.ContainsKey(attrs[i]) ? specialAttrDic[attrs[i]] : 0, 2));
+            }
+            else
+            {
+                specialAttrNameTexts[i].SetActive(false);
+                specialAttrValueTexts[i].SetActive(false);
+            }
         }
-        return Language.Get("L1100", Language.Get("herocard55"), string.Join(Language.Get("L1112"), attrList));
     }
 
     void OnToggle(bool value)
@@ -235,7 +417,7 @@
         switch (type)
         {
             case PlayerDataType.EquipShowSwitch:
-                var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
+                var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(true));
                 modelImg.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
                 nameText.text = skinConfig.Name;
                 break;
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index 1356e65..d0abef8 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -877,8 +877,21 @@
         {
             horseBGImg.SetActive(true);
             //equipShowSwitch;//褰撳墠閰嶇疆鐨勫潗楠戝瑙侷D瀛樺偍鍦紙鏈�澶ф敮鎸� 1~999锛�
-            var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(true));
-            horseImg.Create(skinConfig.SkinID, 0, 0.6f);
+            var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
+            if (skinConfig.SkinID == 999)
+            {
+                int nowhorseID = HorseManager.Instance.horseID;
+                HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+                var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+                horseImg.Create(horseIdSkinConfig.SkinID, 0, 0.6f);
+            }
+            else
+            {
+                horseImg.Create(skinConfig.SkinID, 0, 0.6f);
+            }
+
+
+
             horseLVText.text = Language.Get("Horse8", HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
         }
         else
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
index 39e82b0..c30e4ef 100644
--- a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -191,7 +191,16 @@
         if (horseData != null)
         {
             txtHorseLV.text = Language.Get("Horse8", horseData.ClassLV, horseData.LV);
-            horseController.Create(horseSkinID <= 0 ? 1 : horseSkinID, scale: 0.6f);
+            
+            if (horseSkinID == 999)
+            {
+                horseController.Create(HorseManager.Instance.defaultSkinID, scale: 0.6f);
+            }
+            else
+            {
+                horseController.Create(horseSkinID, scale: 0.6f);
+            }
+
         }
 
     }
diff --git a/Main/System/Tip/ConfirmCancel.cs b/Main/System/Tip/ConfirmCancel.cs
index 6492c47..bc382ab 100644
--- a/Main/System/Tip/ConfirmCancel.cs
+++ b/Main/System/Tip/ConfirmCancel.cs
@@ -358,6 +358,7 @@
     GoldRush = 2,   //娣橀噾 
     BoneField = 3,   //鐧介鐩堥噹
     FuncPreset = 4, //鍔熻兘(娴佹淳)棰勮
+    Horse = 5,//鍧愰獞璐拱
 }
 
 

--
Gitblit v1.8.0