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
- 设置Canvas的Render Mode为WorldSpace,Event Camera为Stage Camera。
- 删除Canvas Scaler组件(如果有)。
- 使用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