开发3D解剖相关功能
This commit is contained in:
parent
dabe54a5c7
commit
701f90314c
1830
Assets/Art/UIPrefab/UI3DBodyInfo.prefab
Normal file
1830
Assets/Art/UIPrefab/UI3DBodyInfo.prefab
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Art/UIPrefab/UI3DBodyInfo.prefab.meta
Normal file
7
Assets/Art/UIPrefab/UI3DBodyInfo.prefab.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0cc951fa11e31944fbd42d553403b8b8
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName: ui3dbodyinfo_prefab
|
||||||
|
assetBundleVariant:
|
||||||
@ -294,4 +294,122 @@ public class Utility
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 枚举定义渲染模式
|
||||||
|
public enum RenderMode
|
||||||
|
{
|
||||||
|
Opaque,
|
||||||
|
Cutout,
|
||||||
|
Fade,
|
||||||
|
Transparent
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置材质的渲染模式
|
||||||
|
public static void SetRenderMode(Material material, RenderMode mode, float alpha = 0.2f)
|
||||||
|
{
|
||||||
|
Color color = material.color;
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case RenderMode.Opaque:
|
||||||
|
material.SetOverrideTag("RenderType", "");
|
||||||
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||||
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
||||||
|
material.SetInt("_ZWrite", 1);
|
||||||
|
material.DisableKeyword("_ALPHATEST_ON");
|
||||||
|
material.DisableKeyword("_ALPHABLEND_ON");
|
||||||
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
||||||
|
material.renderQueue = -1;
|
||||||
|
color.a = 1;
|
||||||
|
material.color = color;
|
||||||
|
break;
|
||||||
|
case RenderMode.Cutout:
|
||||||
|
material.SetOverrideTag("RenderType", "TransparentCutout");
|
||||||
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||||
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
||||||
|
material.SetInt("_ZWrite", 1);
|
||||||
|
material.EnableKeyword("_ALPHATEST_ON");
|
||||||
|
material.DisableKeyword("_ALPHABLEND_ON");
|
||||||
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
||||||
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
|
||||||
|
break;
|
||||||
|
case RenderMode.Fade:
|
||||||
|
material.SetOverrideTag("RenderType", "Transparent");
|
||||||
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
|
||||||
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
||||||
|
material.SetInt("_ZWrite", 0);
|
||||||
|
material.DisableKeyword("_ALPHATEST_ON");
|
||||||
|
material.EnableKeyword("_ALPHABLEND_ON");
|
||||||
|
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
|
||||||
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
||||||
|
break;
|
||||||
|
case RenderMode.Transparent:
|
||||||
|
material.SetOverrideTag("RenderType", "Transparent");
|
||||||
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||||
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
||||||
|
material.SetInt("_ZWrite", 0);
|
||||||
|
material.DisableKeyword("_ALPHATEST_ON");
|
||||||
|
material.DisableKeyword("_ALPHABLEND_ON");
|
||||||
|
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
|
||||||
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
||||||
|
color.a = alpha;
|
||||||
|
material.color = color;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void SetSurfaceType(Material material, bool isTransparent)
|
||||||
|
{
|
||||||
|
if (isTransparent)
|
||||||
|
{
|
||||||
|
// 设置 SurfaceType 为 Transparent
|
||||||
|
material.SetFloat("_Surface", 1); // 1 代表 Transparent,0 代表 Opaque
|
||||||
|
// 设置 Blend Mode 为 Alpha Blend,使用枚举
|
||||||
|
material.SetOverrideTag("RenderType", "Transparent");
|
||||||
|
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
|
||||||
|
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
||||||
|
|
||||||
|
// 禁用深度写入
|
||||||
|
material.SetInt("_ZWrite", 0);
|
||||||
|
|
||||||
|
// 设置渲染队列
|
||||||
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
|
||||||
|
|
||||||
|
// 启用相应的着色器关键字
|
||||||
|
material.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
|
||||||
|
material.DisableKeyword("_SURFACE_TYPE_OPAQUE");
|
||||||
|
Color color = material.color;
|
||||||
|
color.a = 0.2f;
|
||||||
|
material.color = color;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 设置 SurfaceType 为 Opaque
|
||||||
|
material.SetFloat("_Surface", 0);
|
||||||
|
|
||||||
|
// 恢复默认的 Blend Mode(这里假设默认是不透明模式对应的 Blend Mode)
|
||||||
|
material.SetFloat("_Blend", 0);
|
||||||
|
|
||||||
|
// 启用深度写入
|
||||||
|
material.SetInt("_ZWrite", 1);
|
||||||
|
|
||||||
|
// 恢复默认的渲染队列
|
||||||
|
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry;
|
||||||
|
|
||||||
|
// 启用相应的着色器关键字
|
||||||
|
material.EnableKeyword("_SURFACE_TYPE_OPAQUE");
|
||||||
|
material.DisableKeyword("_SURFACE_TYPE_TRANSPARENT");
|
||||||
|
|
||||||
|
Color color = material.color;
|
||||||
|
color.a = 1;
|
||||||
|
material.color = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
1015
Assets/Scenes/TestUIPanels/TestUI3DBodyInfo.unity
Normal file
1015
Assets/Scenes/TestUIPanels/TestUI3DBodyInfo.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/TestUIPanels/TestUI3DBodyInfo.unity.meta
Normal file
7
Assets/Scenes/TestUIPanels/TestUI3DBodyInfo.unity.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3f60d30421c64344cb0972e5a3584119
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
164
Assets/Scripts/Controller/Body3DController.cs
Normal file
164
Assets/Scripts/Controller/Body3DController.cs
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
using QFramework;
|
||||||
|
using QFramework.Example;
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.EventSystems;
|
||||||
|
using XMLTool;
|
||||||
|
using static UnityEditor.Progress;
|
||||||
|
|
||||||
|
public class Body3DController : MonoSingleton<Body3DController>
|
||||||
|
{
|
||||||
|
|
||||||
|
Body3DController() { }
|
||||||
|
|
||||||
|
Dictionary<GameObject, Body3DOjbItem> objs = new Dictionary<GameObject, Body3DOjbItem>();
|
||||||
|
|
||||||
|
bool selectIsGroup = false;
|
||||||
|
|
||||||
|
public List<GameObject> isOnList = new List<GameObject>();
|
||||||
|
public override void OnSingletonInit()
|
||||||
|
{
|
||||||
|
base.OnSingletonInit();
|
||||||
|
|
||||||
|
TypeEventSystem.Global.Register<OnBody3DStart>((arg) =>
|
||||||
|
{
|
||||||
|
Refresh();
|
||||||
|
}).UnRegisterWhenGameObjectDestroyed(gameObject);
|
||||||
|
|
||||||
|
TypeEventSystem.Global.Register<OnModuleQuit>(OnClear);
|
||||||
|
TypeEventSystem.Global.Register<OnBody3DGroupTypeChanged>(OnToggleSelectType);
|
||||||
|
TypeEventSystem.Global.Register<OnBody3DSelected>(OnBody3DSelectedHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnBody3DSelectedHandler(OnBody3DSelected selected)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (selected.isOn)
|
||||||
|
{
|
||||||
|
if (isOnList.Contains(selected.obj) == false)
|
||||||
|
{
|
||||||
|
if (selectIsGroup == false)
|
||||||
|
{
|
||||||
|
ClearObjectToggle();
|
||||||
|
}
|
||||||
|
isOnList.Add(selected.obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isOnList.Contains(selected.obj))
|
||||||
|
{
|
||||||
|
isOnList.Remove(selected.obj);
|
||||||
|
selected.obj.GetComponent<ObjectToggle>().Set(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Active(GameObject obj, bool isActive, bool isOther)
|
||||||
|
{
|
||||||
|
if (isOther)
|
||||||
|
{
|
||||||
|
foreach (var item in objs)
|
||||||
|
{
|
||||||
|
if (item.Key != obj)
|
||||||
|
{
|
||||||
|
item.Key.SetActive(isOther);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj.SetActive(isActive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Transparent(GameObject obj, bool isTransparent, bool isOther)
|
||||||
|
{
|
||||||
|
if (isOther)
|
||||||
|
{
|
||||||
|
foreach (var item in objs)
|
||||||
|
{
|
||||||
|
if (item.Key != obj)
|
||||||
|
{
|
||||||
|
Utility.SetSurfaceType(item.Key.GetComponent<MeshRenderer>().material, isTransparent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Utility.SetSurfaceType(obj.GetComponent<MeshRenderer>().material, isTransparent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void OnToggleSelectType(OnBody3DGroupTypeChanged type)
|
||||||
|
{
|
||||||
|
selectIsGroup = type.isGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClear(OnModuleQuit quit)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Refresh()
|
||||||
|
{
|
||||||
|
Parser(Global.Instance.cur3DPart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Parser(Body3D.Body body)
|
||||||
|
{
|
||||||
|
GameObject obj = Utility.FindObj(body.Path);
|
||||||
|
var bodyObjItem = obj.GetOrAddComponent<Body3DOjbItem>();
|
||||||
|
bodyObjItem.Init(body);
|
||||||
|
objs.Add(obj, bodyObjItem);
|
||||||
|
if (body.subBody != null)
|
||||||
|
{
|
||||||
|
foreach (var item in body.subBody)
|
||||||
|
{
|
||||||
|
Parser(item.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false)
|
||||||
|
{
|
||||||
|
// 从相机发射一条射线到当前鼠标位置
|
||||||
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
||||||
|
RaycastHit hit;
|
||||||
|
if (Physics.Raycast(ray, out hit))
|
||||||
|
{
|
||||||
|
GameObject obj = hit.collider.gameObject;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (selectIsGroup == false)
|
||||||
|
{
|
||||||
|
ClearObjectToggle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearObjectToggle()
|
||||||
|
{
|
||||||
|
for (int i = isOnList.Count - (1); i >= 0; i--)
|
||||||
|
{
|
||||||
|
isOnList[i].GetComponent<ObjectToggle>().Set(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
objs.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
11
Assets/Scripts/Controller/Body3DController.cs.meta
Normal file
11
Assets/Scripts/Controller/Body3DController.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3e0f94aba8f7e424d945ba2f28f894a9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -38,3 +38,25 @@ public struct OnPoint3DQuestionDestroy
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct OnBody3DStart
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct OnBody3DDrag
|
||||||
|
{
|
||||||
|
public bool isAllow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public struct OnBody3DGroupTypeChanged
|
||||||
|
{
|
||||||
|
public bool isGroup;
|
||||||
|
}
|
||||||
|
public struct OnBody3DSelected
|
||||||
|
{
|
||||||
|
public bool isOn;
|
||||||
|
public GameObject obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ public class Global : Singleton<Global>
|
|||||||
|
|
||||||
public XMLTool.AppData appData;
|
public XMLTool.AppData appData;
|
||||||
public Module curModule;
|
public Module curModule;
|
||||||
public Body3D.Body cur3DBody;
|
public Body3D.Body cur3DPart;
|
||||||
|
|
||||||
public static string dataPath = Application.dataPath + "/../Data";
|
public static string dataPath = Application.dataPath + "/../Data";
|
||||||
public static string deviceIconsPath = dataPath + "/DeviceIcons/";
|
public static string deviceIconsPath = dataPath + "/DeviceIcons/";
|
||||||
|
|||||||
60
Assets/Scripts/Item/Body3DOjbItem.cs
Normal file
60
Assets/Scripts/Item/Body3DOjbItem.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using QFramework;
|
||||||
|
using QFramework.Example;
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using XMLTool;
|
||||||
|
|
||||||
|
public class Body3DOjbItem : MonoBehaviour
|
||||||
|
{
|
||||||
|
Body3D.Body body;
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
TypeEventSystem.Global.Register<OnBody3DDrag>(OnBody3DDragHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnBody3DDragHandler(OnBody3DDrag drag)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Init(Body3D.Body body)
|
||||||
|
{
|
||||||
|
this.body = body;
|
||||||
|
|
||||||
|
if (body.subBody == null || body.subBody.Count == 0)
|
||||||
|
{
|
||||||
|
if (body.toggle != null)
|
||||||
|
{
|
||||||
|
var objToggle = gameObject.GetOrAddComponent<ObjectToggle>();
|
||||||
|
ObjectColorToggle colorToggle = null;
|
||||||
|
if (body.toggle.color != null)
|
||||||
|
{
|
||||||
|
colorToggle = gameObject.GetOrAddComponent<ObjectColorToggle>();
|
||||||
|
colorToggle.Init(Utility.ToColor(body.toggle.color.isOn), Utility.ToColor(body.toggle.color.isOff));
|
||||||
|
}
|
||||||
|
|
||||||
|
objToggle.OnValueChanged.AddListener(isOn =>
|
||||||
|
{
|
||||||
|
colorToggle?.SetColor(isOn);
|
||||||
|
var drag = gameObject.GetOrAddComponent<ObjDrag>();
|
||||||
|
drag.isOn = isOn;
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
|
||||||
|
UI3DBodyInfoData data = new UI3DBodyInfoData();
|
||||||
|
data.body = body;
|
||||||
|
UIKit.OpenPanelAsync<UI3DBodyInfo>(UILevel.PopUI, data).ToAction().Start(this);
|
||||||
|
}
|
||||||
|
TypeEventSystem.Global.Send<OnBody3DSelected>(new OnBody3DSelected() { isOn = isOn, obj = gameObject });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
11
Assets/Scripts/Item/Body3DOjbItem.cs.meta
Normal file
11
Assets/Scripts/Item/Body3DOjbItem.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 297f30dc51736414695fa9fd6ad43dd6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
65
Assets/Scripts/Item/ObjDrag.cs
Normal file
65
Assets/Scripts/Item/ObjDrag.cs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class ObjDrag : MonoBehaviour
|
||||||
|
{
|
||||||
|
private Vector3 offset;
|
||||||
|
private Camera mainCamera;
|
||||||
|
public bool isOn = false;
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
// 获取主相机引用
|
||||||
|
mainCamera = Camera.main;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnMouseDown()
|
||||||
|
{
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
// 获取鼠标在相机视角平面上的世界坐标
|
||||||
|
Vector3 mouseWorldPos = GetMouseWorldPositionOnPlane();
|
||||||
|
// 计算物体位置与鼠标点击点在世界坐标中的偏移量
|
||||||
|
offset = transform.position - mouseWorldPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnMouseDrag()
|
||||||
|
{
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
// 获取鼠标在相机视角平面上的世界坐标
|
||||||
|
Vector3 mouseWorldPos = GetMouseWorldPositionOnPlane();
|
||||||
|
// 根据偏移量更新物体的位置
|
||||||
|
transform.position = mouseWorldPos + offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector3 GetMouseWorldPositionOnPlane()
|
||||||
|
{
|
||||||
|
// 获取鼠标在屏幕上的位置
|
||||||
|
Vector3 mouseScreenPos = Input.mousePosition;
|
||||||
|
mouseScreenPos.z = mainCamera.WorldToScreenPoint(transform.position).z; // 保持物体与相机的深度一致
|
||||||
|
|
||||||
|
// 将鼠标的屏幕坐标转换为世界坐标
|
||||||
|
Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(mouseScreenPos);
|
||||||
|
|
||||||
|
// 计算相机视角平面的法线方向(相机的正前方)
|
||||||
|
Vector3 cameraForward = mainCamera.transform.forward;
|
||||||
|
|
||||||
|
// 创建一个平面,法线方向为相机的正前方,平面通过物体的当前位置
|
||||||
|
Plane plane = new Plane(cameraForward, transform.position);
|
||||||
|
|
||||||
|
// 从相机发射一条射线,指向鼠标的世界坐标
|
||||||
|
Ray ray = mainCamera.ScreenPointToRay(mouseScreenPos);
|
||||||
|
|
||||||
|
float distance;
|
||||||
|
if (plane.Raycast(ray, out distance))
|
||||||
|
{
|
||||||
|
// 返回射线与平面的交点
|
||||||
|
return ray.GetPoint(distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果没有相交,返回物体的当前位置
|
||||||
|
return transform.position;
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Scripts/Item/ObjDrag.cs.meta
Normal file
11
Assets/Scripts/Item/ObjDrag.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4bc81b557a686064482ca97c33f03504
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
35
Assets/Scripts/Item/ObjectColorToggle.cs
Normal file
35
Assets/Scripts/Item/ObjectColorToggle.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class ObjectColorToggle : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
Color isOnColor;
|
||||||
|
Color isOffColor;
|
||||||
|
MeshRenderer mesh;
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
mesh = gameObject.GetComponent<MeshRenderer>();
|
||||||
|
}
|
||||||
|
public void Init(Color isOnColor, Color isOffColor)
|
||||||
|
{
|
||||||
|
this.isOnColor = isOnColor;
|
||||||
|
this.isOffColor = isOffColor;
|
||||||
|
}
|
||||||
|
public void SetColor(bool isOn)
|
||||||
|
{
|
||||||
|
float alpha = mesh.material.color.a;
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
isOnColor.a = alpha;
|
||||||
|
mesh.material.color = isOnColor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isOffColor.a = alpha;
|
||||||
|
mesh.material.color = isOffColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
11
Assets/Scripts/Item/ObjectColorToggle.cs.meta
Normal file
11
Assets/Scripts/Item/ObjectColorToggle.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f7a034293f9fb56428fbd3c0772ff83c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
45
Assets/Scripts/Item/ObjectToggle.cs
Normal file
45
Assets/Scripts/Item/ObjectToggle.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
public class ObjectToggle : MonoBehaviour
|
||||||
|
{
|
||||||
|
public bool isOn = false;
|
||||||
|
//EventHandler OnValueChanged
|
||||||
|
public UnityEvent<bool> OnValueChanged = new UnityEvent<bool>();
|
||||||
|
private float mouseDownTime;
|
||||||
|
private bool isMouseDown;
|
||||||
|
private void OnMouseDown()
|
||||||
|
{
|
||||||
|
// 记录鼠标按下的时间
|
||||||
|
mouseDownTime = Time.time;
|
||||||
|
isMouseDown = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMouseUp()
|
||||||
|
{
|
||||||
|
if (isMouseDown)
|
||||||
|
{
|
||||||
|
// 计算鼠标按下和抬起的时间间隔
|
||||||
|
float clickDuration = Time.time - mouseDownTime;
|
||||||
|
|
||||||
|
// 检查时间间隔是否大于 0.2 秒
|
||||||
|
if (clickDuration < 0.2f)
|
||||||
|
{
|
||||||
|
// 执行原本 OnMouseUpAsButton 的逻辑
|
||||||
|
isOn = !isOn;
|
||||||
|
OnValueChanged?.Invoke(isOn);
|
||||||
|
}
|
||||||
|
|
||||||
|
isMouseDown = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Set(bool isOn)
|
||||||
|
{
|
||||||
|
this.isOn = isOn;
|
||||||
|
OnValueChanged?.Invoke(isOn);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Scripts/Item/ObjectToggle.cs.meta
Normal file
11
Assets/Scripts/Item/ObjectToggle.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fce67a81459948d43bb40992a12c83ec
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
61
Assets/Scripts/UI/UI3DBodyInfo.Designer.cs
generated
Normal file
61
Assets/Scripts/UI/UI3DBodyInfo.Designer.cs
generated
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using QFramework;
|
||||||
|
|
||||||
|
namespace QFramework.Example
|
||||||
|
{
|
||||||
|
// Generate Id:66f1daf0-51f7-4184-b1fa-8903438d5b48
|
||||||
|
public partial class UI3DBodyInfo
|
||||||
|
{
|
||||||
|
public const string Name = "UI3DBodyInfo";
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
public UnityEngine.UI.Toggle Group;
|
||||||
|
[SerializeField]
|
||||||
|
public TMPro.TextMeshProUGUI PartName;
|
||||||
|
[SerializeField]
|
||||||
|
public UnityEngine.UI.Toggle Active;
|
||||||
|
[SerializeField]
|
||||||
|
public UnityEngine.UI.Toggle Transparent;
|
||||||
|
[SerializeField]
|
||||||
|
public UnityEngine.UI.Button Single;
|
||||||
|
[SerializeField]
|
||||||
|
public UnityEngine.UI.Toggle TransparentOther;
|
||||||
|
|
||||||
|
private UI3DBodyInfoData mPrivateData = null;
|
||||||
|
|
||||||
|
protected override void ClearUIComponents()
|
||||||
|
{
|
||||||
|
Group = null;
|
||||||
|
PartName = null;
|
||||||
|
Active = null;
|
||||||
|
Transparent = null;
|
||||||
|
Single = null;
|
||||||
|
TransparentOther = null;
|
||||||
|
|
||||||
|
mData = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UI3DBodyInfoData Data
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return mData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UI3DBodyInfoData mData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return mPrivateData ?? (mPrivateData = new UI3DBodyInfoData());
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
mUIData = value;
|
||||||
|
mPrivateData = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Scripts/UI/UI3DBodyInfo.Designer.cs.meta
Normal file
11
Assets/Scripts/UI/UI3DBodyInfo.Designer.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b80aaf4bf2b27ef4bbf394d5183a96d5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
94
Assets/Scripts/UI/UI3DBodyInfo.cs
Normal file
94
Assets/Scripts/UI/UI3DBodyInfo.cs
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using QFramework;
|
||||||
|
using XMLTool;
|
||||||
|
using DG.Tweening;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
namespace QFramework.Example
|
||||||
|
{
|
||||||
|
public class UI3DBodyInfoData : UIPanelData
|
||||||
|
{
|
||||||
|
public Body3D.Body body;
|
||||||
|
}
|
||||||
|
public partial class UI3DBodyInfo : UIPanel
|
||||||
|
{
|
||||||
|
protected override void OnInit(IUIData uiData = null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnOpen(IUIData uiData = null)
|
||||||
|
{
|
||||||
|
mData = uiData as UI3DBodyInfoData ?? new UI3DBodyInfoData();
|
||||||
|
PartName.text = mData.body.Name;
|
||||||
|
Group.onValueChanged.AddListener(isOn =>
|
||||||
|
{
|
||||||
|
TypeEventSystem.Global.Send<OnBody3DGroupTypeChanged>(new OnBody3DGroupTypeChanged() { isGroup = isOn });
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
Group.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "多选";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Group.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "单选";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
GameObject obj = Utility.FindObj(mData.body.Path);
|
||||||
|
Active.onValueChanged.AddListener(isOn =>
|
||||||
|
{
|
||||||
|
obj.SetActive(isOn);
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
Active.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "隐藏";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Active.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "显示";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Transparent.onValueChanged.AddListener(isOn =>
|
||||||
|
{
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
Transparent.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "实体";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Transparent.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "透明";
|
||||||
|
}
|
||||||
|
Utility.SetSurfaceType(obj.GetComponent<MeshRenderer>().material, isOn);
|
||||||
|
});
|
||||||
|
|
||||||
|
Single.onClick.AddListener(() =>
|
||||||
|
{
|
||||||
|
Body3DController.Instance.Active(obj, false, true);
|
||||||
|
});
|
||||||
|
TransparentOther.onValueChanged.AddListener(isOn =>
|
||||||
|
{
|
||||||
|
if (isOn)
|
||||||
|
{
|
||||||
|
TransparentOther.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "实体其他";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TransparentOther.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = "透明其他";
|
||||||
|
}
|
||||||
|
Body3DController.Instance.Transparent(obj, isOn, true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnShow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnHide()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnClose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Scripts/UI/UI3DBodyInfo.cs.meta
Normal file
11
Assets/Scripts/UI/UI3DBodyInfo.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c8ce0f6197762174eb582255a26c5fb9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -22,15 +22,16 @@ namespace QFramework.Example
|
|||||||
{
|
{
|
||||||
Content.RemoveAllChildren();
|
Content.RemoveAllChildren();
|
||||||
int index = 0;
|
int index = 0;
|
||||||
foreach (var item in Global.Instance.curModule.body3d.datas)
|
foreach (var item in Global.Instance.curModule.body3d.parts)
|
||||||
{
|
{
|
||||||
GameObject obj = GameObject.Instantiate(BtnItem.gameObject, Content);
|
GameObject obj = GameObject.Instantiate(BtnItem.gameObject, Content);
|
||||||
obj.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = item.Key;
|
obj.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = item.Key;
|
||||||
obj.GetComponent<Button>().onClick.AddListener(() =>
|
obj.GetComponent<Button>().onClick.AddListener(() =>
|
||||||
{
|
{
|
||||||
Global.Instance.cur3DBody = Global.Instance.curModule.body3d.datas[item.Key];
|
Global.Instance.cur3DPart = Global.Instance.curModule.body3d.parts[item.Key];
|
||||||
|
TypeEventSystem.Global.Send<OnBody3DStart>();
|
||||||
UIBody3DData data = new UIBody3DData();
|
UIBody3DData data = new UIBody3DData();
|
||||||
data.body = Global.Instance.cur3DBody;
|
data.body = Global.Instance.cur3DPart;
|
||||||
UIKit.OpenPanelAsync<UIBody3D>(canvasLevel: UILevel.PopUI, uiData: data).ToAction().StartGlobal(() =>
|
UIKit.OpenPanelAsync<UIBody3D>(canvasLevel: UILevel.PopUI, uiData: data).ToAction().StartGlobal(() =>
|
||||||
{
|
{
|
||||||
Hide();
|
Hide();
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using XMLTool;
|
|||||||
using TMPro;
|
using TMPro;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using DG.Tweening;
|
||||||
|
|
||||||
namespace QFramework.Example
|
namespace QFramework.Example
|
||||||
{
|
{
|
||||||
@ -24,18 +25,19 @@ namespace QFramework.Example
|
|||||||
mData = uiData as UIBody3DData ?? new UIBody3DData();
|
mData = uiData as UIBody3DData ?? new UIBody3DData();
|
||||||
BodyContent.RemoveAllChildren();
|
BodyContent.RemoveAllChildren();
|
||||||
Utility.FindObj(mData.body.Path).SetActive(true);
|
Utility.FindObj(mData.body.Path).SetActive(true);
|
||||||
foreach (var body in mData.body.Children)
|
foreach (var bodyData in mData.body.subBody)
|
||||||
{
|
{
|
||||||
|
var body = bodyData.Value;
|
||||||
var bodyItem = GameObject.Instantiate(BodyItem.gameObject, BodyContent);
|
var bodyItem = GameObject.Instantiate(BodyItem.gameObject, BodyContent);
|
||||||
bodyItem.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = body.Name;
|
bodyItem.transform.Find("Label").GetComponent<TextMeshProUGUI>().text = body.Name;
|
||||||
var bodyToggle = bodyItem.GetComponent<Toggle>();
|
var bodyToggle = bodyItem.GetComponent<Toggle>();
|
||||||
bodyToggle.isOn = body.isShow;
|
bodyToggle.isOn = body.isShow;
|
||||||
|
GameObject obj = Utility.FindObj(body.Path);
|
||||||
|
obj.SetActive(body.isShow);
|
||||||
bodyToggle.onValueChanged.AddListener(isOn =>
|
bodyToggle.onValueChanged.AddListener(isOn =>
|
||||||
{
|
{
|
||||||
Utility.FindObj(body.Path).SetActive(isOn);
|
obj.SetActive(isOn);
|
||||||
});
|
});
|
||||||
Utility.FindObj(body.Path).SetActive(body.isShow);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -84,6 +84,7 @@ namespace QFramework.Example
|
|||||||
var machin = StateMachineController.Instance;
|
var machin = StateMachineController.Instance;
|
||||||
var op = OperationController.Instance;
|
var op = OperationController.Instance;
|
||||||
var dev = DeviceController.Instance;
|
var dev = DeviceController.Instance;
|
||||||
|
var body3d = Body3DController.Instance;
|
||||||
ScoreController.Instance.Init();
|
ScoreController.Instance.Init();
|
||||||
UIKit.OpenPanelAsync<UIRightTop>().ToAction().StartGlobal(() =>
|
UIKit.OpenPanelAsync<UIRightTop>().ToAction().StartGlobal(() =>
|
||||||
{
|
{
|
||||||
|
|||||||
@ -168,16 +168,32 @@ namespace XMLTool
|
|||||||
public string Icon { get; set; }
|
public string Icon { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
|
|
||||||
|
public string Tip { get; set; }
|
||||||
|
|
||||||
|
public string Audio { get; set; }
|
||||||
|
|
||||||
public bool isShow = false;
|
public bool isShow = false;
|
||||||
public List<Body> Children { get; set; } = new List<Body>();
|
|
||||||
|
public ObjectToggle toggle;
|
||||||
|
public Dictionary<string, Body> subBody { get; set; } = new Dictionary<string, Body>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Dictionary<string, Body> datas = new Dictionary<string, Body>();
|
public Dictionary<string, Body> parts = new Dictionary<string, Body>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ObjectToggle
|
||||||
|
{
|
||||||
|
public ColorToggle color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ColorToggle
|
||||||
|
{
|
||||||
|
public string isOn;
|
||||||
|
public string isOff;
|
||||||
|
}
|
||||||
|
|
||||||
public class XmlParser
|
public class XmlParser
|
||||||
{
|
{
|
||||||
@ -348,8 +364,8 @@ namespace XMLTool
|
|||||||
module.body3d = new Body3D();
|
module.body3d = new Body3D();
|
||||||
foreach (var item in body3d.Elements("Body"))
|
foreach (var item in body3d.Elements("Body"))
|
||||||
{
|
{
|
||||||
var body = ParseBody(item);
|
var part = ParseBody(item);
|
||||||
module.body3d.datas.Add(body.Name, body);
|
module.body3d.parts.Add(part.Name, part);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -380,7 +396,9 @@ namespace XMLTool
|
|||||||
{
|
{
|
||||||
Icon = bodyElement.Attribute("icon")?.Value,
|
Icon = bodyElement.Attribute("icon")?.Value,
|
||||||
Name = bodyElement.Attribute("name")?.Value,
|
Name = bodyElement.Attribute("name")?.Value,
|
||||||
Path = bodyElement.Attribute("path")?.Value
|
Path = bodyElement.Attribute("path")?.Value,
|
||||||
|
Tip = bodyElement.Attribute("tip")?.Value,
|
||||||
|
Audio = bodyElement.Attribute("audio")?.Value
|
||||||
};
|
};
|
||||||
|
|
||||||
var isShow = bodyElement.Attribute("isShow");
|
var isShow = bodyElement.Attribute("isShow");
|
||||||
@ -388,9 +406,22 @@ namespace XMLTool
|
|||||||
{
|
{
|
||||||
bool.TryParse(isShow.Value, out body.isShow);
|
bool.TryParse(isShow.Value, out body.isShow);
|
||||||
}
|
}
|
||||||
|
var toggle = bodyElement.Element("ObjectToggle");
|
||||||
|
if (toggle != null)
|
||||||
|
{
|
||||||
|
body.toggle = new ObjectToggle();
|
||||||
|
var color = toggle.Element("Color");
|
||||||
|
if (color != null)
|
||||||
|
{
|
||||||
|
body.toggle.color = new ColorToggle();
|
||||||
|
body.toggle.color.isOn = color.Attribute("isOn")?.Value;
|
||||||
|
body.toggle.color.isOff = color.Attribute("isOff")?.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
foreach (var childElement in bodyElement.Elements("Body"))
|
foreach (var childElement in bodyElement.Elements("Body"))
|
||||||
{
|
{
|
||||||
body.Children.Add(ParseBody(childElement));
|
var subBody = ParseBody(childElement);
|
||||||
|
body.subBody.Add(subBody.Name, subBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
|
|||||||
@ -27,12 +27,28 @@
|
|||||||
<Body name="骨骼系统" path="Ren/Tou/GuGe" isShow="false">
|
<Body name="骨骼系统" path="Ren/Tou/GuGe" isShow="false">
|
||||||
<Body name="肋骨" path="Ren/Tou/GuGe/LeiGu">
|
<Body name="肋骨" path="Ren/Tou/GuGe/LeiGu">
|
||||||
<Body name="左肋" path="Ren/Tou/GuGe/LeiGu/ZuoLei">
|
<Body name="左肋" path="Ren/Tou/GuGe/LeiGu/ZuoLei">
|
||||||
<Body name="左一" path="Ren/Tou/GuGe/LeiGu/ZuoLei/1"></Body>
|
<Body name="左一" path="Ren/Tou/GuGe/LeiGu/ZuoLei/1" Tip="左一肋骨描述">
|
||||||
<Body name="左二" path="Ren/Tou/GuGe/LeiGu/ZuoLei/2"></Body>
|
<ObjectToggle>
|
||||||
|
<Color isOn="0,255,255" isOff="255,255,255"></Color>
|
||||||
|
</ObjectToggle>
|
||||||
|
</Body>
|
||||||
|
<Body name="左二" path="Ren/Tou/GuGe/LeiGu/ZuoLei/2" Tip="左二肋骨描述">
|
||||||
|
<ObjectToggle>
|
||||||
|
<Color isOn="0,255,255" isOff="255,255,255"></Color>
|
||||||
|
</ObjectToggle>
|
||||||
|
</Body>
|
||||||
</Body>
|
</Body>
|
||||||
<Body name="右肋" path="Ren/Tou/GuGe/LeiGu/YouLei">
|
<Body name="右肋" path="Ren/Tou/GuGe/LeiGu/YouLei">
|
||||||
<Body name="右一" path="Ren/Tou/GuGe/LeiGu/YouLei/1"></Body>
|
<Body name="右一" path="Ren/Tou/GuGe/LeiGu/YouLei/1" Tip="7右一肋骨描述">
|
||||||
<Body name="右二" path="Ren/Tou/GuGe/LeiGu/YouLei/2"></Body>
|
<ObjectToggle>
|
||||||
|
<Color isOn="0,255,255" isOff="255,255,255"></Color>
|
||||||
|
</ObjectToggle>
|
||||||
|
</Body>
|
||||||
|
<Body name="右二" path="Ren/Tou/GuGe/LeiGu/YouLei/2" Tip="右二肋骨描述">
|
||||||
|
<ObjectToggle>
|
||||||
|
<Color isOn="0,255,255" isOff="255,255,255"></Color>
|
||||||
|
</ObjectToggle>
|
||||||
|
</Body>
|
||||||
</Body>
|
</Body>
|
||||||
</Body>
|
</Body>
|
||||||
</Body>
|
</Body>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user