最近太忙,今天吃饭的时候灵感一现。。。想到了随机地图生成的方法,不过可能实现的比较笨。。。还需要优化,大佬绕过。
注释没打,最后统一解释。
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 Vector3 location; private float xpos, ypos, zpos; private int randnum; private GameObject selectedobject; private bool iscompeleted = false; // Use this for initialization private void Start() { Time.timeScale = 0; createmap(); } private void Update() { if(iscompeleted) { Time.timeScale = 1; } } 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")); } void createmap() { for (xpos = -25; xpos <= 25; xpos++) { for(zpos = -130; zpos <= 0; zpos++) { RenewPrefab(); randnum = Random.Range(0, 100); SelectPrefab(randnum); selectedobject.transform.position = new Vector3(xpos, ypos, zpos); if(xpos == -15 && zpos == -120) { iscompeleted = true; } } } } private void SelectPrefab( int rand) { if (0 < rand & rand < 20) { selectedobject = Bridge; } else if (20 <= rand & rand < 30) { selectedobject = Cliff; } else if(30 <= rand & rand < 40) { selectedobject = Dirt; } else if (40 <= rand & rand < 60) { selectedobject = Grass1; } else if (60 <= rand & rand < 80) { selectedobject = Grass2; } else if (80 <= rand & rand < 90) { selectedobject = Rock; } else { selectedobject = Sand; } } }
这里的逻辑就是:首先用unity的load方法,获取文件夹中的资源(这些资源是prefab),获取之后,就进行随机数判断,这里可以设定各种图块的比例
,根据数字范围就可以。然后整个流程都在一个循环中,这个循环控制着平面的位置,可以想象成遍历二维数组,一行一行的每个位置随机生成。
不过目前还是只有一层,高阶层的还没想好。还有一点就是,木桥的方块需要着重考虑它的方向和出现位置。最后就是随机数这个方法应该有更好的来
进行,有个随机种子,这样随机性可能会更强。
哦对了,这样生成的话,unity可能会很卡,需要解决一下这个优化问题。也许可以考虑异步之类的。。。之后再想。
最后是比较简单的,鼠标按住右键平移可以移动镜头,滚轮可以拉近拉远镜头。这个就是一堆参数,摄像机获取位置改变,很简单。
这个会应用在建造模式上。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MouseCamera : MonoBehaviour { // 将脚本挂载到摄像机上 public float moveSpeed = 10; // 设置相机移动速度 public float minFov = 15f; public float maxFov = 90f; public float sensitivity = 10f; void Update() { // 当按住鼠标右键的时候 MouseRight(); //滚轮操作 MouseTurn(); } void MouseRight() { if (Input.GetMouseButton(1)) { // 获取鼠标的x和y的值,乘以速度和Time.deltaTime是因为这个可以是运动起来更平滑 float h = Input.GetAxis("Mouse X") * moveSpeed * Time.deltaTime; float v = Input.GetAxis("Mouse Y") * moveSpeed * Time.deltaTime; // 设置当前摄像机移动,y轴并不改变 // 需要摄像机按照世界坐标移动,而不是按照它自身的坐标移动,所以加上Spance.World this.transform.Translate(h, 0, v, Space.World); } } void MouseTurn() { float fov = Camera.main.fieldOfView; fov += Input.GetAxis("Mouse ScrollWheel") * sensitivity; fov = Mathf.Clamp(fov, minFov, maxFov); Camera.main.fieldOfView = fov; } }
今天就这样,要好好想想随机地图的问题。。。
原文地址:https://www.cnblogs.com/lixiaoyao123/p/9710601.html
时间: 2024-11-16 14:17:50