开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1876

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2563|回复: 16

[碧俐千仞] Unity3D热更新LuaFramework入门实战(10)——示例程序

[复制链接]  [移动端链接]
排名
17062
昨日变化
20

23

主题

176

帖子

686

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
26
蛮牛币
1892
威望
0
注册时间
2014-11-6
在线时间
107 小时
最后登录
2017-8-13

专栏作家

发表于 2016-11-16 22:56:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x


现在,大家对LuaFramework有个全方位的理解了吧!接下来通过一个例子总结ulua,作为“lua逻辑”的延伸,说明lua的写法。这个例子中玩家能够控制2D游戏角色走动,并且发射炮弹。

知乎 @罗培羽

1、目标
制作如图所示的游戏,玩家可以通过键盘控制角色上下左右移动,角色有4个面向,走动过程中会播放行走动画。当玩家点击鼠标左键,角色会发射一颗炮弹。
Unity3D热更新LuaFramework入门实战10222.png


2、游戏资源
使用下图所示的图片作为游戏角色(该图片来自rpg maker),在导入Unity后将它切割成12张小图。
Unity3D热更新LuaFramework入门实战10284.png


Unity3D热更新LuaFramework入门实战10287.png


使用如下图所示的图片作为炮弹。
Unity3D热更新LuaFramework入门实战10306.png


在游戏场景中新建画布,画布下摆放一个名为Panel的面板,代表游戏场景。面板下有res和map两个子物体,map(Image)为一张场景图,role(Image)为游戏中的角色,bullet(Image)为游戏中的子弹(同一时间只能发射一颗子弹)。
Unity3D热更新LuaFramework入门实战10433.png


Res子物体存放12张角色图片(Image),之后会使用这些资源替换map.role的图片,以实现动画效果。
Unity3D热更新LuaFramework入门实战10491.png


然后将Panel做成预设,存放到SimpleGame目录下。并且在GameManager空物体上添加Game组件,以启动框架。
Unity3D热更新LuaFramework入门实战10558.png


修改Packager.cs,在HandleExampleBundle添加如下代码,将SimpleGame目录下的预设打包。然后点击LuaFramework→Build Windows Resource打包。

[C#] 纯文本查看 复制代码
//小游戏
AddBuildMap("SimpleGame" + AppConst.ExtName, "*.prefab", "Assets/SimpleGame");


具体的框架设置请参加第一篇和第二篇,这里仅做简单描述。

3、编写行走代码
游戏使用UI组件,在CustomSettings.cs中添加如下两行,使tolua生成Image和Sprite相关的调用。

[C#] 纯文本查看 复制代码
		_GT(typeof(Image)),
		_GT(typeof(Sprite)),


打开main.lua(如何运行main.lua请参见第一篇)开始编写代码。程序从Main方法开始执行,使用LoadPrefab(请参见第二篇)加载之前打包的资源文件Panel。这里还定义几个变量,其中map代表游戏场景(panel.map),role代表游戏角色(panel.map.role),roleImage是游戏角色中的图片组件,roleRes代表各个面向的角色图片,比如roleRes[“UP”]将会包含panel.res中3张角色朝上的图。roleAnm代表当前角色的动画,每个面向有3个动画,对应于不同的图片。lastAnmTime代表展现角色动画帧的时间,用于控制动画播放速度。


[C#] 纯文本查看 复制代码
--主入口函数。从这里开始lua逻辑
function Main()					
	LuaHelper = LuaFramework.LuaHelper;
	resMgr = LuaHelper.GetResManager();
	resMgr:LoadPrefab('SimpleGame', { 'Panel' }, OnLoadFinish);
end

local map
local role
local roleImage
local roleRes = {
	["UP"] = {},
	["DOWN"] = {},
	["LEFT"] = {},
	["RIGHT"] = {},
}
local roleAnm = 1;
local lastAnmTime = 0;

--加载完成后的回调--
function OnLoadFinish(objs)
    --暂略
end


接着编写加载完成的回调方法OnLoadFinish,它处理下面几件事情。
1、使用Instantiate实例化面板,并且设置面板的坐标,具体请参见第5篇。
2、获取面板中的部件,给map、role、roleImage赋值。
3、获取素材res中的图片,赋值给roleRes,之后roleRes ["UP"],roleRes ["DOWN"],roleRes ["LEFT"],roleRes ["RIGHT"]都包含3张同面向不同动画的图片。
4、使用UpdateBeat:Add()初始化Update方法(具体参照第三篇)。

[C#] 纯文本查看 复制代码
function OnLoadFinish(objs)
	--显示面板
	go = UnityEngine.GameObject.Instantiate(objs[0])
	local parent = UnityEngine.GameObject.Find("Canvas")
    go.transform:SetParent(parent.transform, false)
	--获取元素
	map = go.transform:FindChild("map").gameObject
	role = map.transform:FindChild("role").gameObject
	roleImage = role:GetComponent("Image")
	--获取素材
	local res = go.transform:FindChild("res").gameObject
	roleRes["DOWN"][1] = res.transform:FindChild("role (0)").gameObject:GetComponent("Image").sprite
	roleRes["DOWN"][2] = res.transform:FindChild("role (1)").gameObject:GetComponent("Image").sprite
	roleRes["DOWN"][3] = res.transform:FindChild("role (2)").gameObject:GetComponent("Image").sprite
	roleRes["LEFT"][1] = res.transform:FindChild("role (3)").gameObject:GetComponent("Image").sprite
	roleRes["LEFT"][2] = res.transform:FindChild("role (4)").gameObject:GetComponent("Image").sprite
	roleRes["LEFT"][3] = res.transform:FindChild("role (5)").gameObject:GetComponent("Image").sprite
	roleRes["RIGHT"][1] = res.transform:FindChild("role (6)").gameObject:GetComponent("Image").sprite
	roleRes["RIGHT"][2] = res.transform:FindChild("role (7)").gameObject:GetComponent("Image").sprite
	roleRes["RIGHT"][3] = res.transform:FindChild("role (8)").gameObject:GetComponent("Image").sprite
	roleRes["UP"][1] = res.transform:FindChild("role (9)").gameObject:GetComponent("Image").sprite
	roleRes["UP"][2] = res.transform:FindChild("role (10)").gameObject:GetComponent("Image").sprite
	roleRes["UP"][3] = res.transform:FindChild("role (11)").gameObject:GetComponent("Image").sprite
	--UpdateBeat
	UpdateBeat:Add(Update, self)
end


编写Update方法,它根据用户输入改变坐标(具体参见第三篇),并且根据不同的移动方向设置角色图片素材,将roleImage.sprite替换成roleRes[方向][动画索引]。最后判断“if Time.time - lastAnmTime > 0.1 then”,每隔0.1秒切换一次动画。


[C#] 纯文本查看 复制代码
--每帧执行
function Update()
	
	--移动
	local Input = UnityEngine.Input;
	local horizontal = Input.GetAxis("Horizontal");
	local verticla = Input.GetAxis("Vertical");
	
	local x = role.transform.position.x + horizontal
	local y = role.transform.position.y + verticla
	role.transform.position = Vector3.New(x,y,0)
	--转向
	if horizontal < 0 then
		roleImage.sprite = roleRes["LEFT"][roleAnm]
	elseif horizontal > 0 then
		roleImage.sprite = roleRes["RIGHT"][roleAnm]
	elseif verticla > 0 then
		roleImage.sprite = roleRes["UP"][roleAnm]
	elseif verticla < 0 then
		roleImage.sprite = roleRes["DOWN"][roleAnm]
	end
	--步伐(动画索引)
	if Time.time - lastAnmTime > 0.1 then
		roleAnm = roleAnm+1
		if roleAnm > 3 then roleAnm = 1 end
		lastAnmTime = Time.time
	end
	
end


运行游戏,玩家可以通过键盘的方向键控制角色移动。
Unity3D热更新LuaFramework入门实战104414.png


3、编写射击代码
在main.lua中添加炮弹相关的变量,如下所示。其中bullet代表炮弹元件(panel.map.bullet),lastShootTime 代表上一次发射炮弹的时间,bulletSpeedX代表炮弹的水平移动速度,bulletSpeedY代表炮弹的垂直移动速度,roleFace代表角色的面向。然后在OnLoadFinish中给bullet赋值。


[C#] 纯文本查看 复制代码
local bullet
local lastShootTime = -100
local bulletSpeedX = 0
local bulletSpeedY = 0
local roleFace = 0

function OnLoadFinish(objs)
	……
	--子弹元素
	bullet = map.transform:FindChild("bullet").gameObject
End


在Update中给roleFace赋值。


[C#] 纯文本查看 复制代码
--每帧执行
function Update()
	
	--移动
	……
	--转向
	if horizontal < 0 then
		roleImage.sprite = roleRes["LEFT"][roleAnm]
		roleFace = 1
	elseif horizontal > 0 then
		roleImage.sprite = roleRes["RIGHT"][roleAnm]
		roleFace = 2
	elseif verticla > 0 then
		roleImage.sprite = roleRes["UP"][roleAnm]
		roleFace = 3
	elseif verticla < 0 then
		roleImage.sprite = roleRes["DOWN"][roleAnm]
		roleFace = 4
	end
	--步伐
	……
end


在Update中添加处理炮弹的代码,它处理如下几件事情。
1、炮弹在飞行1.2秒后,燃尽消失;
2、当玩家按下鼠标左键时,发射炮弹,根据角色面向,bulletSpeedX和bulletSpeedY会有不同的值。
3、根据bulletSpeedX和bulletSpeedY移动炮弹。

[C#] 纯文本查看 复制代码
--每帧执行
function Update()
	……
	--子弹
	if Time.time - lastShootTime > 1.2 then
		--消失
		if bullet.transform.position.x ~= -999 then
			bullet.transform.position = Vector3.New(-999,-999,0)
		end
		--发射
		if Input.GetMouseButton(0) then
			bullet.transform.position = Vector3.New(x,y,0)
			if roleFace == 1 then
				bulletSpeedX = -10
				bulletSpeedY = 0
			elseif roleFace == 2  then
				bulletSpeedX = 10
				bulletSpeedY = 0
			elseif roleFace == 3 then
				bulletSpeedX = 0
				bulletSpeedY = 10
			elseif roleFace == 4  then
				bulletSpeedX = 0
				bulletSpeedY = -10
			end
			lastShootTime = Time.time
		end
	else
		--运动
		local x = bullet.transform.position.x + bulletSpeedX
		local y = bullet.transform.position.y + bulletSpeedY
		bullet.transform.position = Vector3.New(x,y,0)
	end
end


运行游戏,点击鼠标左键,角色发射炮弹。另外也可以用基于组件的方法实现,这里就不展开了。
Unity3D热更新LuaFramework入门实战106222.png


最后依然到了广告时间:笔者即将出版的一本实战类书籍《Unity3D网络游戏实战》。该书通过一个完整的多人坦克对战实例,详细介绍网络游戏开发过程中涉及到的知识和技巧。书中还介绍了服务端框架、客户端网络模块、UI系统的架构等内容。相信透过本书,读者能够掌握Unity3D网络游戏开发的大部分知识,也能够从框架设计中了解商业游戏的设计思路,感谢大家支持。
Unity3D热更新LuaFramework入门实战106407.png


评分

参与人数 1蛮牛币 +6 鲜花 +8 收起 理由
z7232124 + 6 + 8 很给力!

查看全部评分


回复

使用道具 举报

排名
27790
昨日变化
29

1

主题

26

帖子

45

积分

Rank: 1

UID
183998
好友
0
蛮牛币
24
威望
0
注册时间
2016-11-16
在线时间
10 小时
最后登录
2017-4-10
发表于 2016-11-17 08:51:30 | 显示全部楼层
没有资源吗,就是为了推书吗

回复 支持 反对

使用道具 举报

5熟悉之中
502/1000
排名
5046
昨日变化

4

主题

149

帖子

502

积分

Rank: 5Rank: 5

UID
175029
好友
5
蛮牛币
1021
威望
0
注册时间
2016-10-12
在线时间
139 小时
最后登录
2017-8-28
发表于 2016-11-17 09:28:30 | 显示全部楼层
分享,还不错

回复

使用道具 举报

排名
255
昨日变化

24

主题

403

帖子

3060

积分

Rank: 9Rank: 9Rank: 9

UID
10602
好友
15
蛮牛币
6264
威望
0
注册时间
2013-12-18
在线时间
869 小时
最后登录
2017-9-16

专栏作家认证开发者

发表于 2016-11-17 10:26:34 | 显示全部楼层
想问下,你的书啥时候出啊,我准备入手一本

回复 支持 反对

使用道具 举报

排名
31673
昨日变化
33

0

主题

8

帖子

18

积分

Rank: 1

UID
145305
好友
0
蛮牛币
2
威望
0
注册时间
2016-4-12
在线时间
4 小时
最后登录
2016-11-17
发表于 2016-11-17 11:53:10 | 显示全部楼层

66666666666666666666666666

回复 支持 反对

使用道具 举报

排名
31673
昨日变化
33

0

主题

8

帖子

18

积分

Rank: 1

UID
145305
好友
0
蛮牛币
2
威望
0
注册时间
2016-4-12
在线时间
4 小时
最后登录
2016-11-17
发表于 2016-11-17 11:55:02 | 显示全部楼层
等待书的出版,到时候买一本学习下,

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1127/1500
排名
1457
昨日变化
2

0

主题

104

帖子

1127

积分

Rank: 6Rank: 6Rank: 6

UID
56303
好友
0
蛮牛币
2704
威望
0
注册时间
2014-11-19
在线时间
349 小时
最后登录
2017-8-30
发表于 2016-11-17 18:51:12 | 显示全部楼层
没时间看,先MARK

回复

使用道具 举报

2初来乍到
136/150
排名
10178
昨日变化
5

0

主题

11

帖子

136

积分

Rank: 2Rank: 2

UID
165562
好友
1
蛮牛币
273
威望
0
注册时间
2016-9-2
在线时间
55 小时
最后登录
2016-12-22
发表于 2016-11-22 09:48:49 | 显示全部楼层
先收下,迟点再看

回复

使用道具 举报

6蛮牛粉丝
1263/1500
排名
1165
昨日变化
1

1

主题

53

帖子

1263

积分

Rank: 6Rank: 6Rank: 6

UID
98011
好友
0
蛮牛币
1587
威望
0
注册时间
2015-5-6
在线时间
421 小时
最后登录
2017-9-22
发表于 2016-11-30 10:55:42 | 显示全部楼层
书什么时候出啊?期待了很久

回复 支持 反对

使用道具 举报

0

主题

37

帖子

41

积分

Rank: 1

UID
188057
好友
0
蛮牛币
1
威望
0
注册时间
2016-11-29
在线时间
4 小时
最后登录
2016-12-8
发表于 2016-12-6 09:53:45 | 显示全部楼层
6666666666666666666666

回复 支持 反对

使用道具 举报

排名
17062
昨日变化
20

23

主题

176

帖子

686

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
26
蛮牛币
1892
威望
0
注册时间
2014-11-6
在线时间
107 小时
最后登录
2017-8-13

专栏作家

 楼主| 发表于 2016-12-6 22:38:03 | 显示全部楼层
苏成龙 发表于 2016-11-17 08:51
没有资源吗,就是为了推书吗

只要把代码复制粘贴就行了,就没有做示例工程了。而且配置起来也要花一些时间,如果从第一篇开始看就能够很明白了。lz写了这么多也不容易,也允许lz放点广告吧~~~

回复 支持 反对

使用道具 举报

排名
17062
昨日变化
20

23

主题

176

帖子

686

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
26
蛮牛币
1892
威望
0
注册时间
2014-11-6
在线时间
107 小时
最后登录
2017-8-13

专栏作家

 楼主| 发表于 2016-12-6 22:38:14 | 显示全部楼层
livin 发表于 2016-11-17 10:26
想问下,你的书啥时候出啊,我准备入手一本

《Unity3D网络游戏实战》已经出版了,感谢关注^_^

回复 支持 反对

使用道具 举报

排名
17062
昨日变化
20

23

主题

176

帖子

686

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
26
蛮牛币
1892
威望
0
注册时间
2014-11-6
在线时间
107 小时
最后登录
2017-8-13

专栏作家

 楼主| 发表于 2016-12-6 22:38:20 | 显示全部楼层
maxLee 发表于 2016-11-17 11:55
等待书的出版,到时候买一本学习下,

《Unity3D网络游戏实战》已经出版了,感谢关注^_^

回复 支持 反对

使用道具 举报

排名
17062
昨日变化
20

23

主题

176

帖子

686

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
26
蛮牛币
1892
威望
0
注册时间
2014-11-6
在线时间
107 小时
最后登录
2017-8-13

专栏作家

 楼主| 发表于 2016-12-6 22:38:28 | 显示全部楼层
小小学者不懂礼 发表于 2016-11-30 10:55
书什么时候出啊?期待了很久

《Unity3D网络游戏实战》已经出版了,感谢关注^_^

回复 支持 反对

使用道具 举报

5熟悉之中
886/1000
排名
3629
昨日变化
4

4

主题

352

帖子

886

积分

Rank: 5Rank: 5

UID
165382
好友
5
蛮牛币
1761
威望
0
注册时间
2016-9-1
在线时间
216 小时
最后登录
2017-9-12
QQ
发表于 2016-12-21 09:35:40 | 显示全部楼层
说了这么多,还是为了书

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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