显示3d模型

This commit is contained in:
bob
2025-06-23 18:08:03 +08:00
parent 2024bfb990
commit 197897a323
21 changed files with 427 additions and 19 deletions

View File

@@ -162,8 +162,8 @@ public class RenderImage
float vh = imageRect.height - (sourceH - gridRect.height);
uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.x - gridRect.x) / vw),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMax - (sourceH - gridRect.yMax)) / vh),
Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.xMax - gridRect.x) / vw),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin - gridRect.y) / vh));
Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.xMax - gridRect.x) / vw),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin - gridRect.y) / vh));
}
else
{
@@ -201,6 +201,7 @@ public class RenderImage
Object.Destroy(_model.gameObject);
_model = null;
}
_rotating = 0;
}

View File

@@ -13,8 +13,6 @@ Material:
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _EMISSION
- _GLOSSINESS_FROM_BASE_ALPHA
- _SPECULAR_COLOR
m_InvalidKeywords: []
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
@@ -53,7 +51,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 3c3eb5b459fd6d241afe2698a33268d9, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:

View File

@@ -9,6 +9,7 @@ namespace NBF
public static void BindAll()
{
UIObjectFactory.SetPackageItemExtension(SelectPages.URL, typeof(SelectPages));
UIObjectFactory.SetPackageItemExtension(ModelTexture.URL, typeof(ModelTexture));
UIObjectFactory.SetPackageItemExtension(BottomMenu.URL, typeof(BottomMenu));
UIObjectFactory.SetPackageItemExtension(ClassifyList.URL, typeof(ClassifyList));
UIObjectFactory.SetPackageItemExtension(CommonMenu.URL, typeof(CommonMenu));

View File

@@ -0,0 +1,297 @@
using FairyGUI;
using FairyGUI.Utils;
using System.Collections;
using UnityEngine;
namespace NBF
{
public class ModelRenderImage
{
public Transform modelRoot { get; private set; }
Camera _camera;
Image _image;
Transform _root;
Transform _background;
Transform _model;
RenderTexture _renderTexture;
int _width;
int _height;
bool _cacheTexture;
float _rotating;
const int RENDER_LAYER = 0;
const int HIDDEN_LAYER = 10;
public ModelRenderImage(GGraph holder)
{
_width = (int)holder.width;
_height = (int)holder.height;
_cacheTexture = true;
this._image = new Image();
holder.SetNativeObject(this._image);
Object prefab = Resources.Load("RenderTexture/RenderImageCamera");
GameObject go = (GameObject)Object.Instantiate(prefab);
_camera = go.GetComponent<Camera>();
_camera.transform.position = new Vector3(0, 1000, 0);
_camera.cullingMask = 1 << RENDER_LAYER;
_camera.enabled = false;
Object.DontDestroyOnLoad(_camera.gameObject);
this._root = new GameObject("RenderImage").transform;
this._root.SetParent(_camera.transform, false);
SetLayer(this._root.gameObject, HIDDEN_LAYER);
this.modelRoot = new GameObject("model_root").transform;
this.modelRoot.SetParent(this._root, false);
this._background = new GameObject("background").transform;
this._background.SetParent(this._root, false);
this._image.onAddedToStage.Add(OnAddedToStage);
this._image.onRemovedFromStage.Add(OnRemoveFromStage);
if (this._image.stage != null)
OnAddedToStage();
else
_camera.gameObject.SetActive(false);
}
public void Dispose()
{
Object.Destroy(_camera.gameObject);
DestroyTexture();
this._image.Dispose();
this._image = null;
}
/// <summary>
/// The rendertexture is not transparent. So if you want to the UI elements can be seen in the back of the models/particles in rendertexture,
/// you can set a maximunm two images for background.
/// Be careful if your image is 9 grid scaling, you must make sure the place holder is inside the middle box(dont cover from border to middle).
/// </summary>
/// <param name="image"></param>
public void SetBackground(GObject image)
{
SetBackground(image, null);
}
/// <summary>
/// The rendertexture is not transparent. So if you want to the UI elements can be seen in the back of the models/particles in rendertexture,
/// you can set a maximunm two images for background.
/// </summary>
/// <param name="image1"></param>
/// <param name="image2"></param>
public void SetBackground(GObject image1, GObject image2)
{
Image source1 = (Image)image1.displayObject;
Image source2 = image2 != null ? (Image)image2.displayObject : null;
Vector3 pos = _background.position;
pos.z = _camera.farClipPlane;
_background.position = pos;
Vector2[] uv = new Vector2[4];
Vector2[] uv2 = null;
Rect rect = _image.TransformRect(new Rect(0, 0, this._width, this._height), source1);
Rect uvRect = GetImageUVRect(source1, rect, uv);
if (source2 != null)
{
rect = _image.TransformRect(new Rect(0, 0, this._width, this._height), source2);
uv2 = new Vector2[4];
GetImageUVRect(source2, rect, uv2);
}
Vector3[] vertices = new Vector3[4];
for (int i = 0; i < 4; i++)
{
Vector2 v = uv[i];
vertices[i] = new Vector3((v.x - uvRect.x) / uvRect.width * 2 - 1,
(v.y - uvRect.y) / uvRect.height * 2 - 1, 0);
}
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.uv = uv;
if (uv2 != null)
mesh.uv2 = uv2;
mesh.colors32 = new Color32[] { Color.white, Color.white, Color.white, Color.white };
mesh.triangles = new int[] { 0, 1, 2, 2, 3, 0 };
MeshFilter meshFilter = this._background.gameObject.GetComponent<MeshFilter>();
if (meshFilter == null)
meshFilter = this._background.gameObject.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
MeshRenderer meshRenderer = this._background.gameObject.GetComponent<MeshRenderer>();
if (meshRenderer == null)
meshRenderer = this._background.gameObject.AddComponent<MeshRenderer>();
#if (UNITY_5 || UNITY_5_3_OR_NEWER)
meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
#else
meshRenderer.castShadows = false;
#endif
meshRenderer.receiveShadows = false;
Shader shader = Shader.Find("Game/FullScreen");
Material mat = new Material(shader);
mat.mainTexture = source1.texture.nativeTexture;
if (source2 != null)
mat.SetTexture("_Tex2", source2.texture.nativeTexture);
meshRenderer.material = mat;
}
Rect GetImageUVRect(Image image, Rect localRect, Vector2[] uv)
{
Rect imageRect = new Rect(0, 0, image.size.x, image.size.y);
Rect bound = ToolSet.Intersection(ref imageRect, ref localRect);
Rect uvRect = image.texture.uvRect;
if (image.scale9Grid != null)
{
Rect gridRect = (Rect)image.scale9Grid;
float sourceW = image.texture.width;
float sourceH = image.texture.height;
uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, gridRect.xMin / sourceW),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (sourceH - gridRect.yMax) / sourceH),
Mathf.Lerp(uvRect.xMin, uvRect.xMax, gridRect.xMax / sourceW),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (sourceH - gridRect.yMin) / sourceH));
float vw = imageRect.width - (sourceW - gridRect.width);
float vh = imageRect.height - (sourceH - gridRect.height);
uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.x - gridRect.x) / vw),
Mathf.Lerp(uvRect.yMin, uvRect.yMax,
(imageRect.height - bound.yMax - (sourceH - gridRect.yMax)) / vh),
Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.xMax - gridRect.x) / vw),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin - gridRect.y) / vh));
}
else
{
uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, bound.xMin / imageRect.width),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMax) / imageRect.height),
Mathf.Lerp(uvRect.xMin, uvRect.xMax, bound.xMax / imageRect.width),
Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin) / imageRect.height));
}
uv[0] = uvRect.position;
uv[1] = new Vector2(uvRect.xMin, uvRect.yMax);
uv[2] = new Vector2(uvRect.xMax, uvRect.yMax);
uv[3] = new Vector2(uvRect.xMax, uvRect.yMin);
if (image.texture.rotated)
ToolSet.RotateUV(uv, ref image.texture.uvRect);
return uvRect;
}
public void LoadModel(string model)
{
this.UnloadModel();
Object prefab = Resources.Load(model);
GameObject go = ((GameObject)Object.Instantiate(prefab));
_model = go.transform;
_model.SetParent(this.modelRoot, false);
}
public void UnloadModel()
{
if (_model != null)
{
Object.Destroy(_model.gameObject);
_model = null;
}
_rotating = 0;
}
public void StartRotate(float delta)
{
_rotating = delta;
}
public void StopRotate()
{
_rotating = 0;
}
void CreateTexture()
{
if (_renderTexture != null)
return;
_renderTexture = new RenderTexture(_width, _height, 24, RenderTextureFormat.ARGB32)
{
antiAliasing = 1,
filterMode = FilterMode.Bilinear,
anisoLevel = 0,
useMipMap = false
};
this._image.texture = new NTexture(_renderTexture);
// this._image.blendMode = BlendMode.Off;
}
void DestroyTexture()
{
if (_renderTexture != null)
{
Object.Destroy(_renderTexture);
_renderTexture = null;
this._image.texture = null;
}
}
void OnAddedToStage()
{
if (_renderTexture == null)
CreateTexture();
Timers.inst.AddUpdate(this.Render);
_camera.gameObject.SetActive(true);
Render();
}
void OnRemoveFromStage()
{
if (!_cacheTexture)
DestroyTexture();
Timers.inst.Remove(this.Render);
_camera.gameObject.SetActive(false);
}
void Render(object param = null)
{
if (_rotating != 0 && this.modelRoot != null)
{
Vector3 localRotation = this.modelRoot.localRotation.eulerAngles;
localRotation.y += _rotating;
this.modelRoot.localRotation = Quaternion.Euler(localRotation);
}
SetLayer(this._root.gameObject, RENDER_LAYER);
_camera.targetTexture = this._renderTexture;
RenderTexture old = RenderTexture.active;
RenderTexture.active = this._renderTexture;
GL.Clear(true, true, Color.clear);
_camera.Render();
RenderTexture.active = old;
SetLayer(this._root.gameObject, HIDDEN_LAYER);
}
void SetLayer(GameObject go, int layer)
{
Transform[] transforms = go.GetComponentsInChildren<Transform>(true);
foreach (Transform t in transforms)
{
t.gameObject.layer = layer;
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 82ec71c75abc4b739fb8e75078dd718b
timeCreated: 1750673117

View File

@@ -0,0 +1,27 @@
/**本脚本为自动生成每次生成会覆盖请勿手动修改生成插件文档及项目地址https://git.whoot.com/whoot-games/whoot.fguieditorplugin**/
using FairyGUI;
using FairyGUI.Utils;
using NBC;
namespace NBF
{
public partial class ModelTexture
{
public const string URL = "ui://6hgkvlau5dtxm9";
public GGraph ModelHolder;
public GGraph TouchHolder;
public override void ConstructFromXML(XML xml)
{
base.ConstructFromXML(xml);
ModelHolder = (GGraph)GetChild("ModelHolder");
TouchHolder = (GGraph)GetChild("TouchHolder");
OnInited();
UILanguage.TrySetComponentLanguage(this);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: db45948262d06f64299721282226d4f2

View File

@@ -0,0 +1,38 @@
// 本脚本只在不存在时会生成一次。组件逻辑写在当前脚本内。已存在不会再次生成覆盖
using UnityEngine;
using FairyGUI;
using NBC;
namespace NBF
{
public partial class ModelTexture : GComponent
{
ModelRenderImage _renderImage;
private void OnInited()
{
_renderImage = new ModelRenderImage(ModelHolder.asGraph);
//RenderImage是不透明的可以设置最多两张图片作为背景图
// _renderImage.SetBackground(contentPane.GetChild("frame").asCom.GetChild("n0"), contentPane.GetChild("n20"));
}
public void LoadModel(string model)
{
_renderImage.LoadModel("Role/npc");
_renderImage.modelRoot.localPosition = new Vector3(0, -1.0f, 5f);
_renderImage.modelRoot.localScale = new Vector3(1, 1, 1);
_renderImage.modelRoot.localRotation = Quaternion.Euler(0, 120, 0);
}
public void SetBackground(GObject image1)
{
_renderImage.SetBackground(image1);
}
public void SetBackground(GObject image1, GObject image2)
{
_renderImage.SetBackground(image1, image2);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6b09786333c422145abf84aaa2750425

View File

@@ -11,6 +11,8 @@ namespace NBF
public partial class HomePanel
{
public GObject this[string aKey] => ContentPane.GetChild(aKey);
[AutoFind(Name = "Back")]
public GLabel Back;
[AutoFind(Name = "Pages")]
public GComponent Pages;
[AutoFind(Name = "Menu")]

View File

@@ -13,6 +13,7 @@ namespace NBF
public HomeButtonGroups OpGroup;
public BottomMenu BottomMenu;
public ModelTexture Model;
public override void ConstructFromXML(XML xml)
{
@@ -20,6 +21,7 @@ namespace NBF
OpGroup = (HomeButtonGroups)GetChild("OpGroup");
BottomMenu = (BottomMenu)GetChild("BottomMenu");
Model = (ModelTexture)GetChild("Model");
OnInited();
UILanguage.TrySetComponentLanguage(this);
}

View File

@@ -31,6 +31,10 @@ namespace NBF
{
InputManager.OnUICanceled += OnUICanceled;
UseBottomMenu();
Model.LoadModel(string.Empty);
// Model.SetBackground(Panel.Back.GetChild("back"));//, Panel.Back.GetChild("icon")
}
@@ -73,7 +77,7 @@ namespace NBF
private void UseBottomMenu()
{
BottomMenu.Use(Panel);
BottomMenu.AddRightButton(InputDef.UI.Enter);
BottomMenu.AddRightButton(InputDef.UI.Back);
}

View File

@@ -144,6 +144,8 @@ namespace NBF
}
ResetSettingList();
Notices.Success("TEXT_OP_SUCCESS");
}
private void OnUICanceled(string action)

View File

@@ -2,14 +2,20 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Roboto-Bold SDF - HDRP Unlit
m_Shader: {fileID: -6465566751694194690, guid: f63d574838ccfb44f84acc05fed0af48, type: 3}
m_ShaderKeywords: _ALPHATEST_ON _ENABLE_FOG_ON_TRANSPARENT _SURFACE_TYPE_TRANSPARENT
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHATEST_ON
- _ENABLE_FOG_ON_TRANSPARENT
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
@@ -22,6 +28,7 @@ Material:
- TransparentDepthPostpass
- TransparentBackface
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
@@ -57,6 +64,7 @@ Material:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaCutoffEnable: 1
@@ -76,15 +84,19 @@ Material:
- _BumpFace: 0
- _BumpOutline: 0
- _ColorMask: 15
- _ConservativeDepthOffsetEnable: 0
- _CullMode: 2
- _CullModeForward: 2
- _DepthOffsetEnable: 0
- _Diffuse: 0.5
- _DoubleSidedEnable: 0
- _DoubleSidedGIMode: 0
- _DoubleSidedNormalMode: 2
- _DstBlend: 10
- _DstBlend2: 10
- _EnableBlendModePreserveSpecularLighting: 0
- _EnableFogOnTransparent: 1
- _ExcludeFromTUAndAA: 0
- _FaceDilate: 0
- _FaceUVSpeedX: 0
- _FaceUVSpeedY: 0
@@ -102,6 +114,7 @@ Material:
- _OutlineUVSpeedX: 0
- _OutlineUVSpeedY: 0
- _OutlineWidth: 0
- _PerPixelSorting: 0
- _PerspectiveFilter: 0.875
- _Reflectivity: 10
- _RenderQueueType: 3
@@ -119,15 +132,15 @@ Material:
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilRef: 0
- _StencilRefDepth: 0
- _StencilRefDepth: 1
- _StencilRefDistortionVec: 4
- _StencilRefGBuffer: 2
- _StencilRefMV: 32
- _StencilRefMV: 33
- _StencilWriteMask: 6
- _StencilWriteMaskDepth: 8
- _StencilWriteMaskDepth: 9
- _StencilWriteMaskDistortionVec: 4
- _StencilWriteMaskGBuffer: 14
- _StencilWriteMaskMV: 40
- _StencilWriteMaskMV: 43
- _SurfaceType: 1
- _TextureHeight: 1024
- _TextureWidth: 1024
@@ -176,6 +189,7 @@ Material:
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
- _UnderlayOffset: {r: 0, g: 0, b: 0, a: 0}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &8695414737614723888
MonoBehaviour:
m_ObjectHideFlags: 11
@@ -188,4 +202,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 11
version: 13
hdPluginSubTargetMaterialVersions:
m_Keys: []
m_Values:

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="600,600" opaque="false">
<displayList>
<graph id="n0_5dtx" name="ModelHolder" xy="0,0" size="600,600" type="rect" lineColor="#ffffffff">
<relation target="" sidePair="width-width,height-height"/>
</graph>
<graph id="n1_5dtx" name="TouchHolder" xy="0,0" size="600,600" alpha="0" type="rect" lineColor="#ffffffff">
<relation target="" sidePair="width-width,height-height"/>
</graph>
</displayList>
</component>

View File

@@ -220,10 +220,7 @@
<image id="8hy8m7" name="ControllerY.png" path="/Icon/控制图标/" exported="true"/>
<component id="5dtx19" name="SelectPageItem.xml" path="/Com/"/>
<component id="5dtx1a" name="SelectPages.xml" path="/Com/" exported="true"/>
<image id="9n0dm8" name="GlowBtn.png" path="/Images/button/2/" exported="true" scale="9grid" scale9grid="4,4,56,56"/>
<image id="9n0dm9" name="GlowBtnDisabled.png" path="/Images/button/2/" exported="true" scale="9grid" scale9grid="4,4,56,56"/>
<image id="9n0dma" name="GlowBtnHighlighted.png" path="/Images/button/2/" exported="true" scale="9grid" scale9grid="4,4,56,56"/>
<image id="9n0dmb" name="GlowBtnOver.png" path="/Images/button/2/" exported="true" scale="9grid" scale9grid="4,4,56,56"/>
<component id="5dtxm9" name="ModelTexture.xml" path="/Com/" exported="true"/>
</resources>
<publish name="" path="../Assets/Resources/Fgui/Common" packageCount="2" genCode="true"/>
</packageDescription>

View File

@@ -2,10 +2,13 @@
<component size="1920,1080">
<displayList>
<component id="n0_lvql" name="OpGroup" src="lvqln" fileName="Com/Home/HomeButtonGroups.xml" xy="79,179">
<relation target="" sidePair="middle-middle,left-left"/>
<relation target="" sidePair="center-center,middle-middle"/>
</component>
<component id="n1_lvql" name="BottomMenu" src="9mf1z" fileName="Com/Menu/BottomMenu.xml" pkg="6hgkvlau" xy="0,992">
<relation target="" sidePair="center-center,bottom-bottom"/>
</component>
<component id="n2_5dtx" name="Model" src="5dtxm9" fileName="Com/ModelTexture.xml" pkg="6hgkvlau" xy="1189,182" size="760,760">
<relation target="" sidePair="center-center,middle-middle"/>
</component>
</displayList>
</component>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="1920,1080" designImage="ui://hxr7rc7pnmzbd" designImageAlpha="0">
<displayList>
<component id="n33_gii7" name="n33" src="8hy8la" fileName="Com/Back/Back1.xml" pkg="6hgkvlau" xy="0,0">
<component id="n33_gii7" name="Back" src="8hy8la" fileName="Com/Back/Back1.xml" pkg="6hgkvlau" xy="0,0">
<relation target="" sidePair="width-width,height-height"/>
</component>
<component id="n32_lvql" name="Pages" src="lvqll7" fileName="Com/CommonContainer.xml" pkg="6hgkvlau" xy="0,0" size="1920,1080">

View File

@@ -0,0 +1 @@
{"url":"ui://6hgkvlau5dtxm9","name":"ModelTexture","scriptType":"component","isCustomName":false,"customName":"","annotation":"","member":{}}