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所示.但是却 ...
随机推荐
- Siebel escript学习笔记
Siebel(escript)的学习:1.Siebel的数据类型Primitive(原始的)---Number,Integer,Hexadecimal(十六进制),Octal(八进制),Floatin ...
- OFFICE_EXCEL_Combine text from two or more cells into one cell.
Excel Enter and format data Layout Combine text from two or more cells into one cell Combine t ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- 【HHHOJ】ZJOI2019模拟赛(十六)4.07 解题报告
点此进入比赛 得分: \(100+100+100=300\) 排名: \(Rank\ 1\) \(Rating\): \(+13\)(\(\frac18Rated\)) 备注: 这场比赛全是做过的原题 ...
- Codeforces Round #422 (Div. 2)
Codeforces Round #422 (Div. 2) Table of Contents Codeforces Round #422 (Div. 2)Problem A. I'm bored ...
- HDU 2586 How far away ?【LCA】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Oth ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】
Tree and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 【洛谷P2184】贪婪大陆
贪婪大陆 题目链接 对于一个区间[l,r],右端点在l左边即[1,l-1]中的区间与区间[l,r]没有交集, 左端点在r右边即[r,n]中的区间与区间[l,r]没有交集, 其余区间必与[l,r]有交集 ...
- 【luogu T24743 [愚人节题目5]永世隔绝的理想乡】 题解
题意翻译 我们来说说王的故事吧. 星之内海,瞭望之台.从乐园的角落告知汝等.汝等的故事充满了祝福.只有无罪之人可以进入——『永世隔绝的理想乡(Garden of Avalon)』! 题目背景 zcy入 ...
- 【luogu P1962 斐波那契数列】 题解
题目链接:https://www.luogu.org/problemnew/show/P1962 给你篇dalao的blog自己看吧,把矩阵快速幂的板子一改就OK #include <algor ...