今天优化了下昨天的代码,并且添加了树木和其他资源的生成。还修复了接近石头后,挖掘图标不出现的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的更多相关文章

  1. unity独立游戏开发日志2018/09/22

    f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...

  2. unity独立游戏开发日志2018/09/26

    最近太忙,今天吃饭的时候灵感一现...想到了随机地图生成的方法,不过可能实现的比较笨...还需要优化,大佬绕过. 注释没打,最后统一解释. using System.Collections; usin ...

  3. Unity3D独立游戏开发日记(二):摆放建筑物

    在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...

  4. Unity3D独立游戏开发日记(一):动态生成树木

    目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...

  5. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  6. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

  7. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  8. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  9. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

随机推荐

  1. 微软开源 PowerShell 并支持 Linux 和 OS X

    微软近日宣布开源 PowerShell,开始支持 Linux 和 OSX.PowerShell 是面向 Windows 和 Windows Server 的自动化平台和可扩展脚本语言,可帮助用户简化系 ...

  2. VueJs - 世界地图(根据返回国家value值的大小来展示颜色的深浅分布)

    一.实现功能 1.画出世界各国的世界地图 2.根据返回name->国家全称.value->数量,渲染对比世界各国成功的国家,予以值域范围的高亮 3.滑入国家地图,出现tooltip框,提示 ...

  3. Do the Untwist

      Do the Untwist Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. LeetCode Two Sum 解题思路(python)

    问题描述 给定一个整数数组, 返回两个数字的索引, 使两个数字相加为到特定值. 您可以假设每个输入都有一个解决方案, 并且您不能使用相同的元素两次. 方法 1: 蛮力 蛮力方法很简单.循环遍历每个元素 ...

  5. C#转Java之路之二:多线程原子变量

    多线程操作会带来不一致性,为了实现一直性.我们可以用关键字:synchronized同步对象或者volatile轻量级.内存可见性. 两个关键字使用对比: 1.synchronized比较重,属于悲观 ...

  6. POJ 1423 斯特林

    题意:进制问题 分析: 打表,但是要用不能 long long 型,超内存. n! = log_{10}\sqrt{2{\pi}n}*(\frac{n}e)^n 精度要求 #include <c ...

  7. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

  8. 【转】jQuery源码分析-03构造jQuery对象-源码结构和核心函数

    作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟是边读边写,不对的地方请告诉我,多多交流共同进步.本章还未写完,完了会提交PDF. 前记: 想系 ...

  9. Python—面向对象05 反射

    反射,通过字符串映射到对象属性 ​ class People: country='China' def __init__(self,name,age): self.name=name self.age ...

  10. 你不知道的javaScript笔记(2)

    this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的 function foo(num) { console.log(&q ...