当前位置:网站首页>Unity自动生成阻挡Collider的GameObject工具
Unity自动生成阻挡Collider的GameObject工具
2022-08-04 05:25:00 【丁小未】
前言
场景中会有碰撞阻挡,或者触发器,一般是美术或者策划配置,策划一般是直接配置collider,但为了调试方便,需要显示对应的mesh方便查看防止的位置是否正确,我们可以写个工具来控制生成mesh和删除mesh方便调试使用。
思路
一般就是几种内置的collider,meshcollider、boxcollider、capsulecollider、spherecollider等,我们判断出对应的collider,然后创建unity内置的一些GameObject即可,meshcollider只需要实例化collider的mesh即可。
效果



代码
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Sirenix.Utilities.Editor;
using Sirenix.OdinInspector;
using System;
public class ColliderMeshGenerateTool : MonoBehaviour
{
bool show = false;
List<GameObject> mColliderObjCache = new List<GameObject>();
List<GameObject> mGameObjects = new List<GameObject>();
[ShowInInspector]
public bool Show
{
get
{
return show;
}
set
{
ChangeState(value);
show = value;
}
}
void Start()
{
mGameObjects = GetAllSceneObjectsWithInactive();
}
private void ChangeState(bool isShow)
{
if (isShow)
{
foreach (var obj in mGameObjects)
{
if (obj.GetComponent<MeshRenderer>() == null)
AnalyzeCollider(obj);
}
}
else
{
for (int i = mColliderObjCache.Count - 1; i >= 0; i--)
{
GameObject.DestroyImmediate(mColliderObjCache[i]);
}
mColliderObjCache.Clear();
}
}
private void AnalyzeCollider(GameObject obj)
{
var collider = obj.GetComponent<Collider>();
if (collider == null)
{
Debug.LogError("不存在Collider");
return;
}
Type type = collider.GetType();
GameObject tempObj = null;
if (type == typeof(SphereCollider))
{
tempObj = CreatePrimitiveGameObject(obj.transform, PrimitiveType.Sphere);
var sphereCollider = obj.GetComponent<SphereCollider>();
tempObj.transform.localScale = sphereCollider.radius * Vector3.one * 2;
}
else if (type == typeof(BoxCollider))
{
tempObj = CreatePrimitiveGameObject(obj.transform, PrimitiveType.Cube);
var boxCollider = obj.GetComponent<BoxCollider>();
tempObj.transform.localScale = boxCollider.size;
}
else if (type == typeof(MeshCollider))
{
tempObj = CreateGameObject(obj.transform, "MeshGameObject");
tempObj.AddComponent<MeshRenderer>();
var filter = tempObj.AddComponent<MeshFilter>();
var meshCollider = obj.GetComponent<MeshCollider>();
filter.mesh = meshCollider.sharedMesh;
}
else if (type == typeof(CapsuleCollider))
{
tempObj = CreatePrimitiveGameObject(obj.transform, PrimitiveType.Capsule);
var capsuleCollider = obj.GetComponent<CapsuleCollider>();
var doubleRadius = capsuleCollider.radius * 2;
var tempScaleY = capsuleCollider.height < capsuleCollider.radius * 2 ? capsuleCollider.radius : capsuleCollider.height / 2;
tempObj.transform.localScale = new Vector3(doubleRadius, tempScaleY, doubleRadius);
}
if (tempObj != null)
mColliderObjCache.Add(tempObj);
}
private GameObject CreatePrimitiveGameObject(Transform parent, PrimitiveType type = PrimitiveType.Cube)
{
var obj = GameObject.CreatePrimitive(type);
obj.transform.parent = parent;
ResetTransformData(obj);
return obj;
}
private GameObject CreateGameObject(Transform parent, string name)
{
var obj = new GameObject(name);
obj.transform.parent = parent;
ResetTransformData(obj);
return obj;
}
private void ResetTransformData(GameObject obj)
{
obj.transform.localPosition = Vector3.zero;
obj.transform.localRotation = Quaternion.Euler(Vector3.zero);
obj.transform.localScale = Vector3.one;
}
/// <summary>
/// Select All ActiveInHierarchy GameObject in Hierarchy
/// </summary>
/// <returns></returns>
private List<GameObject> GetAllSceneObjectsWithInactive()
{
var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
var previousSelection = Selection.objects;
Selection.objects = allTransforms.Cast<Transform>()
.Where(x => x != null)
.Select(x => x.gameObject)
.Where(x => x != null && x.activeInHierarchy)
.Where(x => x.GetComponent<Collider>() != null)
.Cast<UnityEngine.Object>().ToArray();
var selectedTransforms = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);
Selection.objects = previousSelection;
return selectedTransforms.Select(tr => tr.gameObject).ToList();
}
}
#endif
更多精品教程
边栏推荐
- Resolved error: npm WARN config global `--global`, `--local` are deprecated
- C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.5 数组和指针的其他区别
- CentOS7 - yum install mysql
- Write golang simple C2 remote control based on gRPC
- flink cdc一启动,源端Oracle那台服务器的CPU就飙升到80%以上,会是啥原因呢?
- 代码重构:面向单元测试
- Grain Mall - Basics (Project Introduction & Project Construction)
- C Expert Programming Chapter 5 Thinking about Chaining 5.6 Take it easy --- see who's talking: take the Turning quiz
- C专家编程 第5章 对链接的思考 5.1 函数库、链接和载入
- 部署LVS-DR群集【实验】
猜你喜欢

编程大杂烩(四)

leetcode 12. Integer to Roman numeral

Delphi-C端有趣的菜单操作界面设计

TensorRT例程解读之语义分割demo
![[Evaluation model] Topsis method (pros and cons distance method)](/img/e7/c24241faced567f3e93f6ff3f20074.png)
[Evaluation model] Topsis method (pros and cons distance method)

npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND

败给“MySQL”的第60天,我重振旗鼓,四面拿下蚂蚁金服offer

npm报错Beginning October 4, 2021, all connections to the npm registry - including for package installa

触觉智能分享-SSD20X实现升级显示进度条

Summary of MySQL database interview questions (2022 latest version)
随机推荐
(Kettle) pdi-ce-8.2 连接MySQL8.x数据库时驱动问题之终极探讨及解决方法分析
Redis common interview questions
Sublime Text 3 2021.8.3 个人配置
C专家编程 第5章 对链接的思考 5.1 函数库、链接和载入
8、自定义映射resultMap
7.13 Day20----MYSQL
Interesting Kotlin 0x0E: DeepRecursiveFunction
TSF微服务治理实战系列(一)——治理蓝图
MySQL数据库(基础)
MySQL date functions
SLSA 框架与软件供应链安全防护
C专家编程 第5章 对链接的思考 5.2 动态链接的优点
static在不同位置定义变量居然还有不同的含义?
7. Execution of special SQL
About yolo7 and gpu
Resolved error: npm WARN config global `--global`, `--local` are deprecated
OpenSSF 安全计划:SBOM 将驱动软件供应链安全
如何将 DevSecOps 引入企业?
[Cocos] cc.sys.browserType可能的属性
canal实现mysql数据同步