42.GoWrapper插入其他对象

42.FGUI基础-Unity中的使用必备-插入其他对象


42.1 知识点

官网说明

以下只提取重点内容,更多请看官网
https://www.fairygui.com/docs/unity/insert3d

UI中插入3D对象或者粒子

创建3D对象

GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

设置3D对象的相对坐标,缩放,旋转(注意:缩放比为100:1)

obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one * 100;
obj.transform.localEulerAngles = Vector3.zero;

在UI中放置一个空白的图形获取它 例如一个GGraph对象m_pos3D 创建一个GoWrapper对象,使用SetNativeObject方法放入到图形中

TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("Teach");
GoWrapper goWrapper = new GoWrapper(obj);
panel.m_pos3D.SetNativeObject(goWrapper);

注意:这种方法的缺点是在UI摄像机下3D对象没有透视,如果想要有透视可以使用RenderTexture的方式关联摄像机 再用UI关联RenderTexture(在Unity和UGUI相关知识点时 有讲过)

点击3D对象或者粒子

GoWrapper默认没有大小,所以不能处理点击事件。
如果想要被点击,可以在3D对象显示区域添加一个透明度为0的图形作为点击区域或者一个空组件 通过他们来监听点击

panel.m_click3D.onClick.Add(()=> {
    print("点击3D对象");
});

通过UIPanel进行调试

通过上述代码创建3D物体不方便调试。我们可以利用UIPanel 勾选它的Set Native Children Order 然后放置3D物体或者粒子 把数据记录好 然后来改代码当中的数据

新对象状态

GoWrapper会在构造函数里查询你的GameObject里所有的Renderer并保存
如果你的GameObject后续发生了改变,需要告知GoWrapper重新查询和保存,否则显示不正确
说人话就是显示的3D物体或模型更新了渲染后 要通知GoWrapper进行刷新

goWrapper.CacheRenderers();

更换显示的3D对象或者粒子

先把之前的删了 在关联新的

Destroy(obj);
obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one * 100;
obj.transform.localEulerAngles = Vector3.zero;
// 重新赋值给GoWrapper
goWrapper.wrapTarget = obj;

材质的复用

如果你想通过UI上的一些操作改变一个模型的材质
但是这个模型在场景中也使用了,如果在UI上改了场景上的也会被修改
这是因为他们使用的是共享材质 引用的是同一个材质
如果你不想UI上对模型的修改影响场景上的模型 可以使用复制材质
GoWrapper的SetWrapTarge方法 设置目标渲染的3D模型 且第二个参数是否克隆传入true

goWrapper.SetWrapTarget(obj, true);

UI中插入Canvas

  1. 设置Canvas的Render Mode为WorldSpace,Event Camera为Stage Camera。
  2. 删除Canvas Scaler组件(如果有)。
  3. 使用GoWrapper包装Canvas

42.2 知识点代码

using FairyGUI;
using System.Collections;
using System.Collections.Generic;
using Teach;
using UnityEngine;

public class Lesson42_FGUI基础_Unity中的使用必备_插入其他对象 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 UI中插入3D对象或者粒子

        //1.创建3D对象
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

        //2.设置3D对象的相对坐标,缩放,旋转(注意:缩放比为100:1)
        obj.transform.localPosition = Vector3.zero;
        obj.transform.localScale = Vector3.one * 100;
        obj.transform.localEulerAngles = Vector3.zero;

        //3.在UI中放置一个空白的图形获取它 例如GGraph m_pos3D;
        TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("Teach");

        //4.创建一个GoWrapper对象,使用SetNativeObject方法放入到图形中
        GoWrapper goWrapper = new GoWrapper(obj);
        panel.m_pos3D.SetNativeObject(goWrapper);

        //注意:这种方法的缺点是在UI摄像机下3D对象没有透视,如果想要有透视
        //可以使用RenderTexture的方式关联摄像机 再用UI关联RenderTexture(在Unity和UGUI相关知识点时 有讲过)

        #endregion

        #region 知识点二 点击3D对象或者粒子

        //GoWrapper默认没有大小,所以不能处理点击事件
        //如果想要被点击,可以在3D对象显示区域添加一个透明度为0的图形作为点击区域或者一个空组件 通过他们来监听点击
        panel.m_click3D.onClick.Add(()=> {
            print("点击3D对象");
        });

        #endregion

        #region 知识点三 通过UIPanel进行调试
        //通过上述代码创建3D物体不方便调试
        //我们可以利用UIPanel 勾选它的Set Native Children Order
        //然后放置3D物体或者粒子 把数据记录好 然后来改代码当中的数据
        #endregion

        #region 知识点四 更新对象状态
        //GoWrapper会在构造函数里查询你的GameObject里所有的Renderer并保存
        //如果你的GameObject后续发生了改变,需要告知GoWrapper重新查询和保存,否则显示不正确
        //说人话就是显示的3D物体或模型更新了渲染后 要通知GoWrapper进行刷新
        goWrapper.CacheRenderers();
        #endregion

        #region 知识点五 更换显示的3D对象或者粒子
        //先把之前的删了 在关联新的
        Destroy(obj);
        obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        obj.transform.localPosition = Vector3.zero;
        obj.transform.localScale = Vector3.one * 100;
        obj.transform.localEulerAngles = Vector3.zero;
        //重新赋值给GoWrapper
        //goWrapper.wrapTarget = obj;
        #endregion

        #region 知识点六 材质的复用

        //如果你想通过UI上的一些操作改变一个模型的材质
        //但是这个模型在场景中也使用了,如果在UI上改了场景上的也会被修改
        //这是因为他们使用的是共享材质 引用的是同一个材质
        //如果你不想UI上对模型的修改影响场景上的模型 可以使用复制材质
        //GoWrapper的SetWrapTarge方法 设置目标渲染的3D模型 且第二个参数是否克隆传入true
        goWrapper.SetWrapTarget(obj, true);


        #endregion

        #region 知识点七 UI中插入Canvas

        //1.设置Canvas的Render Mode为WorldSpace,Event Camera为Stage Camera。
        //2.删除Canvas Scaler组件(如果有)。
        //3.使用GoWrapper包装Canvas

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏