【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
    }
    
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vmware虚拟机怎么设置上网「建议收藏」

    vmware虚拟机怎么设置上网「建议收藏」点击物理主机2-右键点击属性找到ipv43 在设置vmware虚拟机 4-在使用命令ifconfig 查看虚拟机的ip里面含有 inetaddrip 就是现在虚拟机的IP地址5-在使用XShell 链接该ip地址 就可以链接的…

    2022年5月19日
    41
  • 服务器异常怎么解决_500服务器内部错误是什么原因

    服务器异常怎么解决_500服务器内部错误是什么原因http500内部服务器错误怎么办?现在有很多站长在建站的时候会遇到网站无法正常显示网页的问题,这些原因有很多,可能是域名解析除了问题,也可能是服务器不稳定,或者是http500内部服务器错误,http500内部服务器错误的意识就是你访问的网站服务器有问题,这里新网小编为大家介绍http500内部服务器错误怎么办。http500最可能的缘由是:该网站正在停止维护;该网站有…

    2022年8月12日
    7
  • 计算机专业男人喜欢什么样的女人,说实在的,其实男人真正喜欢的女人,就三个特征…

    计算机专业男人喜欢什么样的女人,说实在的,其实男人真正喜欢的女人,就三个特征…男人和女人有什么不同?大概是后者的世界里只有爱情,前者的世界里除了爱情,还有对金钱与权力的渴望。人比人气死人。有些女人从来都不缺追求者,有些女人从来都没有追求者,很多时候并不明白,她到底比她差在哪里?这还不算扎心的,有些女人绞尽脑汁,都没能守住自己的爱情,而有些女人看着都没怎么费力,却保卫了自己的爱情。也许我们都要深思,那些一直“幸运”的女人到底有什么秘诀。对于感情,女人一般会有的疑问,无非两个。…

    2022年7月25日
    45
  • 计算几何模板(全)

    计算几何模板(全)

    2021年9月27日
    47
  • 2年开发经验总结的java面试题(有完整答案)

    2年开发经验总结的java面试题(有完整答案)一、Java基础部分1、Java基本数据类型有八种:四种整数类型(byte、short、int、long),两种浮点数类型(double、float)一种字符类型char,一种布尔类型Boolean记忆:8位:Byte(字节型)16位:short(短整型)、char(字符型)32位:int(整…

    2022年6月18日
    53
  • sendfile相关「建议收藏」

    sendfile相关「建议收藏」考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核(send)。而sendfile就将整个发送过程封装在一个系统调用中,避免了多次系统调用,避免了数据在内核空间

    2022年5月8日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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