unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成。还修复了接近石头后,挖掘图标不出现的bug。目前可以在unity中稳定60-70fps。
详看文章:https://www.cnblogs.com/lixiaoyao123/p/9710601.html
更新后的代码:(还是比较乱 没整理也没写注释,最后一块说明)
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class StartMap : MonoBehaviour {
private GameObject Bridge;
private GameObject Cliff;
private GameObject Dirt;
private GameObject Grass1;
private GameObject Grass2;
private GameObject Rock;
private GameObject Sand;
private GameObject Tree;
private GameObject Grass01;
private GameObject Grass02;
private GameObject Props_Rock;
private Vector3 location;
private float xpos, ypos, zpos;
private int randnum;
private GameObject selectedobject;
private GameObject selectOther;
private bool iscompeleted = false; public GameObject envfather;
// Use this for initialization private void Start()
{
Time.timeScale = ;
createmap(); } private void Update()
{
if(iscompeleted)
{
DeletePrefab();
Time.timeScale = ;
Destroy(this.gameObject);
} }
void DeletePrefab()
{
Bridge.transform.position = new Vector3(, -, );
Cliff.transform.position = new Vector3(, -, );
Dirt.transform.position = new Vector3(, -, );
Grass1.transform.position = new Vector3(, -, );
Grass2.transform.position = new Vector3(, -, );
Rock.transform.position = new Vector3(, -, );
Sand.transform.position = new Vector3(, -, );
Grass01.transform.position = new Vector3(, -, );
Grass02.transform.position = new Vector3(, -, );
Tree.transform.position = new Vector3(, -, );
} void RenewPrefab()
{
Bridge = (GameObject)Instantiate(Resources.Load("Prefabs/Bridge"));
Cliff = (GameObject)Instantiate(Resources.Load("Prefabs/Cliff"));
Dirt = (GameObject)Instantiate(Resources.Load("Prefabs/Dirt"));
Grass1 = (GameObject)Instantiate(Resources.Load("Prefabs/Grass1"));
Grass2 = (GameObject)Instantiate(Resources.Load("Prefabs/Grass2"));
Rock = (GameObject)Instantiate(Resources.Load("Prefabs/Rock"));
Sand = (GameObject)Instantiate(Resources.Load("Prefabs/Sand"));
Tree = (GameObject)Instantiate(Resources.Load("Prefabs/Tree_01"));
Grass01 = (GameObject)Instantiate(Resources.Load("Prefabs/Grass_01"));
Grass02 = (GameObject)Instantiate(Resources.Load("Prefabs/Grass_02"));
Props_Rock = (GameObject)Instantiate(Resources.Load("Prefabs/Props_Rock"));
DeletePrefab();
} void createmap()
{
for (xpos = -; xpos <= ; xpos++)
{
for(zpos = -; zpos <= ; zpos++)
{
RenewPrefab();
randnum = Random.Range(, );
SelectPrefab(randnum);
selectedobject.transform.position = new Vector3(xpos, ypos, zpos);
selectedobject.transform.parent = envfather.transform;
CreateOthers(selectedobject);
if(xpos == && zpos == )
{
DeletePrefab();
iscompeleted = true;
break;
}
}
} } private void SelectPrefab( int rand)
{ if ( <= rand & rand < )
{
selectedobject = Cliff;
}
else if( <= rand & rand < )
{
selectedobject = Dirt;
}
else if ( <= rand & rand < )
{
selectedobject = Grass1;
}
else if ( <= rand & rand < )
{
selectedobject = Grass2;
}
else if ( <= rand & rand < )
{
selectedobject = Rock;
}
else
{
selectedobject = Sand;
} } void CreateOthers(GameObject selectObject)
{
int i = Random.Range(, );
if(selectObject==Grass1)
{
if (i > )
{
selectOther = Tree;
selectOther.transform.position = selectObject.transform.position;
if (i > && i <=)
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i > && i <= )
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i > && i <= )
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i > && i <= )
{
selectOther.transform.eulerAngles = new Vector3(, -, );
}
selectOther.transform.parent = selectObject.transform;
} }
else if(selectObject == Grass2)
{
if (<i&&i<)
{
selectOther = Grass01;
selectOther.transform.position = selectObject.transform.position;
selectOther.transform.parent = selectObject.transform;
}
else if(i>=&&i<)
{
selectOther = Grass02;
selectOther.transform.position = selectObject.transform.position;
selectOther.transform.parent = selectObject.transform;
}
}
else if(selectObject == Dirt)
{
if(i>)
{
selectOther = Grass02;
selectOther.transform.position = selectObject.transform.position;
selectOther.transform.parent = selectObject.transform;
}
}
else if(selectObject == Rock)
{
if (i >=)
{
selectOther = Props_Rock;
selectOther.transform.position = selectObject.transform.position;
if (i >&&i<)
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i >= && i < )
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i >= && i < )
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if (i >= && i < )
{
selectOther.transform.eulerAngles = new Vector3(, -, );
}
selectOther.transform.parent = selectObject.transform;
} }
else if (selectObject == Cliff)
{
if (i >=)
{
selectOther = Props_Rock;
selectOther.transform.position = selectObject.transform.position;
if (i >&&i<)
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
else if(i >=)
{
selectOther.transform.eulerAngles = new Vector3(, , );
}
selectOther.transform.parent = selectObject.transform;
} } } }
其中在selectedobjet创建之后,用createothers函数判断当前的cube类型,在相应的位置上生成相应的资源,比如石头,草,树木。其中资源的类型和旋转再用随机数进行随机产生。
另外,优化方面,在建立世界后删除这个脚本,并且删除前,把缓存预先生成的物体destroy掉。
至于ui挖掘图片的显示,是因为之前把canvas给误删了,再加上之后,把摄像头选为world space就能正常显示了。
目前的效果:


目前大概就这样。优化方面体会很多,首先是代码逻辑要简化,还要注意update中,尽量不要设计太复杂的算法。能预先载入的,能异步执行的尽量做,节省cpu和gpu。
至于渲染方面,shader编程还没涉及到,很深的学问。。。
随即世界的生成完成了大概20%预期,接下来要做更复杂的。今天就这样。
unity独立游戏开发日记2018/09/27的更多相关文章
- unity独立游戏开发日志2018/09/22
f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...
- unity独立游戏开发日志2018/09/26
最近太忙,今天吃饭的时候灵感一现...想到了随机地图生成的方法,不过可能实现的比较笨...还需要优化,大佬绕过. 注释没打,最后统一解释. using System.Collections; usin ...
- Unity3D独立游戏开发日记(二):摆放建筑物
在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...
- Unity3D独立游戏开发日记(一):动态生成树木
目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...
- Unity 2D游戏开发教程之精灵的死亡和重生
Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...
- Unity 2D游戏开发教程之摄像头追踪功能
Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
随机推荐
- PHP腾讯与百度坐标转换
function coordinate_switch($a,$b){//百度转腾讯坐标转换 $a = Latitude , $b = Longitude $x = (double)$b - 0.006 ...
- debug问题记录
debug进不去,发现断点没有带勾. 方案:去掉所有断点,重新编译,debug启动,重新打断点. source里面加入自己的java project. 关掉所有的java页面!!! dobbo服务用d ...
- python操作oracle小测试
首先使用python操作数据库需要导入cx_Oracle包import cx_Oracle这个包需要单独下载,下载地址:https://pypi.python.org/pypi/cx_Oracle使用 ...
- libxml的使用 编辑节点
libxml读取的基本功能已经介绍过了,现在将介绍libxml编写的基本功能. 编写操作包含节点的添加,删除和修改. 对于添加,我们需要调用xmlNewTextChild函数来添加节点,需要xmlNe ...
- 找出OData service出错根源的小技巧
SAP的Fiori应用是通过OData和后台交互的.在使用Fiori应用时您可能会遇到这样的错误消息: 这个错误消息没有包含有助于partner或者客户定位问题根源的线索. 下面是如何在后台找出问题根 ...
- MySQL学习(四)查询
一.group_concat()函数.把groupby的分组中字段数据组合显示出来 select s_id , GROUP_CONCAT(要显示的字段名) from table group by 分 ...
- POJ 3070 矩阵快速幂
题意:求菲波那切数列的第n项. 分析:矩阵快速幂. 右边的矩阵为a0 ,a1,,, 然后求乘一次,就进一位,求第n项,就是矩阵的n次方后,再乘以b矩阵后的第一行的第一列. #include <c ...
- [19/03/22-星期五] 异常(Exception)(二)_捕获异常
一.概念 捕获异常是通过3个关键词来实现的:try-catch-finally.用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它, 最后一步是通过f ...
- 【洛谷P3205】[HNOI2010]CHORUS 合唱队
合唱队 区间DP f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数 边界: f[i][i][0]=1 转移: f[l][r][0]=(a[l]< ...
- HDU 2005 第几天?(闰年判断)
传送门: acm.hdu.edu.cn/showproblem.php?pid=2005 第几天? Time Limit: 2000/1000 MS (Java/Others) Memory L ...