请选择 进入手机版 | 继续访问电脑版

查看: 2294|回复: 6

[原创] 使用Unity开发RPG游戏完整指南(上)

[复制链接]

648

主题

1218

帖子

1万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
15950
QQ
发表于 2017-4-22 15:34:11 | 显示全部楼层 |阅读模式
本教程将介绍如何使用Unity创建一个RPG游戏。该游戏将包含三个场景:主场景、城镇场景和战斗场景。本篇中我们先来了解一下该RPG游戏的主场景,带您快速入门。

课前准备
为了更好地理解这篇教程,希望您熟悉以下概念:
  • C#编程
  • Unity检视面板的使用,如导入资源,创建预制件和添加组件
  • 基本的瓦片地图创建,如添加Tileset和创建瓦片层

在开始阅读这篇教程之前,请新建Unity项目,并从示例项目中导入所有可用的精灵(Sprite)。您将需要对相应的精灵图集(Spritesheet)进行切割。

请下载本教程的示例项目(使用版本:Unity 5.4.0f3),下载地址:http://pan.baidu.com/s/1pLv0uwz

资源版权说明
本教程所使用的图片都来源于Pixel-boy的Superpowers Asset Packs。所有图片可遵循Creative Commons Zero (CC0) 许可使用。您可以随意使用这些资源,也可用于商业游戏。

主场景
下面按步骤为大家介绍如何在Unity中制作本教程的主场景。

1. 背景
首先在主场景中创建一个画布(Canvas)来显示背景图片。新建Canvas命名为BackgroundCanvas,将渲染模式(Render Mode)设为Screen Space - Camera,将主相机(Main Canvas)设为画布相机。然后将Canvas Scaler中的UI缩放模式(UI Scale Mode)设为与屏幕大小一致,而参考分辨率(Reference Resolution)设为1280x960。

1.png

然后新建图片(Image)对象,让它作为这个画布的子对象。将源图片(Source Image)设置成背景图片,为了正确显示背景图,将其大小设为原始大小。

2.HUD画布
现在,我们要另一个Canvas来显示HUD元素。主场景中包括主题文本和播放按钮。

首先,新建Canvas,与创建BackgroundCanvas步骤相同。但为了将这个画布显示在背景画布的上方,需要正确地设置它的Sorting Layer。新建层命名为HUD,并将HUDCanvas放于该层。

2.png

最后,创建两个HUD对象:一个是Text,另一个是Button。对于Text对象,只需要设置它的文本。而对于Button对象,需要设置它的OnClick回调函数。

未命名_meitu_0.jpg

PlayButton对象的OnClick回调函数在下面的ChangeScene脚本中。该脚本仅有一个方法,用于根据给定的场景名称切换至目标场景。然后设置播放按钮的OnClick回调函数,让它调用loadNextScene方法,参数为“Town”。

[C#] 纯文本查看 复制代码
public class ChangeScene : MonoBehaviour {
 
public void loadNextScene(string sceneName) {
SceneManager.LoadScene (sceneName);
}
}
public class ChangeScene : MonoBehaviour {
 
public void loadNextScene(string sceneName) {
SceneManager.LoadScene (sceneName);
}
}


3.玩家部分
游戏希望保存玩家单位的数据,即使切换场景数据也不会丢失。所以新建持久化对象命名为“PlayerParty”,即使切换场景,这个对象也不会被销毁。同时要正确设置它的坐标,让它在战斗场景中显示在正确的位置。

5.png

通过下面的StartBattle脚本,让PlayerParty对象在切换场景时不被销毁。该脚本在Start方法中调用DontDestroyOnLoad函数以防止切换场景时销毁对象。脚本还增加了一个回调函数,当加载新场景时将PlayerParty对象设置为非激活态,这样就不会显示在主场景中。

[C#] 纯文本查看 复制代码
public class StartBattle : MonoBehaviour {

        // Use this for initialization
        void Start () {
                DontDestroyOnLoad (this.gameObject);

                SceneManager.sceneLoaded += OnSceneLoaded;

                this.gameObject.SetActive (false);
        }

        private void OnSceneLoaded(Scene scene, LoadSceneMode mode) {
                if (scene.name == "Title") {
                        SceneManager.sceneLoaded -= OnSceneLoaded;
                        Destroy (this.gameObject);
                } else {
                        this.gameObject.SetActive(scene.name == "Battle");
                }
        }

}
public class StartBattle : MonoBehaviour {

        // 用来初始化的方法
        void Start () {
                DontDestroyOnLoad (this.gameObject);

                SceneManager.sceneLoaded += OnSceneLoaded;

                this.gameObject.SetActive (false);
        }

        private void OnSceneLoaded(Scene scene, LoadSceneMode mode) {
                if (scene.name == "Title") {
                        SceneManager.sceneLoaded -= OnSceneLoaded;
                        Destroy (this.gameObject);
                } else {
                        this.gameObject.SetActive(scene.name == "Battle");
                }
        }

}


PlayerParty还需要有两个表示玩家单位的子对象。创建PlayerUnit预制件,目前内容很少。在教程后面部分,我们会为它添加更多行为。

目前PlayerUnit上带有Sprite Renderer组件和UnitStats脚本,该脚本会保存每个单位的状态,如生命值、魔法值、攻击力、魔法攻击力、防御力和速度等参数。

[C#] 纯文本查看 复制代码
public class UnitStats : MonoBehaviour {
 
public float health;
public float mana;
public float attack;
public float magic;
public float defense;
public float speed;
 
}
public class UnitStats : MonoBehaviour {
 
public float health;
public float mana;
public float attack;
public float magic;
public float defense;
public float speed;
 
}


下图展示了一个玩家单位的例子,叫做法师单位(MageUnit)。在本例中,UnitStats还有其他属性如Animator和Damage Text Prefab,后面会用到。


6.png

到此已经可以测试游戏的主场景了。您可以新建一个空场景命名为“Town”,来测试点击播放按钮是否能正确切换场景。

7.png

总结
本篇教程主要为您介绍了该RPG游戏主场景的部分,我们会在后续为您继续介绍剩下的场景。如果您对类似教程感兴趣,请关注Unity官方微信平台(Unity-GreaterChina ),查看更多相关内容。

更多Unity相关教程
制作一款文字冒险游戏
手把手教你拼一个3D“魔方”
用Playmaker制作碎裂物品效果
在Unity中使用UFPS创建第一人称射击游戏
Tilt Brush Unity SDK:在Unity中使用Tilt Brush

Unite 2017 Shanghai优惠倒计时
一年一度的Unity开发者盛会Unite 2017 Shanghai还剩不到一个月就要开幕了。66折技术通票倒计时仅剩8天!Unity创始人David Helgason将会来到大会现场与开发者们进行面对面特别交流,席位有限哦。

请访问Unite 2017 Shanghai官方网站:http://unite2017.csdn.net/,了解大会售票信息与相关活动。

Unite.PNG

原文链接:https://gamedevacademy.org/how-to-create-an-rpg-game-in-unity-comprehensive-guide/
感谢Unity官方翻译组成员“Swcha”对本文的贡献(如何加入翻译组
转载请注明:来自Unity官方中文社区(forum.china.unity3d.com)

0

主题

11

帖子

100

贡献

初级UU族—2级

Rank: 2

积分
95
发表于 2017-4-23 14:13:19 | 显示全部楼层
请问,单独用个canvas来显示背景,有什么好处?

2

主题

52

帖子

785

贡献

中级UU族—1级

Rank: 4

积分
785
发表于 2017-4-24 05:09:48 | 显示全部楼层
好文章,坐等更新!

648

主题

1218

帖子

1万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
15950
QQ
 楼主| 发表于 2017-4-24 10:47:57 | 显示全部楼层
D119 发表于 2017-4-23 22:13
请问,单独用个canvas来显示背景,有什么好处?

您有什么更好的建议嘛

0

主题

4

帖子

55

贡献

初级UU族—1级

Rank: 1

积分
45
发表于 2017-4-26 14:49:57 | 显示全部楼层
好东西 希望有更多像这样有详细步骤的教程

0

主题

11

帖子

100

贡献

初级UU族—2级

Rank: 2

积分
95
发表于 2017-4-30 09:24:52 | 显示全部楼层
admin 发表于 2017-4-24 10:47
您有什么更好的建议嘛

没有,刚学习unity ,不知道这种做法有哪些好处,所以问问

0

主题

1

帖子

15

贡献

初级UU族—1级

Rank: 1

积分
10
发表于 2017-5-11 05:54:31 | 显示全部楼层
D119 发表于 2017-4-30 09:24
没有,刚学习unity ,不知道这种做法有哪些好处,所以问问

应该是想把bg和hud区分开来  好管理层级   如果是这样   感觉没必要
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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