继承UGUI组件类,自定义属性显示

本文介绍了一种在Unity中使用UGUI时,通过自定义Text组件来直接控制Alpha值的方法。作者通过继承Text组件并添加Alpha属性实现了这一功能,并提供了自定义编辑器以方便在编辑器面板中调整Alpha值。

项目用到了UGUI,但是Image,与Text组件不能直接控制Alpha,所以,自己继承原组件类搞了下

直接上代码与效果图

Texts类,主要实现Alpha控制,继承了Text

using UnityEngine;
using UnityEngine.UI;

[AddComponentMenu("Text", 10)]
public class Texts : Text
{
    [HideInInspector]
    public float Alpha = 1;
    Color c;
    public float alpha
    {

        get
        {
            c = GetComponent<Texts>().color;
            float a = c.a;
            return a;
        }
        set
        {
            Alpha = value;
            c = GetComponent<Texts>().color;
            GetComponent<Texts>().color = new Color(c.r, c.g, c.b, Alpha);
        }
    }
}

TextEditorLis类,继承TextEditor编辑类,主要用于面板显示自定义Alpha属性

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

namespace UnityEditor.UI
{

    [CustomEditor(typeof(Texts), true)]
    [CanEditMultipleObjects]
    public class TextEditorLis : UnityEditor.UI.TextEditor
    {
        Texts mText;
        protected override void OnEnable()
        {
            base.OnEnable();
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            EditorGUILayout.Space();
            serializedObject.Update();
            mText = (Texts)target;
            mText.alpha = EditorGUILayout.Slider("Alpha", mText.alpha, 0, 1);
            serializedObject.ApplyModifiedProperties();
            if (GUI.changed) {
                EditorUtility.SetDirty(target);
            }
        }
    }
}

效果图

最后一步:右键创建时,直接创建为自己的Texts

   //---------------扩展UGUI右键Text/Image
    [MenuItem("GameObject/UI/Text")]
    static void TextLabel()
    {
        GameObject canvas = CreatCanvas();

        //-------创建TextLabel
        GameObject go = new GameObject();
        go.name = "Text";
        Texts t = go.AddComponent(typeof(Texts)) as Texts;
        if (GetIsGameObj() != null) {
            go.transform.SetParent(GetIsGameObj().transform);
        }
        else {
            go.transform.SetParent(canvas.transform);
        }
        t.text = "New TextLabel";
        t.GetComponent<RectTransform>().localPosition = Vector3.zero;
        t.transform.localScale = Vector3.one;
        Selection.activeObject = go;
    }
这个右键,应该还有别的更好的方式,不过这个也能凑合用
### 创建自定义 UGUI 组件Unity 中创建自定义 UGUI (Unity GUI) 组件涉及几个关键步骤。这不仅限于简单的 UI 元素定制,还涉及到更深层次的图形处理和交互逻辑。 #### 定义新的 Graphic 类型 为了创建一个新的可绘制对象,继承 `Graphic` 是必要的路径之一。通过这种方式,新组件能够像内置的 `Image`, `Text` 等一样工作,并且可以在 Canvas 上正常渲染[^2]。 ```csharp using UnityEngine; using UnityEngine.UI; public class CustomShape : Graphic { protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); // 添加顶点数据到 VertexHelper 实例中 var vertices = new List<UIVertex>(); PopulateVertices(vertices); vh.AddUIVerticles(vertices.ToArray()); } private void PopulateVertices(List<UIVertex> verts){ // 设置顶点位置、颜色和其他属性... UIVertex vertex = UIVertex.simpleVert; vertex.position = new Vector3(0, 0); // 示例坐标 vertex.color = Color.white; // 白色填充 // 至少添加四个顶点以形成闭合区域 for(int i=0;i<4;i++){ verts.Add(vertex); } } } ``` 此代码片段展示了如何通过覆盖 `OnPopulateMesh()` 方法来自定义网格几何结构并将其应用于自定义形状。注意每次至少要向 `VertexHelper` 对象中添加四组顶点信息以便构成有效的多边形。 #### 扩展现有组件功能 对于希望增强已有组件行为而不改变其基本外观的情况,则可以选择从 `BaseMeshEffect` 或者其他合适的基类派生。例如,在不改动文本布局的前提下为其应用特殊效果(如斜体),可以通过如下方式实现: ```csharp using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(Text))] public class ItalicModifier : BaseMeshEffect { public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) return; List<UIVertex> vertList = new List<UIVertex>(); vh.GetUIVertexStream(vertList); foreach(var v in vertList){ // 修改顶点的位置或其他特性来模拟斜体效果 float offsetX = Mathf.Sin(Mathf.Deg2Rad * 45)*v.position.y*0.1f; v.position += new Vector3(offsetX, 0, 0); } vh.Clear(); vh.AddUIVertexTriangleStream(vertList); } } ``` 这段 C# 脚本提供了一个简单的方法来调整文字字符间的相对位移从而达到视觉上的倾斜感,而无需深入理解字体文件内部细节[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值