游戏开发中 动作网络游戏大全对象指什么意思

主题 : cocos2dx如何暂停某个对象的某个动作?
级别: 新手上路
可可豆: 82 CB
威望: 72 点
在线时间: 72(时)
发自: Web Page
来源于&&分类
cocos2dx如何暂停某个对象的某个动作?&&&
问题如题;问题描述: 一、对某个node执行了某个动作; 二、在某个时刻暂停了这个node的当前动作; 三、新建立一个动作,并让这个node执行这个新动作; 四、当这个新动作执行完后的某个时刻,再次恢复之前暂停的动作;目前实现过程: 一、用了CCDirector::sharedDirector()-&getActionManger()-&pauseTarget(node);方法是暂停了node的当前运行的动作(如果有多个都会暂停的); 二、建立了一个新动作,并让node-&runAction(newAction);是不执行的;现象相当是停止的; 三、通过CCDirector::sharedDirector()-&getActionManager()-&resumeTarget(node);这个方法恢复了node的节点动作,现象是之前的动作与第二步创建的新动作都在执行了;最终问题是: 可以通过什么办法实现,暂停node中的某个动作,并让node执行一个新动作,等这个新动作执行完后,或必要的时候,重新恢复node的暂停的那些动作。对于参回答的同胞,在此先谢过!
勇敢的做好一名开发者
级别: 版主
UID: 300874
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
发自: Web Page
Action可以添加tag。
级别: 侠客
UID: 303435
可可豆: 161 CB
威望: 151 点
在线时间: 33(时)
发自: Web Page
可以用stopAction的方法吧,不过你得存储你的Action,当然新的Action序列执行完,就可以再次运行之前的Action,而你用导演类的话,那个是对所有Action队列进行操作的,所以不该采用
One way to catch my dream
级别: 新手上路
可可豆: 31 CB
威望: 31 点
在线时间: 12(时)
发自: Web Page
楼主,我遇到同样的问题了,请问你最后是怎么解决的?
级别: 新手上路
可可豆: 82 CB
威望: 72 点
在线时间: 72(时)
发自: Web Page
回 3楼(willtionvon) 的帖子
就没有用暂时这个功能,而是执行停止动作一,运行动作二,然后再停止动作二,再新建立一个与动作一样的动作去运行
勇敢的做好一名开发者
级别: 侠客
可可豆: 202 CB
威望: 202 点
在线时间: 122(时)
发自: Web Page
void Node::resume(){&&&&_scheduler-&resumeTarget(this);&&&&_actionManager-&resumeTarget(this);&&&&_eventDispatcher-&resumeEventListenersForTarget(this);}void Node::pause(){&&&&_scheduler-&pauseTarget(this);&&&&_actionManager-&pauseTarget(this);&&&&_eventDispatcher-&pauseEventListenersForTarget(this);}
级别: 侠客
可可豆: 202 CB
威望: 202 点
在线时间: 122(时)
发自: Web Page
所以调用Node的pause和resume就可以暂停 和 恢复动作了,而且不影响其他Node的动作。如果是同一个Node的动作,暂停其中一个,这个我也不会
级别: 新手上路
可可豆: 185 CB
威望: 185 点
在线时间: 171(时)
发自: Web Page
先设置 某个action-&tag(7)&& 暂停&&node-&getagbyaction(7)-&stop();&&&& 恢复 node-&runaction(xx)
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版您的位置: &&
游戏动作特效班
武汉游戏动作特效培训
价格:详询
课时:详询
班制:周末班&&&&
上课地点:武汉欧亚达汉阳国际广场&&&&
开课学校:
学校信誉:
课程热线:
课程评分:4.5分
课程周期:24周
上课模式:小班教学
招生对象:中等学历,有一定的电脑基础,想在游戏行业发展的有志之士,懂绘画更好。
学习目标learning target
学习Bone骨骼系统的使用、掌握蒙皮技术,权重的分配,变形的方法。为游戏角色添加骨骼及整套骨骼的动画控制装备以及游戏上架和发布。
Course features课程特色
以丝路制作公司专业项目实践方式,采用边讲边练的方式并加强测试环节、及时验证学生的学习效果,着重强化学员的职业素质和项目能力的训练
课程内容:
**阶段:photoshop应用
1.PS基础培训,熟悉操作技法;
2.掌握Photoshop相关软件操作基础,
第二阶段:三维软件的操作&
1.道具制作
2.学习对各类模型进行骨骼绑定与蒙皮的制作
3.学习对各类模型进行蒙皮的制作
第三阶段:动作进阶&
1.动作原理及应用
2.人物动作设定
3.四足类动作设定
4.飞禽类动作设定
第四阶段:游戏特效
1. 常见的粒子特效
2. 贴图特效
第五阶段:引擎介绍
1.JavaScript和C#基本语法概念
2.赋值、比较、逻辑、条件运算符
3.数学运算符
4.控制语句与循环语句
第六阶段:Unity功能函数
1.控制语句与循环语句
2.游戏物体的位移、旋转与放缩
3.动态生成
4.控制其他物体及组件、存取资源数据等。
第七阶段:角色控制及常见游戏行为
1. 游戏开始、结束、**等场景之间的跳转制作,显示游戏的加载和进度条的效果
第八阶段:UI界面
1. Unity GUI功能,实现按钮、输入框、滑动条、登陆及密码设等
2. UI界面皮肤更换
3. UI图标设计
第九阶段:游戏场景连接
1.针对Android或IOS平台办公类、休闲类APP应用产品的全案实训
第十阶段:游戏发布上架
1.单机版游戏发布教学: PC
2.网页版游戏发布教学:WEB
3.Android手机平台游戏发布及上架流程
4 Iphone手机平台游戏发布及上架流程
5.其他平台发布介绍
第十一阶段:项目实训&
1.项目策划及资源准备
2.跟据策划案的流程制作游戏,从无到有感受游戏开发的完整过程
第十二阶段:毕业和就业
1.教授简历制作、作品整理的技巧
2 邀请游戏公司专家模拟应聘过程、做全面的就业指导
3.向各大游戏公司合适的岗位推荐
校区地址: &&&&&
报名热线:&(何老师) &&QQ:
我想学的是:《游戏编程》第一部 基础篇 -
《游戏编程》第一部 基础篇
文章内容:
  有了一个目标之后,往往人们比较有信心和动力。所以,我重新修改了一下教程的安排,在这儿插入了“零”篇。
  在基础篇里,我们将逐步学习关于游戏制作的基本知识,为后续的开发工作奠定基础。那么,在基础篇结束的时候,我们可以弄出个什么东西呢?我们看图:
  这是我写的一个演示程序的截图,暂时定为我们基础篇教程的目标。
  该演示程序包含了一些基本要素,如: Windows 程序的基本框架、DirectDraw 的基本使用方法、精灵的使用和 一些简单的关于
DirectInput
的东西。但是,这个程序没有对障碍和遮挡进行处理,也就是说,人物会走到任何地方去。因为一些关于地图方面的知识,我将会放到提高篇里。
  本范例在以下环境中通过:VC6.0、DirectX 7.0/8.1 SDK、Win2000/WinXP
  说明 []
  其实现在网上关于游戏编程的技术文章越来越多了,但是我发现关于最基本的了解游戏的文章还是比较少的。大多数文章是以 DirectX
作为开始教学起始的,因此,我觉得花点时间写下这篇文章还是值得的。今天,我就开始介绍一些关于游戏编程的基础东西,以便大家能够真正的开始了解游戏,从而能够很快的转入游戏开发。由于是针对新手的,如果您已经转入程序编写阶段,您完全可以抛开了。我将采用一种不同于网络上现有的教学方法,来讲一下游戏程序开发的奥秘:)
  大家可以看到游戏中主角连贯的出招动作、华丽的场景、震撼的战斗效果,这一切似乎很难让人想象程序是怎么实现的。也许您在上课无聊的时候尝试过在课本的角上画上几个人物动作的分解图,然后一遍又一遍地翻着它,觉得很好玩。其实您已经在无形之中接触了游戏动画的基本原理。其实游戏动画的步骤可以想象成这样:
  手中拿着两张纸,把一张放在后面。其实这个就是 DirectDraw
的两个成员。我们先把一个分解动作画在背后的那张纸上。那么,我们当前看到的就是一个“白屏”而已。然后,我们“快速地”将后面的那张纸拿到前面来。呵呵,你现在看到的是第一个分解动作了吧!那么,怎么“快速地”呢?不要紧张,这些问题都被
DirectDraw
完美的解决了,别急,今后会详细的讲解的。现在,当前的两张纸已经交换了,而且也看到了动作(一个静态的而已),那么后面的“白纸”怎么办呢?我们先拿“橡皮”将纸擦一遍,然后,将第二个分解图画上,接下来?呵呵,自己干吧,应该明白了吧。经过再次的交换,我们已经在屏幕上看到第二个动作了。我们继续把后面的纸擦干净,再画第三个动作,再交换,继续下去......由于我们的“快速地”动作相当快,所以感觉不到有任何问题。
  或许有人会问:为什么不直接在第一张纸上进行“擦-&画-&擦-&画”的动作呢?这个就是为了我们平常所说的“闪屏”问题而进行的解决方案。由于直接进行动作,速度相对较慢,有时用户会在屏幕上看到一闪一闪的现象。我们用“两张纸”的话,就完美的解决了这个问题。(啊?还闪屏?呵呵,你小子把显示器坏了的问题都怪我啊?#¥%……*)
  既然上面的游戏的“内幕”已经掌握,那么我们来看看在上一节中涉及的“武器”和基本知识。或许本篇所涉及的东西是基于理论的多数,但是,这将为理解在后面即将写的程序部分会打下很好的基础的。所以咬咬牙,看完吧!(啊?没有牙了啊?大家应该鼓掌吧!连牙都没有长齐的“3、4点种的太阳”都开始学习了,你们还有理由吗?恩?是大娘啊?那更应该值得学习了!跑题:)
  首先要介绍的第一位主角是 Windows 编程中的必要元素: RECT 。是英语 rectangle
的简写,意思是矩形。它有什么用呢?我们在上面不是讲到了动作的分解动作吗?我们看右图:
  这个图就是一个简单的行走动作分解图,复杂的可能有10帧左右哦:)那么怎么在程序中实现自动在纸上画出正确的图片呢?(其实我一直在考虑是否将这部分内容加上,因为实在太基本了。但是每个人都这么想的话,基础的谁来教呢?算了,让别人的口水淹死我吧!)假设您已经有点
C++ 语言的基础了。这个教我教的话,说不过去吧:)请看下面的代码:
#define m_Width&&
// 每个动作的 宽度
#define m_Height& 48&&
// 每个动作的 高度
void ShowThePic()
&&& static RECT&&&&&&&&&&&&&&
// 矩形对象,用于精确定位所要的当前动作
&&& static int CurrentFrame = 0;&&&
// 当前动作的编号
&&& static int Direction = 0;&&&&&&
// 当前的方向
&&& rect.top = D rect.bottom = (Direction+1)*m_H&
// 对当前矩形的大小定义,数学的问题哦
&&& rect.left = CurrentF rect.right =
(CurrentFrame+1)*m_W&
// 根据英文的意思也可以知道在给谁赋值
&&& BltPicToScreen();&&&&&&&&&&&&&&
// 一个伪函数,作用是将当前矩形内的图形复制到屏幕上。
&&& CurrentFrame++;
&&& if( CurrrentFrame==3 )
&&&&&&& CurrentFrame = 0;
// 这个步骤能够保证动作的循环
  不知道这么个函数你能否看懂。之所以要采用 static 静态变量,是因为我们这个函数程序要循环运行。如果直接写个 int
的话,每次执行都会被赋回原值 0,那么图片就不会变了。
  上面这段代码其实并不是那么理想。因为程序自己在那儿一个劲地运行,完全没有我们控制的份儿。别急!来看下面这份修改过的伪代码:
#define m_Width&& 32&&
// 每个动作的 宽度
#define m_Height& 48&&
// 每个动作的 高度
void ShowThePic()
&&& static RECT&&&&
// 矩形对象,用于精确定位所要的当前动作
&static int CurrentFrame = 0;
// 当前动作的编号
static int Direction = 0;&&&
// 当前的方向
rect.top = D rect.bottom = (Direction+1)*m_H
//对当前矩形的大小定义,数学的问题哦
& rect.left = CurrentF rect.right = (CurrentFrame+1)*m_W
//根据英文的意思也可以知道在给谁赋值
BltPicToScreen();&&&&
// 一个伪函数,作用是将当前矩形内的图形复制到屏幕上。
&&& if( LeftArrowDown() )
// 如果 左箭头 被按下
&&&&&&& Direction = 1;&&&
// 赋值方向为 1
&&&&&&& CurrentFrame++;
&&& if( RightArrowDown() )
&&&&&&& Direction = 3;
&&&&&&& CurrentFrame++;
&&& if( UpArrowDown() )
&&&&&&& Direction = 2;
&&&&&&& CurrentFrame++;
&&& if( DownArrowDown() )
&&&&&&& Direction = 0;
&&&&&&& CurrentFrame++;
&&& if(CurrrentFrame==3)
&&&&&&& CurrentFrame = 0;
// 这个步骤能够保证动作的循环
  经过这么一修改,问题再次得到解决。上面的代码就能够响应用户的操作了。当然,你这么直接在程序里输入这些代码是不行的:)因为是“伪代码”。你得根据实际情况,自己相应地做些修改,才能使程序运行!
  (题外话:不晓得这么进行教学,你是否能够一点一点的积累到知识?这种教程是不是合适?请到论坛内发表意见,我真的很想能够摸索出大家接受的方法,有利教学)
  欢迎回到教程中来!有人或许会问,为什么这么麻烦要把图形放在这么个图片里头,不一个动作一个图啊?呵呵,想想,那要多少图片啊,很难于管理的。况且,这样并不能避免使用这种常用手法,因为
RECT 已经是一个成员。游戏里不能不用他的!
  哇,口水干了。(其实是手累了:)我们下回再见吧。
  下回预告:
  少年侦探柯南为了查清楚事情的真相,他......(?还真的预告啊?)
  不好意思,习惯性用语了:)在下回,我会讲一下,如何将今天的代码整合到程序中去。
  Welcome back!很高兴再次与你相遇教程。废话不多说,继续。
  上次的代码片段,说实在,拿在手里没有用。为啥?因为不能运行的啊:)我们这次就按照上次的安排,讲如何将显示图片的代码片段整合到程序中,让它能够具体的体现出来。
  我将在这儿讨论 Windows 编程,而不是 MFC 。关于 MFC 和 Windows 的不同和各自的优点,我们不多涉及了。 MFC
就是微软的一个封装开发库,极大程度的降低了 Windows 开发的复杂。但是,我们还是继续 Windows 编程,呵呵。
  我们来看,一个基本的 Windows 程序是一个窗口对吧:)我们所玩的游戏,其实也是有窗口的,只不过是看不见的,而且被
DirectDraw 掩盖了而已。那么,如何创建一个窗口呢?我们来看:
BOOL Init(HINSTANCE hInst, int nCmdShow)
&&& HWND hW&&&&&&&&&&&&&&&&&&&&&&&&&&
// 窗口的句柄,就是一个储存窗口的对象
&&& WNDCLASS WndC&&&&&&&&&&&&&&&&&&
// 用于注册窗口的对象
&&& WndClass.style = CS_HREDRAW | CS_VREDRAW;
// 定义窗口的类型
&&& WndClass.lpfnWndProc = WinP&&&&&
// 指定了窗口消息的处理函数 ** 关键!
&&& WndClass.cbClsExtra = 0;&&&&&&&&&&&&
// 没有特定意义
&&& WndClass.cbWndExtra = 0;&&&&&&&&&&&&
// 没有特定意义
&&& WndClass.hInstance = hI&&&&&&&&&
// 窗口的实例
&&& WndClass.hIcon = LoadIcon(hInst, IDI_APPLICATION);
// 指定窗口的图标
&&& WndClass.hCursor = LoadCursor(hInst, IDC_ARROW);&&
// 指定程序的指针
&&& WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
// 指定背景色为黑色
&&& WndClass.lpszMenuName = NULL;&&&&&&&
// 指定菜单为无,游戏不需要
&&& WndClass.lpszClassName = &GDIM_GAME_ENGINE&;
//这个程序注册的名字
RegisterClass(&WndClass);&&&&&&&&&&&
// 注册程序
hWnd = CreateWindowEx(WS_EX_TOPMOST, &GDIM_GAME_ENGINE&, &GDIM_GAME&,
WS_POPUP, 112, 84, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInst,
// 这段代码就是实现了一个窗口的创建
// 我们可以通过来检测是否创建成功。如果失败将返回一个 FALSE 的值。
if(!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);&
// 显示窗口
UpdateWindow(hWnd);&&&&&&&&&
// 更新窗口
  好了,到这儿呢,我们就成功的创建了一个窗口。我们回头看我注了“**”的地方,关于这个函数,我们得写个同名函数来处理 Windows
的消息。呵呵,不好意思,再看一个函数:
BOOL bActive = FALSE;&&&&&&&
// 用于判断程序是否运行的变量
long PASCAL WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
switch(message)
case WM_ACTIVATE:
bActive = TRUE;&&&&&
// 当程序被激活时,赋值 TRUE
case WM_SETCURSOR:
SetCursor(NULL);&&&&
// 设定鼠标为不显示
return TRUE;
case WM_KEYDOWN:
switch(wParam)
case VK_ESCAPE:&&&&
&// 处理按下 ESC 键的反应
&&&&&&&&&&&
PostMessage(hWnd, WM_CLOSE, 0, 0);&&
// 发送一个关闭窗口的命令
&&&&&&&&&&&
case WM_DESTROY:&&&&&&&&
// 在窗口即将销毁时的反应
PostQuitMessage(0);&
// 发送一个结束的消息,必须的!
return DefWindowProc(hWnd, message, wParam, lParam);&
// 一些没有像上面一样具体定义的消息的处理
  这个函数就是用来处理 Windows 的消息的,是一个标准程序必要的。
  再来最后一个重要的函数。不好意思哦,实在是不想这么写,但是想想,在这个函数结束后,你就可以实现一个具体的窗口了哦:)
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR
lpCmdLine, int nCmdShow)
// 定义一个消息的对象
if(!Init(hInst, nCmdShow)) return FALSE;&&&&&&&&&&
// 还记得上面的那个函数吗?
// 程序的循环
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
// 不要特别注意的
&&&&&&&&&&&
if(!GetMessage(&msg, NULL, 0, 0 ))
&&&&&&&&&&&
return msg.wP
&&&&&&&&&&&
TranslateMessage(&msg);
&&&&&&&&&&&
DispatchMessage(&msg);
else if(bActive)&&&&
// 就是上面的“程序是否激活”的变量判断
&&&&&&&&&&&
ShowThePic();&&&
// 显示人物图片的函数,上节的内容,就是整合在这儿的!
else WaitMessage();&
// 没有消息时,就等消息:)
  其实到这儿,一个简单的程序已经可以出炉了:)编译,运行,你将看到一个黑色的窗口。这个窗口不同于一般的窗口,它没有平常的标题栏,这个才是适合我们游戏的。我在这儿给出完整的代码,但是,无法将上节的内容以程序的形式表现出来,因为涉及到了
DirectDraw 。我不想过多在教程中涉及未讲的知识,因为那样会影响对现有知识的理解。
  下章教程,我将开始介绍 DirectDraw 了,以便能尽快将显示的内容整合,同时我会保持教程和代码的详尽。
  本范例在以下环境中通过:VC6.0、DirectX 7.0/8.1 SDK、Win2000/WinXP
  说明 []
  真的很高兴能够继续我们的教程。大家也一定等了许久了,怪我太懒。
  上次,我们讲到了窗口的建立,并且附带了源代码,不知道大家有没有编译和运行。不是当老师的唠叨哦,大家一定要试试的,因为电脑这个东西,尤其是编程,要不断地实践才能掌握的。
  今天,我们来点轻松的,不涉及代码,我们来一次“纸上谈兵”。我今天是要大家选择适合自己的游戏引擎。曾经有很多网友问我:“引擎
”到底是什么东西?我也回答过许多遍了,但是,我从没有嫌烦过,因为我也是这么过来的。之所以取名叫“引擎”,他就像汽车之类的
Automobile
一样,得有一个家伙驱使他工作。而游戏引擎呢,他就负责接受用户输入,交付自己的内部工作机构,处理,并最终以声音、图像等形式表现出来。
  现在大家在网络上可以看到、并且下载到许多免费的游戏引擎,其中有2D的,也有时下流行的3D。国内有许多网站也在制作各自的引擎,有个别的的确有很高的效率,而且使用很方便,比如
云风 的 “风魂游戏开发库”。这些引擎都是将我们今后会碰到的 DirectDraw、DirectInput、DirectPlay 等等
部件整合,封装,使其便于使用。像我其实自己也在使用别人的引擎来开发自己的游戏制作库,那么,你该选择怎么样的引擎呢?我觉得这个完全取决于你对游戏开发的耐心及专研。
  现在,DirectX 已经发展到了 9.0 ,而且,在 8.1
的开发库中,我们很高兴的看到,微软也已经封装了以前繁琐的步骤,因此,DirectX 8.1b
的开发库,不失为一个比较好的基层函数库。为什么说他还只是一个基层的呢?因为他还没有像著名的 CDX 那样有比较高级的效果封装在里头。CDX
是我比较喜欢的封装库,他不仅使用简便,而且可以实现使用频率比较高的功能,比如 Alpha
混合,虽然他不像其他的引擎来得功能强大,但是,他用于自己的研究和扩充是很好的,通过使用 CDX ,你对 DirectX
可以有个比较理性的认识。
  到这儿,大家应该发现了,我们以前公布的教程目录和今天的对不上号,因为我发现现在其实有好多网站都有关于 DirectDraw
编程的辅导,而且,资源丰富。我相信,大家通过好好的分析这些代码,然后,大量的实践,就会打造你比较坚固的 DirectDraw 编程的基础了。
  我们今后的教程往哪个方向走,我正在考虑,我也很想看到大家的好建议,作为一个游戏编程入门者,你最想看到怎么样的文章?哪怕是一个不明白的地方,都可以提出来,我可以做专题来给大家讲解一下。DirectDraw
方面的,专题在近期是不会出现了,还请大家见谅!
  最后,告诉大家一个可能算是比较好的消息,我们的教程游戏,还在更新和完善之中哦...
本站中所有文章以及图形均为作者本人、公司所有,本站所有资讯仅供参考,若有任何损失本站概不负责,请自行斟酌。
All Rights reserved.
This site is optimized for at least
resolution (hi-color) viewing
with a browser that supports style sheets.【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作
在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我们已经学习了如何建立一个脚本并绑定到一个物体上,现在我们将进一步学习如何通过脚本对GameObject进行控制。
一、创建GameObject
在Unity里面,创建游戏对象有两种方式:
通过编辑器可视化添加,这一点我们在本系列博客的第三篇: 中已经提到
第二种,则是通过脚本进行创建和删除,这种方式会相对灵活,接下来要讲的也正是这一种方式。
首先,我们新建一个脚本,暂时命名为:GameObjectControl好了,然后打开脚本,并进行以下编辑:
using UnityEngine
using System.Collections
public class CreateObjects : MonoBehaviour {
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
void OnGUI()
if(GUILayout.Button("创建Cube",GUILayout.Height(50)))
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube)
cube.AddComponent&Rigidbody&()
cube.GetComponent&Rigidbody&().useGravity = false
cube.GetComponent&Renderer&().material.color = Color.red
cube.name = "Cube"
cube.transform.position = new Vector3(0.0f, 5.0f, 0.0f)
if (GUILayout.Button("创建Sphere", GUILayout.Height(50)))
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere)
sphere.AddComponent&Rigidbody&()
sphere.GetComponent&Rigidbody&().useGravity = false
sphere.GetComponent&Renderer&().material.color = Color.green
sphere.name = "Sphere"
sphere.transform.position = new Vector3(5.0f, 5.0f, 0.0f)
然后保存脚本,并绑定到Camera上,运行,我们就会发现在界面上多了两个按钮,然后分别点击之后,场景当中就会出现一个立方体和一个球体。
我们简要介绍一下几个主要用到的函数:
GameObject.CreatePrimitive()创建一个GameObject对象并指定一个Unity自带的模型(如果想要生成别的物体可以使用GameObject.Instantiate(),这个我们后面说到)
AddComponent& T&() 和 GetComponent& T&() 添加和获取GameObject的组件
transform.position 设置物体在世界坐标系下的位置,如果是想要相对父节点的位置,则使用transform.localPosition
二、获取GameObject
通过脚本获取GameObject有两种方式:
通过声明一个Public变量,然后在Inspector视图进行赋值
通过GameObject的属性对象名称来获取
public GameO
void Start()
if (obj == null)
obj = GameObject.Find("Cube");
三、添加组件和修改组件
新建的GameObject一般情况下都是没有任何功能属性的,我们需要给它赋予各种游戏组件它才能有自己相应的游戏功能。比如我们拿刚刚那个例子来说:
cube.AddComponent&Rigidbody&()
cube.GetComponent&Rigidbody&().useGravity = false
cube.GetComponent&Renderer&().material.color = Color.red
我们这里给cube这个物体添加了一个叫Rigidbody的组件,这是一个刚体组件,有了这个组件,这个物体就受到物理引擎的作用,然后我们修改这个组件的useGravity属性,使它不受重力的作用,并把它材质属性中的颜色改成了红色。大家可以试一下改变它的重力属性,设为true,然后运行的时候我们就能看到立方体往下掉。总的来说,我们给游戏添加组件通过AddComponent& T&()的方法,获取组件则是通过GetComponent方法,然后如果是需要销毁组件,则使用Destroy(),该方法需要提供参数,如果参数是GameObject,就会将这个Object都销毁了。
四、发送广播和消息
在游戏当中,广播和消息是游戏对象之间通讯的一个快捷方式,就像广播那样,由发送方进行消息的发送,而Receiver游戏对象里的Monobehavior脚本都能收到。它主要是通过GameObject.SendMessage(string methonName, object value = null, SendMessageOptions options = SendMessageOptionsRequireReceiver)函数发送的。下面我们来看个例子。
我们新建一个脚本叫Receiver:
using UnityE
using System.C
public class Receiver : MonoBehaviour {
void Start () {
void Update () {
void ShowNumber(int num)
Debug.Log("我是: "+ this.transform.name + " 我收到的数字是 : " + num);
然后我们将原来的GameObjectControl.cs文件改一下:
using UnityEngine
using System.Collections
public class CreateObjects : MonoBehaviour {
private GameObject[] receiver = new GameObject[2]
// Use this for initialization
void Start()
// Update is called once per frame
void Update () {
void OnGUI()
if(GUILayout.Button("创建Cube",GUILayout.Height(50)))
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube)
receiver[0] = cube
cube.AddComponent&Receiver&()
cube.AddComponent&Rigidbody&()
cube.GetComponent&Rigidbody&().useGravity = false
cube.GetComponent&Renderer&().material.color = Color.red
cube.name = "Cube"
cube.transform.position = new Vector3(0.0f, 5.0f, 0.0f)
if (GUILayout.Button("创建Sphere", GUILayout.Height(50)))
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere)
receiver[1] = sphere
sphere.AddComponent&Rigidbody&()
sphere.AddComponent&Receiver&()
sphere.GetComponent&Rigidbody&().useGravity = false
sphere.GetComponent&Renderer&().material.color = Color.green
sphere.name = "Sphere"
sphere.transform.position = new Vector3(5.0f, 5.0f, 0.0f)
if (GUILayout.Button("发送消息", GUILayout.Height(50)))
receiver[0].SendMessage("ShowNumber", 999, SendMessageOptions.RequireReceiver)
receiver[1].SendMessage("ShowNumber", 222, SendMessageOptions.RequireReceiver)
在分别创建了立方体和球体之后,点击发送消息,我们可以看到以下结果:
Message相关有3条指令:
SendMessage (“函数名”,参数,SendMessageOptions) //GameObject自身的Script
BroadcastMessage (“函数名”,参数,SendMessageOptions)
//自身和子Object的Script
SendMessageUpwards (“函数名”,参数,SendMessageOptions)
//自身和父Object的Script
关于第三个参数使用:
SendMessageOptions.RequireReceiver //如果没有找到相应函数,会报错(默认是这个状态)
SendMessageOptions.DontRequireReceiver //即使没有找到相应函数,也不会报错,自动忽略
五、克隆游戏对象
克隆游戏对象跟创建游戏对象不一样,创建游戏对象,得出来的GameObject我们需要对他进行加载组件才能有自己的功能,而克隆游戏对象则可以克隆一个完全具有一定功能的游戏对象(包括其所有的组件)。通过克隆对象,我们可以节省很多的时间,比如子弹的发射,完全可以采用克隆的手段生成大量的子弹而不用我们自己手动新建并且添加属性。同样还是GameObjectControl这个例子,我们改动一下:
在OnGUI上新增一个函数
if (GUILayout.Button("CloneCube", GUILayout.Height(50)))
GameObject obj = Instantiate(receiver[0])
obj.GetComponent&Rigidbody&().useGravity = true
obj.transform.position = new Vector3(0, 0, 0)
在分别点击创建立方体和球体之后,点击CloneCube的按键,我们可以看到每点一次就会生成一个红色的Cube出来并且往下落(因为我们设置了它的重力属性)
然后我们可以发现在Hierarchy界面上出现了很多的Cube(Clone)的Object。
六、移动、缩放,旋转
要使游戏对象在原来的基础上继续移动,在代码中可以通过transform.Translate(Vector3 offset)实现,参数是移动的数值.
使用transform.localScale = new Vector3(x,y,z);
分别代表的是x轴方向上缩放x,y轴方向上缩放y,z轴方向上缩放z
整体缩放可以通过将localScale乘一个系数实现。
游戏对象的旋转方式有两种:
围绕自身旋转
围绕某一个点或者是某向量旋转
transform.Rotate()函数是自身的旋转,Unity里面提供了很多的实现方式
transform.RotateAround()则是围绕某个点旋转
这节就先到这O(∩_∩)O,下一节会介绍一些常用的工具类~
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 动作网络游戏大全 的文章

 

随机推荐