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所示.但是却 ...
随机推荐
- Java—集合框架 List和Set的contains()以及Map的containsKey()、containsValue()
如何判断集合中是否存在某个元素——contains() 1.List的contains(obj)方法 实际上,List调用contains(Object obj)方法时,会遍历List中的每一个元素, ...
- Windows资源管理器对物理内存的描述
对每个进程的虚拟/物理内存使用描述: 1.硬错误/秒:在最后一分钟内每秒出现的平均硬页错误数 2.提交(KB):操作系统为内存保留的虚拟内存量,任务管理器中显示为:提交大小 3.工作集(KB):进程当 ...
- Selenium2学习(十一)-- select下拉框
本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关的操作方法. 一.认识select 1.打开百度-设置-搜索设置界面,如下图所示 2.箭头所指位置,就是select选项框,打开页面 ...
- Linux文件压缩和解压缩命令
Linux文件压缩和解压缩命令: tar 命令(打包并压缩的话,原文件也会默认存在) -c 建立打包档案 -x 解包 -t 查看包里的类容 -r 向包里追加文件 -v 显示打包过程 -f 文件 比如: ...
- python 正则表达式 re(邮箱匹配为例)
import rere.match(pat,string)re.compile()re.sub(pat,repl,string)re.findall(pat,text)一般字符:. 匹配任意除换行符& ...
- python接口测试-项目实践(一) 测试需求与测试思路
测试需求: 第三方系统提供了3个接口,需要测试前端显示的字符串里的对应数据与接口数据是否一致. 测试分层: 开发人员的设计:每周从接口取一次数据,拼接完成后保存到数据库.再从数据库取数提供接口给前端开 ...
- cocos2dx-打敌人游戏(一)
參照视频: http://v.youku.com/v_show/id_XNjk5MzExNDYw.html 1.參照前一篇文章创建新项目: http://blog.csdn.net/simakongc ...
- HDU 5536 字典树
题意:就是公式. 这现场赛O(n^3)能过,觉得太没天理了. 做法:字典树,枚举两个数,然后在字典树上贪心的跑. #include <bits/stdc++.h> using namesp ...
- React中的虚拟DOM
当组件当state和props发生变化当时候,组件当render函数就会重新执行,组件就会被重新渲染,react中实现这种重新渲染,他的性能是非常高的,因为他引入了一个虚拟Dom的概念,那么什么是虚拟 ...
- 常用PowerShell命令
查看版本: 文件重命名: 别名查看: 当前路径:(别名pwd) 切换路径:(别名cd) 子列表:(别名ls -Force可查看隐藏项) 查看用户:(可显示隐藏) 资源管理器打开当前目录:(cmd亦可 ...