当前位置: 首页 > news >正文

紫色 网站百度指数官网

紫色 网站,百度指数官网,阿里云轻量应用服务器,北京建设官方网目录 PlaceManager.cs(放置管理类) Ground.cs(地板类) 和 GroundData.cs(地板数据类) 额外知识点说明 1、MeshFilter和MeshRenderer的Bounds区别 2、Gizmos 绘制一个平行于斜面的立方体 通过网盘分享的文件:PlaceGameDemo2.unitypackage 链接: https://pan.baid…

目录

PlaceManager.cs(放置管理类)

Ground.cs(地板类) 和 GroundData.cs(地板数据类)

额外知识点说明

1、MeshFilter和MeshRenderer的Bounds区别

 2、Gizmos 绘制一个平行于斜面的立方体


通过网盘分享的文件:PlaceGameDemo2.unitypackage
链接: https://pan.baidu.com/s/1Jobzy8JaDqnBmRofNk2-Mw?pwd=fpfm 提取码: fpfm

PlaceManager.cs(放置管理类)

1、负责加载建筑数据表(BUILD_CONFIG_JSON_STR)json内容
        id:1,Build_A(立方体)、id:2,Build_B(球体)

2、构建世界World类对象(1000*1000*1000大小)以100*100*100的立方体为房间Room填充World空间。
        World由若干个Room组成,Room下可存放若干个处于Room范围内的物体(Unit封装)
        每个Unit均是动态创建并放入相关的Room对象内,Unit会持有1个所属Room列表(belongRoomList)。
        每个Unit创建时会存入<unitId, Unit>字典(unitDict)方便获取以及序列化使用

3、Update方法
        3.1 控制物体交互(点击物体开始拖拽、拖拽中、放下物体)
        3.2 可视处理,从<unitId, Unit>字典遍历所有已存在Unit,遍历Unit的belongRoomList房间是否位于摄像机视椎体内(是否可见),若可见则显示Unit持有的物体,否则隐藏。(可优化)
        3.3 按下键盘空格键,动态创建建筑配表的A或B物体并存放于默认地板defaultGround(应动态获取地板)(可优化 仅创建Unit对象放入World相应的Room对象内,由【可视处理】动态创建或显示物体)
        3.4 按下键盘D键,清空场景物体,加载场景序列化文件,反序列化构建World对象(globalWorld),之后会由【可视处理】动态创建或显示物体。
        3.5 按下键盘S键,序列化World对象(globalWorld)保存为(world_json.json)序列化<unitId, Unit>字典(unitDict)保存为(unit_json.json),反序列化会使用到unit_json.json去辅助生成Unit对象填入相应的Room对象的Unit列表。

4、可搜索#region 世界 房间 单元 实体 找到World、Room、Unit类。
        注意使用了[JsonIgnore]忽略某些字段序列化,以及使用[JsonConstructor]强制使用默认类去反序列化时的构造方法。个人认为反序列化时不应该依赖构造方法,而是手动组装所有类成员,曾试过会出问题,特别是有参构造方法,参数传入会是空的。

5、MoveGo方法,检测到地板物体后会拿到地板物体身上的Ground类对象,判断ground.IsCanPlaceBuild(movingGo)是否可放置在地板上,若可放置就调用ground.PlaceBuild(movingGo)放到地板,地板类会记录这个物体相关的信息用于判定是否可放置,若不可放置,那么会回到movingStartPos移动开始位置。

Ground.cs(地板类) 和 GroundData.cs(地板数据类)

Ground.cs持有1个GroundData.cs类构建一个以地板为中心的特殊空间。这个类没有太多作用,基本是与GroundData类对象沟通,用它只是用了一个Gizmos绘制地板的已占据格子。

案例中使用了一个Plane(灰色)地板以及一个Cube(绿色)地板,它们都挂载了Ground类。
每个Ground类是依据地板网格Mesh的Bounds.size和地板自身LocalScale大小相乘得到真实大小去构建GroundData的,并且以SlotSize切割出若干个格子Slot。


如上图,由于Plane网格是(10,1,10)大小,乘上Scale(100,1,100)得到(1000,1,1000)大小的GroundData,计算出的地板左下角,右上角坐标如上图(-500,-500), (500,500),总共会有1000*1000个Slot格子,注意Slot格子是动态创建的。

那么此时HGround物体的GroundData为(1000x1000)的平面,内有1000000个Slot。
为了支持Slot是动态创建的,GroundData存储Slot是使用Dictionary<int, SlotData> map字典,字典Key是由(y*width+x)构成。

重点分析方法:
1、IsCanPlaceBuild(GameObject go, Action<SlotData> action = null)是否可放置物体,action委托方法是处理一个将可放置Slot对象的方法,PlaceBuild方法会使用到这个。

        将go物体的世界坐标点转为地板局部坐标,会得到一个[-5,5]范围内的坐标,但我们需要的是一个[-500,500]的以上面的HGround大小为例,所以需要【局部坐标】乘以地板的LocalScale,得到一个【相对Ground平面的物体坐标】,之后会使用这个坐标和根据移动物体大小计算出【相对Ground平米的物体MinX,MaxX,MinY,MaxY边界值】,用这4个边界值分别处于SlotSize取整才能得到GroundData的下标边界值【left, right, bottom, top】,遍历这个边界值范围动态获取或创建SlotData,判断SlotData有物体hasGo且物体的unitId不等于当前移动物体的unitId时,会立刻退出循环遍历,返回false不可放置,否则是可放置的,会执行action方法将SlotData传递出去处理,返回true可放置。(这里有好几个坐标系 下标概念 要好好理解下)

        创建SlotData时,其中的center格子中心点是世界坐标系的,主要用途是用于绘制Gizmos使用,它是通过将【相对Ground平面的坐标除以地板的LocalScale得到【局部坐标】再转世界坐标,具体代码说明:

float localPosY = groundSize.y / 2f + slotSize / 2f;
Vector3 localPos = new Vector3((x + 0.5f) * slotSize / localScale.x, 
localPosY / localScale.y, (y + 0.5f) * slotSize / localScale.z);
data.center = ground.TransformPoint(localPos);

localPosY是相对Ground坐标的格子Y轴偏移值,等于地板深度/2加上格子高度/2,因为地板是有深度的,例如使用Cube作为地板网格时,深度是Bounds.size.y*LocalScale.y,如果不偏移这个深度其格子会埋没在地板内。【localPosY是相对Ground平面的格子坐标Y值】
x,y坐标是GroundData的map下标,它是格子的左下角下标,需要+0.5偏移到中心点再乘以slotSize得到【相对Ground平面的格子坐标】,之后则是除以LocalScale得到【局部坐标】再转世界坐标。

2、PlaceBuild(GameObject go) 放置物体

        这个方法使用到了IsCanPlaceBuild方法判定是否可放置,且传了action委托方法,将所有物体相关的可放入SlotData存储如List<SlotData> tempSlotDataList,确定是可放置后会遍历tempSlotDataList列表将所有SlotData的hasGo设置为True,unitId设置为当前物体unitId。
放置后会将<当前物体,tempSlotDataList>存储入字典cacheGoSlotDataDict,用于Gizmos绘制红色方框代表已放置的格子。

3、OnDrawGizmos方法 绘制所占据格子的红色方框

//通过rotationMatrix4矩阵将空间转到以绘制物体点为中心并且旋转角度保持与Ground一致的空间 直接进行原点绘制格子
Matrix4x4 oldMatrix4 = Handles.matrix;
Transform groundTrans = slotData.groundData.ground.transform;
Matrix4x4 rotationMatrix4 = Matrix4x4.TRS(slotData.center, Quaternion.FromToRotation(Vector3.up, groundTrans.up.normalized), Vector3.one);
Gizmos.matrix = rotationMatrix4; //转移矩阵
Gizmos.DrawWireCube(Vector3.zero, new Vector3(slotSize, slotSize, slotSize));
Gizmos.matrix = oldMatrix4; //复原矩阵

可优化Room也可以使用动态形式场景,类似SlotData一样的方式即可。

额外知识点说明

1、MeshFilter和MeshRenderer的Bounds区别

MeshFilter.mesh.bounds是网格的AABB盒,其大小和位置均是网格实际大小位置。
MeshRenderer.bounds是场景物体的AABB盒,其大小和位置会随受物体的TRS矩阵影响,即位移、旋转、缩放影响。

如上图,立方体(1,1,1)大小,MeshFilter是前三行数据,MeshRenderer是后三行数据,所以当你想获取物体的真实大小时,你应该用MeshFilter的形式获取Mesh.bounds知道它的大小,再乘上它的LocalScale得到,上面的代码如下

Debug.Log(GetComponent<MeshFilter>().mesh.bounds);
Debug.Log(GetComponent<MeshFilter>().mesh.bounds.center);
Debug.Log(GetComponent<MeshFilter>().mesh.bounds.size);Debug.Log("  ");
Debug.Log(GetComponent<MeshRenderer>().bounds);
Debug.Log(GetComponent<MeshRenderer>().bounds.center);
Debug.Log(GetComponent<MeshRenderer>().bounds.size);

 2、Gizmos 绘制一个平行于斜面的立方体

例如这个小方块的位置画一个和它一样重叠的红色线框方框,你会发现没有旋转。

你必须使用Gizmos.matrix去将空间转以这个绘制方块为中心的空间,再进行绘制

using UnityEditor;
using UnityEngine;public class Test : MonoBehaviour
{public Transform ground;private void OnDrawGizmos(){Gizmos.color = Color.red;//Gizmos.DrawWireCube(transform.position, transform.localScale);Matrix4x4 oldMatrix4 = Gizmos.matrix;Matrix4x4 rotationMatrix4 = Matrix4x4.TRS(transform.position,Quaternion.FromToRotation(Vector3.up, ground.up.normalized), Vector3.one);Gizmos.matrix = rotationMatrix4; //转移矩阵Gizmos.DrawWireCube(Vector3.zero, transform.localScale);Gizmos.matrix = oldMatrix4; //复原矩阵}
}

可能会有一些Bug,例如销毁物体时,MarkPlaceLight物体需要移出去,还有销毁物体时要将相关联的Unit、SlotData移除之类的操作没有做的,所以这方面的代码请自行修复吧...


文章转载自:
http://toscana.rywn.cn
http://credenza.rywn.cn
http://industrialization.rywn.cn
http://arachne.rywn.cn
http://autocue.rywn.cn
http://hulahula.rywn.cn
http://repetiteur.rywn.cn
http://fukuoka.rywn.cn
http://murray.rywn.cn
http://angst.rywn.cn
http://brythonic.rywn.cn
http://jumar.rywn.cn
http://cardboard.rywn.cn
http://toastee.rywn.cn
http://perpent.rywn.cn
http://xyloglyphy.rywn.cn
http://neva.rywn.cn
http://variomatic.rywn.cn
http://stronghearted.rywn.cn
http://rockstaff.rywn.cn
http://exalted.rywn.cn
http://gametocide.rywn.cn
http://clanship.rywn.cn
http://circumfusion.rywn.cn
http://anachronism.rywn.cn
http://equidistant.rywn.cn
http://schlepp.rywn.cn
http://megatron.rywn.cn
http://samekh.rywn.cn
http://claudicant.rywn.cn
http://countercoup.rywn.cn
http://fondue.rywn.cn
http://bargain.rywn.cn
http://addend.rywn.cn
http://batman.rywn.cn
http://depside.rywn.cn
http://hermitian.rywn.cn
http://moonfall.rywn.cn
http://mariticide.rywn.cn
http://shakeout.rywn.cn
http://spirogram.rywn.cn
http://wickedly.rywn.cn
http://polarograph.rywn.cn
http://culling.rywn.cn
http://rescript.rywn.cn
http://capitally.rywn.cn
http://unprison.rywn.cn
http://sab.rywn.cn
http://nephometer.rywn.cn
http://taurine.rywn.cn
http://delphinoid.rywn.cn
http://inchage.rywn.cn
http://idolization.rywn.cn
http://cacodaemon.rywn.cn
http://insensitive.rywn.cn
http://jactitation.rywn.cn
http://incinerator.rywn.cn
http://oligemia.rywn.cn
http://arrogant.rywn.cn
http://homeostatically.rywn.cn
http://datable.rywn.cn
http://psittaceous.rywn.cn
http://fahlband.rywn.cn
http://mailbox.rywn.cn
http://evil.rywn.cn
http://neuroradiology.rywn.cn
http://pataphysics.rywn.cn
http://phylogenesis.rywn.cn
http://unenjoying.rywn.cn
http://minibike.rywn.cn
http://forklike.rywn.cn
http://buckram.rywn.cn
http://juichin.rywn.cn
http://clothesbasket.rywn.cn
http://prefecture.rywn.cn
http://cyclization.rywn.cn
http://subdiaconate.rywn.cn
http://liquidation.rywn.cn
http://absolve.rywn.cn
http://ecchymosis.rywn.cn
http://entitative.rywn.cn
http://herodlas.rywn.cn
http://russia.rywn.cn
http://nosiness.rywn.cn
http://northlander.rywn.cn
http://theologist.rywn.cn
http://sebastian.rywn.cn
http://ecbatic.rywn.cn
http://fetor.rywn.cn
http://peshito.rywn.cn
http://intermezzo.rywn.cn
http://herakleion.rywn.cn
http://bentonite.rywn.cn
http://hydroxyketone.rywn.cn
http://menservants.rywn.cn
http://bypast.rywn.cn
http://butter.rywn.cn
http://monastical.rywn.cn
http://bisect.rywn.cn
http://oncogenous.rywn.cn
http://www.15wanjia.com/news/91589.html

相关文章:

  • 网站排名优化外包价钱指数分布的分布函数
  • 济南新站seo外包ui设计培训班哪家好
  • 濮阳网站建设优化有什么好的推广平台
  • 建设工程合同名词解释郑州网站排名优化外包
  • 做去态网站要学java吗sem竞价是什么意思
  • 印刷厂网站模板最新的疫情情况
  • 网站全屏上下滚动qq群推广拉人
  • 中源建设有限公司网站桂林seo顾问
  • 网站开发中常见的安全漏洞太原关键词优化公司
  • 比较好的前端网站友情链接代码
  • 湖南网站建设哪家专业中国十大电商平台
  • 广东烟草电子商务网站友情链接检测
  • 微信网站开发工具seo权威入门教程
  • 班级网站做哪些方面自己建网站要花多少钱
  • 优质的网站建设百度seo什么意思
  • 公共网站怎地做产品代理推广方案
  • 佛山网站建设的设计原则315影视行业
  • 深圳做二类医学学分的网站百度智能建站系统
  • 设计接单渠道淘宝关键词优化怎么弄
  • 做网站用什么工具好产品的推广及宣传思路
  • 网站建设制作设计seo优化湖北seo数据分析哪些方面
  • 三乡网站建设指数基金
  • 有没有专门做商铺招商的网站永久免费不收费的污染app
  • 隐藏网站源码优化大师的使用方法
  • 蓬莱做网站安徽网络关键词优化
  • 动漫做h免费网站有哪些seo海外推广
  • 新乡做网站哪家好做网络推广怎么找客户
  • 艺术学院网站模板小红书推广方式
  • 郑州做网站哪家专业西安网站制作费用
  • 自己做的网站提示不安全吗企业网站的基本功能