【Odin插件学习】新手上手示例:一个简单的角色面版

【Odin插件学习】新手上手示例:一个简单的角色面版示例展示前置准备创建脚本,例SimpleCharacterPanel.cs添加Odin库using指令usingSirenix.OdinInspector;需求分析我们可以将面版主要分为如下四个部分:角色基础信息名称等级经验值角色模型角色属性经验上限(升级所需经验)攻击力血量上限蓝量上限血条蓝条模拟操作(金手指)经验值增加其他初始化等级提升 #region属性publicstringm_Characte

大家好,又见面了,我是你们的朋友全栈君。

示例展示

请添加图片描述

前置准备

  1. 创建脚本,例 SimpleCharacterPanel.cs
  2. 添加Odin库using指令 using Sirenix.OdinInspector;

需求分析

我们可以将面版主要分为如下四个部分:

  • 角色基础信息
    • 名称
    • 等级
    • 经验值
    • 角色模型
  • 角色属性
    • 经验上限(升级所需经验)
    • 攻击力
    • 血量上限
    • 蓝量上限
    • 血条
    • 蓝条
  • 模拟操作(金手指)
    • 经验值增加
  • 其他
    • 初始化
    • 等级提升

请添加图片描述

	#region 属性

    public string m_CharacterName = "银色大蜥蜴";
    public int m_Level;
    public int m_Exp;

    public Object m_CharacterModel;

    public int m_ExpLimit;
    public int m_ATK;
    public int m_MaxHP;
    public int m_MaxSP;

    public int m_HP;
    public int m_SP;

    private void _Get100Exp()
    { 
   
        int ExpCount = m_Exp + 100;
        while (ExpCount >= m_ExpLimit)
        { 
   
            ExpCount -= m_ExpLimit;
            _LevelUp();
        }
        m_Exp = ExpCount;
    }

    private void _LevelUp()
    { 
   
        m_Level++;
        m_ExpLimit = m_Level * m_Level + 100;
        m_ATK = m_Level * m_Level * 3;
        m_MaxHP = m_Level * m_Level * 20;
        m_MaxSP = m_Level * m_Level * 5;
        m_HP = m_MaxHP;
        m_SP = m_MaxSP;
    }

    private void _Init()
    { 
   
        m_Level = 1;
        m_ExpLimit = 100;
        m_Exp = 0;
        m_ATK = 1;
        m_MaxHP = 50;
        m_MaxSP = 10;
        m_HP = m_MaxHP;
        m_SP = m_MaxSP;

        m_CharacterModel = this.gameObject;
    }
    
#endregion

面版改造

基础信息部分

  1. 显示改造

    • 使用[DisplayAsString]去除文本框,只显示文本
    • 使用[ProgressBar]以进度条形式显示经验值
      • 第一个参数为进度最小值,此处为0
      • 第二个参数为最大值,此处依赖 m_ExpLimit 字段的值
      • 后三位分别为进度条颜色的RGB值
    • 使用[PreviewField]显示模型预览

    请添加图片描述

    		[DisplayAsString]
    		public string m_CharacterName = "银色大蜥蜴";
    		
    		[DisplayAsString]
    		public int m_Level;
    		
    		[ProgressBar(0, "m_ExpLimit", 0, 0.8f, 0)]
    		public int m_Exp;
    		
    		[PreviewField(ObjectFieldAlignment.Left)]
    		public Object m_CharacterModel;
    
  2. Label改造

    • 使用[HideLabel]隐藏标签
    • 使用[LabelWidth]设置标签宽度

    请添加图片描述

  3. 布局改造

    • 使用[HorizontalGroup]使名称和等级设置在同一水平区域

      请添加图片描述

      		[HorizontalGroup("名称等级")]
      		[HideLabel]
      		[DisplayAsString]
      		public string m_CharacterName = "银色大蜥蜴";
      		
      		[HorizontalGroup("名称等级")]
      		[LabelWidth(40)]
      		[DisplayAsString]
      		public int m_Level;
      		
      		[LabelWidth(50)]
      		[ProgressBar(0, "m_ExpLimit", 0, 0.8f, 0)]
      		public int m_Exp;
      		
      		[HideLabel]
      		[PreviewField(ObjectFieldAlignment.Left)]
      		public Object m_CharacterModel;
      
    • 使用[VerticalGroup]使上一步的组合与经验值设置在同一垂直区域

      请添加图片描述

      	[HorizontalGroup("文本信息/名称等级")]
          [HideLabel]
          [DisplayAsString]
          public string m_CharacterName = "银色大蜥蜴";
      
          [HorizontalGroup("文本信息/名称等级")]
          [LabelWidth(40)]
          [DisplayAsString]
          public int m_Level;
      
          [VerticalGroup("文本信息")]
          [LabelWidth(50)]
          [ProgressBar(0, "m_ExpLimit", 0, 0.8f, 0)]
          public int m_Exp;
      
          [HideLabel]
          [PreviewField(ObjectFieldAlignment.Left)]
          public Object m_CharacterModel;
      
    • 再次使用[HorizontalGroup]使上步组合和模型预览处在同一水平区域

      请添加图片描述

      	[HorizontalGroup("基础信息/文本信息/名称等级")]
          [HideLabel]
          [DisplayAsString]
          public string m_CharacterName = "银色大蜥蜴";
      
          [HorizontalGroup("基础信息/文本信息/名称等级")]
          [LabelWidth(40)]
          [DisplayAsString]
          public int m_Level;
      
          [VerticalGroup("基础信息/文本信息")]
          [LabelWidth(50)]
          [ProgressBar(0, "m_ExpLimit", 0, 0.8f, 0)]
          public int m_Exp;
      
          [HorizontalGroup("基础信息")]
          [HideLabel]
          [PreviewField(ObjectFieldAlignment.Right)]
          public Object m_CharacterModel;
      

    属性信息部分

    1. 显示改造

      • 使用[DisplayAsString]去除文本框,只显示文本

        请添加图片描述

    2. 布局改造

      • 使用[FoldoutGroup]将其收录在一个可折叠的框中

        请添加图片描述

        		[FoldoutGroup("角色属性"), DisplayAsString]
            public int m_ExpLimit;
            [FoldoutGroup("角色属性"), DisplayAsString]
            public int m_ATK;
            [FoldoutGroup("角色属性"), DisplayAsString]
            public int m_MaxHP;
            [FoldoutGroup("角色属性"), DisplayAsString]
            public int m_MaxSP;
        

    血条蓝条

    请添加图片描述

    	[ProgressBar(0, "m_MaxHP", 0.8f, 0, 0)]
        public int m_HP;
        [ProgressBar(0, "m_MaxSP", 0.1f, 1, 0.9f)]
        public int m_SP;
    

    模拟操作的按钮

    • 在函数前使用[Button]在Inspector界面绘制一个调用按钮

    • 使用[Title]绘制一个标题

      请添加图片描述

      		[Title("模拟操作"), Button("加100经验")]
          private void _Get100Exp()
          { 
             
              int ExpCount = m_Exp + 100;
              while (ExpCount >= m_ExpLimit)
              { 
             
                  ExpCount -= m_ExpLimit;
                  _LevelUp();
              }
              m_Exp = ExpCount;
          }
      

    在Inspector初始化时初始化字段

    [OnInspectorInit("_Init")]
    private void _Init()
        { 
         
            m_Level = 1;
            m_ExpLimit = 100;
            m_Exp = 0;
            m_ATK = 1;
            m_MaxHP = 50;
            m_MaxSP = 10;
            m_HP = m_MaxHP;
            m_SP = m_MaxSP;
    
            m_CharacterModel = this.gameObject;
        }
    

    完整代码

    using Sirenix.OdinInspector;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SimpleCharacterPanel : MonoBehaviour
    { 
         
        #region 完整Demo
        [OnInspectorInit("_Init")]
    
        [HorizontalGroup("CharacterBaseInfo/Info/Base", Width = 80), HideLabel, DisplayAsString]
        public string m_CharacterName = "银色大蜥蜴";
    
        [HorizontalGroup("CharacterBaseInfo/Info/Base", Width = 200, MinWidth = 100), LabelWidth(40), DisplayAsString]
        public int m_Level;
    
        [VerticalGroup("CharacterBaseInfo/Info"), LabelWidth(50), ProgressBar(0, "m_ExpLimit", 0, 0.8f, 0)]
        public int m_Exp;
    
        [HorizontalGroup("CharacterBaseInfo", Width = 50), HideLabel, PreviewField(ObjectFieldAlignment.Left)]
        public Object m_CharacterModel;
    
        [FoldoutGroup("角色属性"), DisplayAsString]
        public int m_ExpLimit;
        [FoldoutGroup("角色属性"), DisplayAsString]
        public int m_ATK;
        [FoldoutGroup("角色属性"), DisplayAsString]
        public int m_MaxHP;
        [FoldoutGroup("角色属性"), DisplayAsString]
        public int m_MaxSP;
    
        [ProgressBar(0, "m_MaxHP", 0.8f, 0, 0)]
        public int m_HP;
        [ProgressBar(0, "m_MaxSP", 0.1f, 1, 0.9f)]
        public int m_SP;
    
        [Title("模拟操作"), PropertySpace(30), Button("加100经验")]
        private void _Get100Exp()
        { 
         
            int ExpCount = m_Exp + 100;
            while (ExpCount >= m_ExpLimit)
            { 
         
                ExpCount -= m_ExpLimit;
                _LevelUp();
            }
            m_Exp = ExpCount;
        }
    
        private void _LevelUp()
        { 
         
            m_Level++;
            m_ExpLimit = m_Level * m_Level + 100;
            m_ATK = m_Level * m_Level * 3;
            m_MaxHP = m_Level * m_Level * 20;
            m_MaxSP = m_Level * m_Level * 5;
            m_HP = m_MaxHP;
            m_SP = m_MaxSP;
        }
    
        private void _Init()
        { 
         
            m_Level = 1;
            m_ExpLimit = 100;
            m_Exp = 0;
            m_ATK = 1;
            m_MaxHP = 50;
            m_MaxSP = 10;
            m_HP = m_MaxHP;
            m_SP = m_MaxSP;
    
            m_CharacterModel = this.gameObject;
        }
        #endregion
    }
    
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162825.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Spring核心——Bean的定义与控制

    Spring核心——Bean的定义与控制

  • 讲一个故事:Redis的默认端口是6379「建议收藏」

    讲一个故事:Redis的默认端口是6379「建议收藏」意大利歌舞女Alessia
    Merz,DDDD(懂得都懂) 手机九键Merz对应6379 感兴趣也可以看看这个有关redis开发人员相关的自述

  • java spel_SPEL表达式注入-入门篇

    java spel_SPEL表达式注入-入门篇SpringExpressionLanguage(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于UnifiedEL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。同时因为SpEL是以API接口的形式创建的,所以允许将其集成到其他应用程序和框架中。个人理解就是Spring框架中的一种语言表达式,类似于Struts2中的OGNL的东西。一个最基础的…

  • window.onresize 怎么用_仅完成部分readprocess如何解决

    window.onresize 怎么用_仅完成部分readprocess如何解决BOOLWriteProcessMemory(HANDLEhProcess,//进程的句柄(可由OpenProcess函数返回)LPVOIDlpBaseAddress,//进程地址LPVOIDlpBuffer,//数据当前存放地址DWORDnSize,…

  • SQL注入学习「建议收藏」

    SQL注入学习「建议收藏」SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。学习目的:能找到注入点能判断数据库是什么类型能绕过各种过滤SQL注入平台层注入原因:数据库平台漏洞或数据库配置不安全代码层注入原因:程序员对输入未进行细致地过滤,从而执行了非法的数据查询SQL注入漏洞的方法数字注入字符串注入SQL注入方法有很多种,按数据类型可以分为

  • python中删除特定字符串

    python中删除特定字符串现在有一个字符串,有一些不想要的单词和特殊字符importretext=’wo,didi;wode,;wode’text0=text.replace(‘didi’,”)print(re.sub(‘[,;]’,”,text0))先用替换后用子串可以得到自己想要的结果:wowodewode python中字符串自带的split方法一次只能使用一个字符对字…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号