香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 110|回复: 8

Unity游戏设计

[复制链接]

4

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-9-20 11:44:05 | 显示全部楼层 |阅读模式
写在前面
这是一篇从零开始制作Unity 2D游戏的教程
游戏设计思想
在《游戏设计艺术》里面,有提到一个制作玩具的概念。在制作完整的的游戏之前,先制作一个可玩的游戏原型。这个原型包含了一些这个游戏可能拥有的玩法和游戏机制,并且越简单越好。在制作完成之后,游玩这个玩具来思考這個遊戲是否有趣。你可以制作多个玩具来进行对比思考,我有看到一些使用三个不同玩具来进行基础开发的Youtuber。比起我们想要游戏提供什么玩法,这个方法更多关注于游戏能有什么玩法上面,并且参与到这些玩法当中是否好玩。这个概念相当有趣,因为游戏本身从一开始就主导了设计。
介绍我的玩具
基于上述的设计思想,我构思了一个玩具。
这个玩具拥有一个中心的区域,这个区域是游戏的核心,它代表着一些重要的东西。在中心区的周围,有一些敌人,这些敌人会缓慢靠近中心,在接触到中心会破坏中心区域。这就是这个游戏的基本机制,相当的简单。



我快速地画了一个示意图

制作游戏的基本美术
画一个敌人



在一个新的PS档案里,新建一个线条图层,绘制三个基本的动作,用来制作动画



再新建一个颜色图层,放置在线条图层的下方,这是为了让颜色不要遮挡到线条。然后涂上颜色,稍微加上一点光源

接下来制作其他的二维图像,你可以用些其他的软件啦画,像下面用像素来画的树和血条,基本满足示意图里面提到的概念





建立Unity档案
建立一个Unity文档,它拥有以下的结构:

  • Animation - 用来存放所有的Animator控制器和Animation
  • Material - 用来存放PS及其他软件绘画的素材
  • Prefab - 所有需要被克隆的游戏对象都应该被制作成Prefab,日后需要改动的话就改Prefab,因此准备一个Prefab文件夹来放置
  • Scenes - 这个根据个人喜好来决定,一般小项目/学习项目就不用另开一个文件夹了
  • Script - 用来放置代码,注意如果有用到设计模式的程序码都应该开一个子目录,表明这是属于什么设计模式
将制作好的所有美术文件导入Unity,放置在Material文件夹下面


这时我们需要将我们的一些美术文件分割,在Project点选我们需要分割的美术文件,e.g. Enemy。将它的sprite mode改成Multiple,然后点进去Sprite Editor



然后就可以像这样将他们分割成3个独立的文件啦

完成分割后点选Apply就会看到Project里的Enemy多出了这些东西


制作AI的Prefab
因为在示意图里面, 移动的AI有好几个,为了方便日后的工作,所以先制作一个AI,并且将它打包成Prefab

  • 新建一个Game Object
在场景中新建一个Game Object,将它重新命名为EnemyPrefab,在游戏对象的Inspector里面找到Add Component的按钮,然后添加Sprite Renderer组件,Sprite Renderer组件里面将Sprite更改成上面制作的Enemy_0
2. 添加Rigid Body 2D和Box Collider 2D组件
Rigid Body 2D是一个物理引擎的组件,通过阅读文档我们可以知道,它允许游戏对象在x轴和y轴组成的平面上移动,并且还允许垂直于这个平面做旋转。
Box Collider 2D是一个正方形的形状,它和所有的Collider一样用来检测物理的碰撞,并且可检测的范围与x轴和y轴平行。
在游戏对象的Inspector里面找到Add Component的按钮,然后分别搜寻和添加这两个组件



由于我们不想要这个AI被地心引力影响,所以rigid Body的Gravity Scale设为0。并且我们想要它在碰撞到物体后停下来,所以取消勾选Box Collider的isTrigger

3. 添加动画
点选我们的EnemyPrefeb对象。然后在Window打开Animation,这时候会看到Animation界面是空白的,系统提示我们新建一个Animation Clip,将这个Animation命名为EnemyWalk。然后将Project里面的Enemy文件的三个动作拖动到Animation窗口



像这样



https://www.zhihu.com/video/1040209044950179840
用类似的方法制作一个EnemyIdle的动画,只需要一张站着的动画就可以了。
接着制作Animator的控制器,由于我们在创建第一个动画时Unity就已经帮我们创建了针对EnemyPrefab的控制器,我们只需要去往Animator的窗口就可以进行设置了。



我制作了一个这样的控制器,它拥有两个Trigger(Walk和Idle),Default State是Idle。我在EnemyWalk和EnemyIdle之间设置了两个Transition,只要对应的Trgger被触发就会转换状态,播放对应的动画

4. 存储Prefab
到这里,Prefab的制作就大功告成了,我们可以将EnemyPrefab这个游戏对象拖到Project的Prefab文件夹将Prefab储存。


制作游戏界面



我将Enemy的Prefab复制了好几个,注意不是复制场景里的Enemy对象哦!是将Project里面的Prefab拖到场景进行复制!

我还更改了摄像机的颜色,让它变成了蓝色。这在编辑器里面是看不到的,要在Game版才能看到。
编写代码
我是用C#在Unity里面编程的,觉得相当好用。

  • 移动AI
新建一个C#文件。为了让Enemy能向着树移动,我们首先要获得树的位置
public class MoveEnemy : MonoBehaviour
{
    private GameObject target;
    private Rigidbody2D targetRD;
    private Vector2 targetPosition;

    // Use this for initialization
    void Start () {
        target = GameObject.Find("Tree"); // 获取Tree对象
        targetRD = target.GetComponent<Rigidbody2D>();  // 获取Tree对象的Rigidbody2D组件
        targetPosition = targetRD.position; // 获取Tree对象存储在Rigidbody2D组件里的位置
    }
}为了方便大家理解,我在这里多做了一步。首先我们找到这个叫作Tree的对象,接下来我们用这个对象来获取它的Rigid body 2D组件,这个组件存储着这个对象的位置,正是我们需要的东西。由于我们知道树是不会移动的,所以获取一次就足够,于是我们在初始化的时候获取,之后它的位置都不会改变了。
接下来我们要让Enemy动起来,我们需要它在碰到树的时候停下来,也就是说这个对象拥有两个状态,一是移动,二是停下。这就是个布尔值啊!而且为了让它在移动的时候播放动画,我们还需要获取自身的Animator控制器,并且我们还需要设定我们的速度
    private float speed;
    private Animator animator;
    private bool canMove;

    // Use this for initialization
    void Start () {
       ...
       canMove = true;
       speed = 1f;
       animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update () {
        // 如果canMove是True的话就执行
        if (canMove)
        {
            // 发个Trigger过去Animator让它知道该干嘛
            animator.SetTrigger("Walk");
            // 这里就是让Enemy朝向Tree移动了
            transform.position = Vector2.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
        }
        else
        {
            // 发个Trigger过去Animator让它知道该干嘛
            animator.SetTrigger("Idle");
        }

    }我稍微解释一下MoveTowards这个函数,它应该这样填:
Vector2.MoveTowards(从哪里移动, 移动去那里,移动多快)
前面两个参数都是Vector2类型的,也就是包含xy轴信息的向量,而最后那个是浮点数。
我们用Time.deltaTime这个方法,是因为每台机器的渲染速度都是不一样的,这一点在《设计模式》还有《游戏设计模式》里面都有讲到,并且对于每一个游戏来说都是致命的,而这一个方法可以确保程序在任何一台机器上,都按照我们设定的速度来运行,而不是机器的速度。
2. 为树添加生命条控制
public class HealthBarScript : MonoBehaviour {

    GameObject healthBar;
    float Health;

    // Use this for initialization
    void Start () {
        // 获取Health Bar对象
        healthBar = GameObject.Find("HealthBar");
        // 获取Health bar相对于它父对象的比例
        Health = healthBar.transform.localScale.x;
        }
       
        // Update is called once per frame
        void Update () {
        healthBar.transform.localScale = new Vector2( Health, healthBar.transform.localScale.y);
        }

    // 每当AI碰到树的时候
    // 就会调用这个方法
    public void takeDemage(float amount)
    {
        Health -= amount;
    }
}3. 为AI创建Health bar Script的实例
    // 创建一个HealthBarScript的实例
    private HealthBarScript targetHealth;

    void Start () {
        ...
        targetHealth = target.GetComponent<HealthBarScript>();
    }4. 为AI添加碰撞检测
   private void OnCollisionEnter2D(Collision2D collision)
    {
        // 首先判断碰到是否为树
        if (collision.gameObject.name == "Tree")
        {
            // 碰到了树就要停下
            canMove = false;
            // 调用HealthBarScript实例的方法,让树掉血
            targetHealth.takeDemage(0.05f);
        }
    }代码写完啦!将它们挂到对应的Prefab上面吧!

游戏玩具的最终效果
https://www.zhihu.com/video/1040225631711260672
我们的游戏玩具已经完成,虽然它还什么玩法都没有,不过它已经是一个设计的开始了。
回复

使用道具 举报

0

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-9-20 11:44:15 | 显示全部楼层
老师,非常感激。留名等更新
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-9-20 11:44:31 | 显示全部楼层
哈哈,我就是随便写一写,希望对你有帮助
回复

使用道具 举报

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-9-20 11:44:43 | 显示全部楼层
这个可以有、当个入门教程再合适不过了,我装个unity试试
回复

使用道具 举报

4

主题

8

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2022-9-20 11:45:07 | 显示全部楼层
这个系列已经断更了,入门unity建议还是到官网去学吧
回复

使用道具 举报

2

主题

6

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-9-20 11:45:25 | 显示全部楼层
呃……但是你这个写的挺好懂的,官网好枯燥
回复

使用道具 举报

0

主题

6

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-9-20 11:45:53 | 显示全部楼层
我什麼時候有空可以填一填這個坑
回复

使用道具 举报

1

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-9-20 11:46:18 | 显示全部楼层
老师,出个视频教学呗,
回复

使用道具 举报

2

主题

8

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-9-20 11:47:10 | 显示全部楼层
前辈,这些代码前面引用了什么,我写进去就报错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-9-15 03:05 , Processed in 0.211846 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表