今天优化了下昨天的代码,并且添加了树木和其他资源的生成。还修复了接近石头后,挖掘图标不出现的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%预期,接下来要做更复杂的。今天就这样。

最新文章

  1. 关于gitignore文件的创建与使用
  2. Oracle学习笔记三 SQL命令
  3. ios 单例设计模式
  4. [ MySql学习心得 ] --One
  5. JavaScript星形评分
  6. GridView的 OnRowDataBound 事件用法
  7. Bootstrap_导航
  8. shader函数
  9. LESS 学习记录(简单入门)
  10. js中数组
  11. 收集了50道基础的java面试题
  12. leetcode279. Perfect Squares
  13. C#常用类汇总
  14. Cookie和Seesion的区别
  15. SQL Join PK ChinaJoy
  16. linux内核分析系列--百度
  17. LINQ 101——分组、Set、转换、Element
  18. laravel实现发送qq邮件
  19. zoj1940(三维广搜)
  20. javaScript的一些奇妙动画

热门文章

  1. Golang Gin 项目使用 Swagger
  2. php之Apache压力测试
  3. scrum3
  4. mvc做网站怎么在mvc中直接访问.html网页 [问题点数:20分]
  5. HDU 4944 逆序数对
  6. PSROIAlign的代码实现
  7. labelme也可以标注polygan
  8. TridentState分析
  9. 在VS2010 中使用subversion 进行代码的分支与合并
  10. SpringBoot非官方教程 | 第五篇:springboot整合 beatlsql