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;

    }
}  

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

原文地址:https://www.cnblogs.com/lixiaoyao123/p/9710601.html

时间: 2024-11-16 14:17:50

unity独立游戏开发日志2018/09/26的相关文章

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

f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有:Scripts(储存脚本),Scenes(储存场景),Animation(储存动画)等等.最重要的是Resources(这个不可以打错),因为在unity中可以通过Load Resources中的文件夹中按文件名寻找对应的资源.来进行动态生成. 像我这个游戏中的物体含有大量的重复(很多游戏中都存在,

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

Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受.因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑.具体的实现步骤如下: (1)在Hierarchy视图里,新建一个Empty对象,并命名为Death Trigger,设置其

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

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

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

Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态.但是这其中还有一些问题.例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精灵也只是在原地播放动画而已.但我们希望精灵在进入到PlayerWalkingAnimation状态时,位置应该发生改变. 要解决这些问题,就需要编写脚本.也就是说,要使用脚本来实现动画的播放控制,以及其它一些游戏的逻辑

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

Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以及游戏逻辑的想象空间.看来有必要让精灵拥有更多的状态,而这就是本章要讲解的主要内容. 摄像头追踪功能 游戏里的精灵可以在游戏场景中任意移动,这没什么问题,可是这就导致了一个问题,就是精灵可能移动到我们的视野之外,或者说游戏视图之外.为了解决这个问题,很多游戏都采用了"摄像头追踪"的方法,使

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

Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 "开火"就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是: (1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示. 图2-23  导入到游戏项目的表示子弹的图片 (2)拖动此图片到Scene视图,即可在当前的游戏场景中

写给使用Unity进行游戏开发的建议

Unity是一款非常流行的游戏开发软件.它的功能令人印象深刻,也能够适应不同的游戏开发要求.游戏开发人员可以使用Unity创建任意类型的游戏,从世界级的RPG游戏到最受欢迎的增强现实游戏Pokemon Go.此外,许多初学者通用Unity来学习游戏开发或游戏编程. Unity的真正影响更加多样化,不论是对独立游戏开发人员或者共同完成某一个项目的的大型团队而言,它都是一个完美工具.它的生态系统也有助于其统一维护和朝着正确的方向发展.但是由于其复杂性---处理设计.脚本.调试和其方面---使得Uni

【Unity NGUI游戏开发之五】多分辨率下完美分布式协同开发

NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 案例 完美过程 案例分析 实现过程 开发问题: NGUI分布式开发中,用git管理资源,团队成员每人负责一个perfab,所有现对于屏幕大小的相对位置的perfab因为引用了perfab外的数据,导致perfab的Anchor锚点数据丢失,最后的perfab集成后,必须重新设置,导致开发成本大幅度

?Unity 2D游戏开发教程之2D游戏的运行效果

Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问,会在本节集中揭晓. (1)单击Unity上方,工具栏里的播放按钮,开始运行当前的游戏,默认精灵当前进入的是Idle动画状态,如图1-34所示. 图1-34  Idle状态 (2)当读者按下键盘上的左.右方向键,或者A.D键的时候,精灵会进入Walking动画状态,并且会向左或者向右移动,如图1-3