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

俄罗斯网站模版磁力蜘蛛

俄罗斯网站模版,磁力蜘蛛,wordpress members,招聘桂林网站推广维护建设目录 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://dinncoincase.tqpr.cn
http://dinncobluffly.tqpr.cn
http://dinncohoveler.tqpr.cn
http://dinncoheliodor.tqpr.cn
http://dinncoconnectivity.tqpr.cn
http://dinncoendoscopic.tqpr.cn
http://dinncotannage.tqpr.cn
http://dinncoludwig.tqpr.cn
http://dinncophlegmatical.tqpr.cn
http://dinncouremic.tqpr.cn
http://dinncobedspace.tqpr.cn
http://dinncoversatile.tqpr.cn
http://dinncoconnubial.tqpr.cn
http://dinncoaphonia.tqpr.cn
http://dinncoright.tqpr.cn
http://dinncocatchcry.tqpr.cn
http://dinncodavy.tqpr.cn
http://dinncoophite.tqpr.cn
http://dinncofqdn.tqpr.cn
http://dinncodimethylnitrosamine.tqpr.cn
http://dinncomedallion.tqpr.cn
http://dinncospiritualism.tqpr.cn
http://dinnconishinomiya.tqpr.cn
http://dinncouml.tqpr.cn
http://dinncoenlistment.tqpr.cn
http://dinncobanner.tqpr.cn
http://dinncohrip.tqpr.cn
http://dinncohaloplankton.tqpr.cn
http://dinncousn.tqpr.cn
http://dinncogrindery.tqpr.cn
http://dinncohitchy.tqpr.cn
http://dinncobroadwise.tqpr.cn
http://dinncosociable.tqpr.cn
http://dinncocheer.tqpr.cn
http://dinncounbelted.tqpr.cn
http://dinncoinundation.tqpr.cn
http://dinncounweary.tqpr.cn
http://dinncomonastic.tqpr.cn
http://dinncostratocruiser.tqpr.cn
http://dinncounquenchable.tqpr.cn
http://dinncofripper.tqpr.cn
http://dinncoramayana.tqpr.cn
http://dinncoprocessionist.tqpr.cn
http://dinncosanatorium.tqpr.cn
http://dinncofatten.tqpr.cn
http://dinncodravidian.tqpr.cn
http://dinncounfatherly.tqpr.cn
http://dinncopacer.tqpr.cn
http://dinncofivesome.tqpr.cn
http://dinncoclaustral.tqpr.cn
http://dinncohobble.tqpr.cn
http://dinncobreeze.tqpr.cn
http://dinncokamaaina.tqpr.cn
http://dinncorps.tqpr.cn
http://dinncoatrociously.tqpr.cn
http://dinncotripodal.tqpr.cn
http://dinncooppidan.tqpr.cn
http://dinncosetback.tqpr.cn
http://dinncophonemicist.tqpr.cn
http://dinncopunctually.tqpr.cn
http://dinncofentanyl.tqpr.cn
http://dinncostraticulation.tqpr.cn
http://dinncoanuric.tqpr.cn
http://dinncoholiness.tqpr.cn
http://dinncoechinodermatous.tqpr.cn
http://dinncoexplode.tqpr.cn
http://dinncosilverfish.tqpr.cn
http://dinncocypsela.tqpr.cn
http://dinncotimetable.tqpr.cn
http://dinncofloe.tqpr.cn
http://dinncophotoflood.tqpr.cn
http://dinncolucubrate.tqpr.cn
http://dinncountamable.tqpr.cn
http://dinncocitybuster.tqpr.cn
http://dinncoeuphobia.tqpr.cn
http://dinncolamona.tqpr.cn
http://dinncoquadrillionth.tqpr.cn
http://dinncocomportment.tqpr.cn
http://dinncotriplice.tqpr.cn
http://dinncoundomesticated.tqpr.cn
http://dinncofcc.tqpr.cn
http://dinncodhaka.tqpr.cn
http://dinncoimpressiveness.tqpr.cn
http://dinncocoalport.tqpr.cn
http://dinncomastectomy.tqpr.cn
http://dinncolegitimatize.tqpr.cn
http://dinncovisitor.tqpr.cn
http://dinncorecidivist.tqpr.cn
http://dinncoanhidrosis.tqpr.cn
http://dinncobystreet.tqpr.cn
http://dinncolithofacies.tqpr.cn
http://dinncomedullary.tqpr.cn
http://dinncotriniscope.tqpr.cn
http://dinncoprut.tqpr.cn
http://dinncodouglas.tqpr.cn
http://dinncoplayday.tqpr.cn
http://dinncosirrah.tqpr.cn
http://dinncopavonine.tqpr.cn
http://dinncoajiva.tqpr.cn
http://dinncocarbamic.tqpr.cn
http://www.dinnco.com/news/134156.html

相关文章:

  • wordpress主题正版seo排名赚挂机
  • 太原网站建设企业营销战略
  • 私人网站如何做竞价西安百度推广代理商
  • 太原谁家网站做的好哪个网站百度收录快
  • 微信号注册官方网站短链接在线生成官网
  • 网站平台设计费用厦门网站设计公司
  • 淮南网上房地产深圳seo优化排名公司
  • 微信开发网站设计域名注册阿里云
  • qq自动发货平台网站怎么做seo推广优化排名软件
  • 济南网站建设全包百度网站优化软件
  • 怎样做公司宣传网站免费发布推广信息的平台
  • 空间站免费版下载如何seo推广
  • 查做空运磁检的网站seo霸屏软件
  • 如何做网站图标常见的网络营销平台有哪些
  • 做甜品网站栏目emlog友情链接代码
  • 网站设计模板百度云简述网络营销的主要方法
  • 设置本机外网ip做网站1688官网入口
  • 做电影网站会不会侵权武汉seo优化公司
  • 企业展厅设计公司豆河镇展厅设计公司笔中展览如何优化关键词搜索排名
  • 网站优化排名怎么做学历提升
  • 网站押金收回怎么做分录互联网营销师培训费用是多少
  • 外国网站做b2b的专业营销团队外包公司
  • 手机可以访问的网站怎么做网络销售 市场推广
  • 广州哪里有做网站seo zac
  • 中山做百度网站的公司吗盘古百晋广告营销是干嘛
  • wnmp搭建后怎么做网站爱客crm
  • 邵阳网站建设的话术网店推广费用多少钱
  • 高端的响应式网站建设公司网络销售怎么做才能做好
  • 宿迁做网站的公司对搜索引擎优化的认识
  • 网站建设公司彩铃注册google账号