hch
2025-11-27 5a279e45cfd9e951788569f5ffc522952bf545e4
0312 内政NPC聊天
5个文件已修改
2个文件已添加
148 ■■■■■ 已修改文件
Main/Component/UI/Common/LayoutElementSizeClamp.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Hero/UIHeroController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroSkinModel.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/InternalAffairs/AffairBaseWin.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/InternalAffairs/FuncNPCManager.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/InternalAffairs/FuncNPCManager.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/LayoutElementSizeClamp.cs
@@ -7,7 +7,8 @@
// Preferred Width 和 Height 可以不勾选
// !!!必须勾选 Clamp Enable
// Clamp中 Min配最小 和 Max配最大
// Target 配目标,比如脚本可以挂载文字组件上,目标也指向文字组件
// Target 配目标,比如脚本可以挂载文字组件上,目标也指向文字组件,文本同时配ContentSizeFitter;
// 父组件同时配ContentSizeFitterlayout横竖都行
[ExecuteAlways]
public class LayoutElementSizeClamp : LayoutElement
{
Main/Main.cs
@@ -91,6 +91,7 @@
        managers.Add(HorseManager.Instance);
        managers.Add(PhantasmPavilionManager.Instance);
        managers.Add(AttributeManager.Instance);
        managers.Add(FuncNPCManager.Instance);
        foreach (var manager in managers)
        {
Main/System/Hero/UIHeroController.cs
@@ -13,7 +13,7 @@
    protected Spine.AnimationState spineAnimationState;
    private GameObject instanceGO;
    private Action onComplete;
    public Action onComplete;
    public void Create(int _skinID, float scale = 0.8f, Action _onComplete = null, string motionName = "idle", bool isLh = false)
    {
        if (skinID == _skinID)
Main/System/HeroUI/HeroSkinModel.cs
@@ -18,5 +18,10 @@
        heroModel.PlayAnimation(actionName, true);
        heroModel.SetEnabled(enable);
    }
    public UIHeroController GetModel()
    {
        return heroModel;
    }
}
Main/System/InternalAffairs/AffairBaseWin.cs
@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
@@ -19,6 +20,12 @@
    [SerializeField] Text autoText;
    [SerializeField] GameObject flowAutoEffect;
    [SerializeField] Button autoBtn;
    //NPC对话相关
    [SerializeField] HeroSkinModel[] funcNPCs;
    [SerializeField] Transform[] talkRects;
    [SerializeField] Text[] talkTexts;
    protected override void InitComponent()
    {
@@ -50,6 +57,7 @@
        GoldRushManager.Instance.OnAutoWorkingEvent += OnAutoWorkingEvent;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
        GlobalTimeEvent.Instance.fiveSecondEvent += OnFiveSecondEvent;
        
        Display();
        if (GoldRushManager.Instance.openAutoGoldRush)
@@ -64,6 +72,7 @@
        GoldRushManager.Instance.OnAutoWorkingEvent -= OnAutoWorkingEvent;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
        GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
    }
    protected override void OnOpen()
@@ -133,8 +142,31 @@
    void PlayerDataRefreshEvent(PlayerDataType type)
    {
        if (type == PlayerDataType.GoldRush)
        {
        {
            RefreshGoldRushMoney();
        }
    }
    void OnFiveSecondEvent()
    {
        var index = FuncNPCManager.Instance.GetRandomAffairNpcTalk();
        var talk = FuncNPCManager.Instance.GetAffairTalk(funcNPCs[index].heroSkinID);
        if (talk != null)
        {
            talkTexts[index].text = Language.Get(talk);
            talkRects[index].SetActive(true);
        }
        var npc = funcNPCs[index].GetModel();
        npc.PlayAnimation("hanhua", true);
        Talk(index).Forget();
    }
    async UniTask Talk(int index)
    {
        await UniTask.Delay(4500);
        talkRects[index].SetActive(false);
        var npc = funcNPCs[index].GetModel();
        npc.PlayAnimation("idle", true);
    }
}
Main/System/InternalAffairs/FuncNPCManager.cs
New file
@@ -0,0 +1,92 @@
using System.Collections.Generic;
using System.Linq;
using Codice.Client.Common;
using LitJson;
using UnityEngine;
public class FuncNPCManager : GameSystemManager<FuncNPCManager>
{
    //内政NPC
    Dictionary<int, string[]> affairNpcTalkDic = new Dictionary<int, string[]>();
    public List<int> affairTalkIndexList = new List<int>();
    public float lastAffairTalkTime;
    public int lastAffiarRandomIndex;
    //公会NPC
    Dictionary<int, string[]> guildNpcTalkDic = new Dictionary<int, string[]>();
    public List<int> guildTalkIndexList = new List<int>();
    public float lastGuildTalkTime;
    public int lastGuildRandomIndex;
    public override void Init()
    {
        ParseConfig();
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("FuncNPC");
        var json = JsonMapper.ToObject(config.Numerical1);
        var keys = json.Keys.ToList();
        foreach (var key in keys)
        {
            var npcID = int.Parse(key);
            var talkList = JsonMapper.ToObject<string[]>(json[key].ToJson());
            affairNpcTalkDic.Add(npcID, talkList);
        }
        for (int i = 0; i < affairNpcTalkDic.Count; i++)
        {
            affairTalkIndexList.Add(i);
        }
        json = JsonMapper.ToObject(config.Numerical2);
        keys = json.Keys.ToList();
        foreach (var key in keys)
        {
            var npcID = int.Parse(key);
            var talkList = JsonMapper.ToObject<string[]>(json[key].ToJson());
            guildNpcTalkDic.Add(npcID, talkList);
        }
        for (int i = 0; i < guildNpcTalkDic.Count; i++)
        {
            guildTalkIndexList.Add(i);
        }
    }
    //随机某个NPC对话,与上一次随机的NPC索引不重复
    public int GetRandomAffairNpcTalk()
    {
        int index = Random.Range(0, affairTalkIndexList.Count);
        if (index == lastAffiarRandomIndex)
        {
            index = (index + 1) % affairTalkIndexList.Count;
        }
        lastAffiarRandomIndex = index;
        return index;
    }
    public int GetRandomGuildNpcTalk()
    {
        int index = Random.Range(0, guildTalkIndexList.Count);
        if (index == lastGuildRandomIndex)
        {
            index = (index + 1) % guildTalkIndexList.Count;
        }
        lastGuildRandomIndex = index;
        return index;
    }
    public string GetAffairTalk(int skinID)
    {
        if (affairNpcTalkDic.ContainsKey(skinID))
        {
            return affairNpcTalkDic[skinID][Random.Range(0, affairNpcTalkDic[skinID].Length)];
        }
        return null;
    }
}
Main/System/InternalAffairs/FuncNPCManager.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: efdf806ad153a4d4bae560014fc20efd
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant: