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

Posted lixiaoyao123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity独立游戏开发日志2018/09/26相关的知识,希望对你有一定的参考价值。

最近太忙,今天吃饭的时候灵感一现。。。想到了随机地图生成的方法,不过可能实现的比较笨。。。还需要优化,大佬绕过。

注释没打,最后统一解释。

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;

       
    }
}  

今天就这样,要好好想想随机地图的问题。。。

以上是关于unity独立游戏开发日志2018/09/26的主要内容,如果未能解决你的问题,请参考以下文章

Unity 框架QFramework v1.0 使用指南 架构篇:05. 引入 Utility | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

Unity 框架QFramework v1.0 使用指南 工具篇:09. SingletonKit 单例模板套件 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

游戏开发进阶新发带你玩转Unity日志打印技巧(彩色日志 | 日志存储与上传 | 日志开关 | 日志双击溯源)

游戏开发进阶新发带你玩转Unity日志打印技巧(彩色日志 | 日志存储与上传 | 日志开关 | 日志双击溯源)

Unity 框架QFramework v1.0 使用指南 工具篇:05. ResKit 资源管理&开发解决方案 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

Unity独立开发游戏之路