0x00 概要
使用Unity创建好一个项目之后,我们首先搭建起一个2D游戏的基本框架,再基于这个框架不断添加自己的元素。
一个主流2D游戏的要素:
- 玩家通过键盘,鼠标对游戏角色(Sprite)进行控制
- 游戏角色要能够根据玩家的输入做出不同行为
- 当游戏场面达到某种状态时能够触发特定的事件(比如捡起道具,击杀敌人后获得奖励)
0x01 在Unity中添加游戏要素
2D模式下,将图片直接拖入Assets中就会自动变成Sprite,再拖入到场景中:
就算创建完成了,这里黑色图片作为地面(Ground)。tank会被遮挡,选中tank,右侧的属性界面,把Order in Layer
的值设置为1,这个属性描述了sprite在哪个图层被渲染,默认都是0,数字越高表示越靠顶部。
选中一个Sprite,点击Componet -> Add… 或者直接按快捷键Ctrl+Shift+A
在出现的菜单中选择Physics 2D
然后根据需要选择物理类型,这里我选择了常用的Rigidbody 2D ,2D刚体
sprite的属性栏就会出现
然后就可以设置他的质量(Mass),线性阻力(Linear Drag),角阻力(Angular Drag),重力大小(Gravity Scale)等物理属性,勾选Simulated,Sprite的物理属性就会生效并且能够和其他2D刚体发生相互作用。
0x02 C# Scripts
在Unity中我们能够通过相当简便的鼠标点击来快速构建出我们需要的元素,接下来就需要用C#脚本编写游戏逻辑来使这些本来彼此孤立的元素连接起来,为游戏注入灵魂。
新建一个C# Script,写好之后拖到对应Sprite的属性栏里即可。
最简单的移动:
float dx = Input.GetAxis("Horizontal");
float dy = Input.GetAxis("Vertical");
这两行可以读取水平和垂直的按键(↑↓←→或WASD都可以),然后保存为水平和垂直的单位分量 , 数值在(-1,0,1)中取
或者使用Input.GetKey来获取任意某个按键是否被按:
if(Input.GetKeyDown(KeyCode.Escape))
Application.Quit();
这个实例实现了按下ESC退出游戏的效果
其中Input.GetKeyDown() 在指定的按键按下时返回true
,一般游戏中获取按键用这个函数
Input.GetKey() 指定按键处于按下状态时返回true
需要持续监测的按键可以用他,比如实现按住一个键蓄力。
**Input.GetKeyUp()**指定按键弹起时返回false
以上三个函数都应该在 Update 函数中调用,每一帧获取按键状态
Event.KeyCode类中的成员变量有:
A ‘a’键
B ‘b’键
C ‘c’键
D ‘d’键
E ‘e’键
F ‘f’键
G ‘g’键
H ‘h’键
I ‘i’键
J ‘j’键
K ‘k’键
L ‘l’键
M ‘m’键
N ‘n’键
O ‘o’键
P ‘p’键
Q ‘q’键
R ‘r’键
S ‘s’键
T ‘t’键
U ‘u’键
V ‘v’键
W ‘w’键
X ‘x’键
Y ‘y’键
Z ‘z’键
Backspace 退格键
Delete Delete键
TabTab键
Clear Clear键
Return 回车键
Pause 暂停键
Escape ESC键
Space 空格键
Keypad0 小键盘0
Keypad1 小键盘1
Keypad2 小键盘2
Keypad3 小键盘3
Keypad4 小键盘4
Keypad5 小键盘5
Keypad6 小键盘6
Keypad7 小键盘7
Keypad8 小键盘8
Keypad9 小键盘9
KeypadPeriod 小键盘“.”
KeypadDivide 小键盘“/”
KeypadMultiply小键盘“*”
KeypadMinus 小键盘“-”
KeypadPlus 小键盘“+”
KeypadEnter 小键盘“Enter”
KeypadEquals 小键盘“=”
UpArrow 方向键上
DownArrow 方向键下
RightArrow 方向键右
LeftArrow 方向键左
Insert Insert键
Home Home键
EndEnd键
PageUp PageUp键
PageDown PageDown键
F1功能键F1
F2功能键F2
F3功能键F3
F4功能键F4
F5功能键F5
F6功能键F6
F7功能键F7
F8 功能键F8
F9 功能键F9
F10 功能键F10
F11 功能键F11
F12 功能键F12
F13 功能键F13
F14 功能键F14
F15 功能键F15
Alpha0 按键0
Alpha1 按键1
Alpha2 按键2
Alpha3 按键3
Alpha4 按键4
Alpha5 按键5
Alpha6 按键6
Alpha7 按键7
Alpha8 按键7
Alpha9 按键9
Exclaim ‘!’键
DoubleQuote双引号键
Hash Hash键
Dollar ‘$’键
AmpersandAmpersand键
Quote 单引号键
LeftParen 左括号键
RightParen右括号键
Asterisk ‘ * ’键
Plus ‘ + ’键
Comma ‘ , ’键
Minus ‘ - ’键
Period ‘ . ’键
Slash ‘ / ’键
Colon ‘ : ’键
Semicolon‘ ; ’键
Less ‘ < ‘键
Equals ‘ = ‘键
Greater ‘ > ‘键
Question ‘ ? ’键
At ‘@’键
LeftBracket‘ [ ‘键
Backslash ‘ \ ’键
RightBracket‘ ] ’键
Caret ‘ ^ ’键
Underscore‘ _ ’键
BackQuote‘ ` ’键
Numlock Numlock键
Capslock 大小写锁定键
ScrollLockScroll Lock键
RightShift 右上档键
LeftShift 左上档键
RightControl右Ctrl键
LeftControl左Ctrl键
RightAlt 右Alt键
LeftAlt 左Alt键
LeftApple 左Apple键
LeftWindows左Windows键
RightApple右Apple键
RightWindows右Windows键
AltGr Alt Gr键
Help Help键
Print Print键
SysReq Sys Req键
Break Break键
Mouse0 鼠标左键
Mouse1 鼠标右键
Mouse2 鼠标中键
Mouse3 鼠标第3个按键
Mouse4 鼠标第4个按键
Mouse5 鼠标第5个按键
Mouse6 鼠标第6个按键
JoystickButton0 手柄按键0
JoystickButton1 手柄按键1
JoystickButton2 手柄按键2
JoystickButton3 手柄按键3
JoystickButton4 手柄按键4
JoystickButton5 手柄按键5
JoystickButton6 手柄按键6
JoystickButton7 手柄按键7
JoystickButton8 手柄按键8
JoystickButton9 手柄按键9
JoystickButton10 手柄按键10
JoystickButton11 手柄按键11
JoystickButton12 手柄按键12
JoystickButton13 手柄按键13
JoystickButton14 手柄按键14
JoystickButton15 手柄按键15
JoystickButton16 手柄按键16
JoystickButton17 手柄按键17
JoystickButton18 手柄按键18
JoystickButton19 手柄按键19
Joystick1Button0 第一个手柄按键0
Joystick1Button1 第一个手柄按键1
Joystick1Button2 第一个手柄按键2
Joystick1Button3 第一个手柄按键3
Joystick1Button4 第一个手柄按键4
Joystick1Button5 第一个手柄按键5
Joystick1Button6 第一个手柄按键6
Joystick1Button7 第一个手柄按键7
Joystick1Button8 第一个手柄按键8
Joystick1Button9 第一个手柄按键9
Joystick1Button10 第一个手柄按键10
Joystick1Button11 第一个手柄按键11
Joystick1Button12 第一个手柄按键12
Joystick1Button13 第一个手柄按键13
Joystick1Button14 第一个手柄按键14
Joystick1Button15 第一个手柄按键15
Joystick1Button16 第一个手柄按键16
Joystick1Button17 第一个手柄按键17
Joystick1Button18 第一个手柄按键18
Joystick1Button19 第一个手柄按键19
Joystick2Button0 第二个手柄按键0
Joystick2Button1 第二个手柄按键1
Joystick2Button2 第二个手柄按键2
Joystick2Button3 第二个手柄按键3
Joystick2Button4 第二个手柄按键4
Joystick2Button5 第二个手柄按键5
Joystick2Button6 第二个手柄按键6
Joystick2Button7 第二个手柄按键7
Joystick2Button8 第二个手柄按键8
Joystick2Button9 第二个手柄按键9
Joystick2Button10 第二个手柄按键10
Joystick2Button11 第二个手柄按键11
Joystick2Button12 第二个手柄按键12
Joystick2Button13 第二个手柄按键13
Joystick2Button14 第二个手柄按键14
Joystick2Button15 第二个手柄按键15
Joystick2Button16 第二个手柄按键16
Joystick2Button17 第二个手柄按键17
Joystick2Button18 第二个手柄按键18
Joystick2Button19 第二个手柄按键19
Joystick3Button0 第三个手柄按键0
Joystick3Button1 第三个手柄按键1
Joystick3Button2 第三个手柄按键2
Joystick3Button3 第三个手柄按键3
Joystick3Button4 第三个手柄按键4
Joystick3Button5 第三个手柄按键5
Joystick3Button6 第三个手柄按键6
Joystick3Button7 第三个手柄按键7
Joystick3Button8 第三个手柄按键8
Joystick3Button9 第三个手柄按键9
Joystick3Button10 第三个手柄按键10
Joystick3Button11 第三个手柄按键11
Joystick3Button12 第三个手柄按键12
Joystick3Button13 第三个手柄按键13
Joystick3Button14 第三个手柄按键14
Joystick3Button15 第三个手柄按键15
Joystick3Button16 第三个手柄按键16
Joystick3Button17 第三个手柄按键17
Joystick3Button18 第三个手柄按键18
Joystick3Button19 第三个手柄按键19
基本涵盖了常见外设的所有按键。
if (Input.GetMouseButton(0)) Fire();
点击鼠标左键,就调用Fire函数
0: 左键
1: 右键
2: 滚轮键
3-6定义了鼠标上其他的一些键,但并不是所有的鼠标都有这些键。
识别到鼠标的点击后,往往还需要获取此时光标的位置,读取Input.mousePosition的值可以以Vector3的形式获得鼠标的当前位置.
下面的Update中的片段实现了点击鼠标左键时让Sprite朝向鼠标点击方向
if (Input.GetMouseButton(0))
{
Vector3 ms = Input.mousePosition;
ms = Camera.main.ScreenToWorldPoint(ms); //获取鼠标相对位置
Vector3 gunPos = this.transform.position; //对象的位置
float fireangle; //转动角度
Vector2 targetDir = ms - gunPos; //计算鼠标位置与对象位置之间的角度
fireangle = Vector2.Angle(targetDir, Vector3.up);
if (ms.x > gunPos.x)fireangle = -fireangle;
this.transform.eulerAngles = new Vector3(0, 0, fireangle);
}