在自己制作项目的时候,限制玩家可移动范围,需要手动去摆一个一个collider,感觉好麻烦,于是写了一个工具,画好路径后,就可以一键生成碰撞体了: 
先看效果: 
这是绘制路径:

这是生成碰撞墙的效果:


看着感觉还不错,比用手去摆方便,下面是代码:

using UnityEngine;
using System;public class FenceWall : MonoBehaviour {/// <summary>/// 尺寸 x:宽度 y高度/// </summary>public Vector2 Size = new Vector2(1, 10);/// <summary>/// 补漏/// </summary>public float BareSize = 0.5f;/// <summary>/// 路径/// </summary>public Transform PathParent;/// <summary>/// 是否闭合路径/// </summary>public bool IsClose = false;/// <summary>/// 是否绘制路径/// </summary>public bool IsGizmos = false;/// <summary>/// 创建碰撞墙/// </summary>public void CreateFenceWall(){if (PathParent == null) return;//查找已生成碰撞墙Transform target = transform.Find("FenceWall");if (target != null){DestroyImmediate(target.gameObject);}//生成新的碰撞墙GameObject parent = new GameObject("FenceWall");parent.transform.localPosition = Vector3.zero;parent.transform.localScale = Vector3.one;//遍历路径TraversePath(delegate(Transform trans1,Transform trans2) {CreateWall(trans1, trans2, delegate (GameObject go) {go.transform.parent = parent.transform;});});parent.transform.parent = transform;}/// <summary>/// 生成碰撞墙/// </summary>/// <param name="pos1"></param>/// <param name="pos2"></param>/// <param name="onCreate"></param>private void CreateWall(Transform pos1, Transform pos2,Action<GameObject> onCreate){GameObject go = new GameObject(pos1.name+"->"+pos2.name);float dis = Vector3.Distance(pos1.position, pos2.position);BoxCollider bc =go.AddComponent<BoxCollider>();bc.size = new Vector3(dis+ BareSize, Size.y , Size.x);bc.center = new Vector3(0,Size.y/2,0);go.transform.parent = transform;go.layer = 1<<LayerMask.GetMask("Wall");//计算坐标go.transform.position = pos1.position + (pos2.position - pos1.position).normalized*(dis*0.5f);//计算旋转float z = pos1.position.z - pos2.position.z;float angle = Mathf.Asin(z/dis)*Mathf.Rad2Deg;//计算旋转朝向float dir = pos1.position.x - pos2.position.x > 0 ? -1 : 1;go.transform.rotation = Quaternion.Euler(new Vector3(0,angle* dir, 0));if (onCreate != null)onCreate(go);}/// <summary>/// 遍历路径/// </summary>/// <param name="onTraverse"></param>void TraversePath(Action<Transform, Transform> onTraverse){int childCount = PathParent.childCount;if (childCount > 2){for (int i = 0; i < childCount; i++){Transform child1 = PathParent.GetChild(i);Transform child2 = null;if (i == childCount - 1){if (IsClose)child2 = PathParent.GetChild(0);elsebreak;}elsechild2 = PathParent.GetChild(i + 1);if (onTraverse != null)onTraverse(child1,child2);}}}/// <summary>/// 绘制路径/// </summary>void OnDrawGizmos(){if (!IsGizmos) return;if (PathParent == null) return;TraversePath(delegate (Transform trans1, Transform trans2){Gizmos.DrawLine(trans1.position, trans1.position);});}
}

编辑器类(就是加了一个按钮):

using UnityEngine;
using UnityEditor;[CustomEditor(typeof(FenceWall))]
public class FenceWallInspector : Editor {public override void OnInspectorGUI(){base.OnInspectorGUI();FenceWall fw = (FenceWall)target;if (GUILayout.Button("Create Wall")){fw.CreateFenceWall();}}}

面板属性:


将此脚本挂载到GameObject上,设置路径,最后点击CreateWall按钮即可。

最后看看我的场景中的应用:


省事还规整

Unity3d 根据布线,自动生成碰撞墙相关推荐

  1. Unity3d 怪物的自动生成

    首先在场景中窗前一个空物体empty 将其设置为预置prefab.然后创建一个脚本来控制他. 在编写脚本的时候需要注意的几点是 1.怪物生成的间隔2.怪物生成的种类3.怪物生成的数量  是要设置为pu ...

  2. unity3d 自动变化大小_自动做游戏(1),自动生成人物侧面图

    文 @罗培羽 效果 游戏美术成本很高,如果能够应用一些深度学习的方法,让机器自动生成美术资源,那么游戏开发将会变得简单.尝试制作一个应用,根据人物正面图自动生成侧面图.效果如下图,对于像素类图片,效果 ...

  3. 【Unity3D日常开发】生成预制体,并且预制体自动销毁

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 今天有粉丝问我一个很简单的问题,如何生成预制体,并且让预制体自动销 ...

  4. 自动给文本框输入值_Dynamo for Revit自动生成门窗图例详图

    在知乎上看到九哥BIMer写的Dynamo自动创建门窗详图的文章,虽然文章比较简短,但是主要的思路还是写的很清楚.那篇文章并没有给出Dynamo源文件,本着好学的心态,参照九哥BIMer的思路,经过一 ...

  5. quicktype游戏java程序_使用QuickType工具从json自动生成类型声明代码

    一.QuickType 工具功能简介 QuickType 是一款可以根据 json 文本生成指定语言(如 Type Script,C++,,Java,C#,Go 等)类型声明代码的工具. 例如我们在写 ...

  6. php怎样规定密码混合,PHP产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合...

    /** * 产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合 * @param string $len 长度 * @param string $type 字串类型 * 0 字母 1 数字 ...

  7. 自动做游戏(1):自动生成人物侧面图

    效果 游戏美术成本很高,如果能够应用一些深度学习的方法,让机器自动生成美术资源,那么游戏开发将会变得简单.尝试制作一个应用,根据人物正面图自动生成侧面图.效果如下图,对于像素类图片,效果还是不错的. ...

  8. 为音视频自动生成字幕的python工具

    目录 为音视频自动生成字幕的 python 工具 autosub autosub3 安装 使用 为音视频自动生成字幕的 python 工具 autosub 是一个能自动为音视频生成字幕的 pytho ...

  9. 如何自动生成推荐歌单:ACM论文翻译与解读 | Translation and Interpretation of ACM Survey

    如何自动生成推荐歌单:ACM论文翻译与解读 | How to Automatically Generate Music Playlists: Translation and Interpretatio ...

最新文章

  1. sql plus特殊使用技巧
  2. StackOverflow热帖:Java整数相加溢出怎么办?
  3. SQL 模糊查询技术
  4. 如何在Hybris Commerce的backoffice里创建扩展字段
  5. bootstrap --- 面板
  6. [css] 请使用CSS画一个带锯齿形边框圆圈
  7. 《python透明人士,他是凭什么成为主流编程的宠儿?!》Python 逻辑
  8. 【Java 数据结构】二叉树的遍历和基本操作
  9. 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)
  10. Netty入门之HelloWorld
  11. 21个GIF动图让你了解各种数学概念
  12. 虚拟主机支持ssl支持php7,虚拟主机支持https改造吗
  13. 社会工程学之《反欺骗的艺术》小结(三)
  14. Servlet概述及其原理
  15. 【PMP】PMBOK 笔记 第10章 项目沟通管理
  16. 数据库面试题:Redis如何保证数据一致性
  17. “所选的用户密钥未在远程主机上注册,请再试一次”问题解决
  18. 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
  19. web学习笔记-html-html新增
  20. JavaScript复习

热门文章

  1. Linux下安装配置各种软件和服务
  2. MSDC 4.3 接口规范(30)
  3. 照片怎么转换成jpg?常见渠道一览
  4. 印度软件与信息服务业发展经验及启示
  5. 《伟大是熬出来的》冯仑与年轻人闲话人生之三
  6. R02-javaWeb-ServletConfigServletConfig
  7. java 僵尸进程_神奇的Java僵尸(defunct)进程问题排查过程
  8. 同心拼图(concentric mosaics)
  9. 入职腾讯第九年,我辞职了
  10. 2022款戴尔游匣g15和联想拯救者y9000p的区别