Unity3D是由Unity Technologies开发的一个强大的游戏引擎。Unity3D具有入门快,操作方便,开发迅速等特点大受欢迎。Unity3D具有AI,渲染,物理运算,声音,动画系统,资源管理,跨平台,系统架构等模块并且同时支持开发3D和2D游戏,使得开发游戏门槛大大降低。
这里安利一下官网便于大家下载Unity3D和资料学习------Unity3D官网(但是官网好像经常奔溃
),学习Unity3D需要学习的语言是C#和JS。最新版本是Unity3D5.52.当然你需要根据你的电脑配置选择合适的版本。当然除了安装Unity3D,你也可以去安装下Cache Server(减少导入资源文件及平台切换时间,主要是团队开发用的,至于我们这种个人就算了
),有个博客详细介绍了Cache Server.,还有内置着色器(用于美化效果之类的),标准的资源(一些资源和效果),示例项目(下载之后可以打开并且运行,超级好玩,绝对停不下来
)
现在开始做我的第一个项目------井字棋。这是成品图。
创建一个C#脚本文件,去掉Update方法,因为这里我不会用到它。然后添加OnGUI方法。声明两个私有变量,一个用来记录是谁的回合, 假定turn为1是圈圈的回合,turn为-1是叉叉的回合。另一个变量为3*3的二维数组,用来记录当前九宫格的状态,假定1代表格子里是圈圈,2代表格子里是叉叉。函数reset用来初始化参数,在脚本被调用时(Start)执行一次。
void Reset() {
turn = 1;
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
state[i,j] = 0;
}
}
}
思路就是通过OnGUI的方法每一帧都动态生成3*3的按钮形成棋盘,并且生成按钮与3*3的state数组是一一对应的。通过state[i][j]的值是0,即未下棋的位置,1为圆圈下棋的位置,2为叉叉下棋的位置。如果游戏进行中,state[i][j]值为0且按钮被点击,就将对应的state[i][j]赋值为1或者2。
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
if (state [i, j] == 1)
GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), img1);
if (state [i, j] == 2)
GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), img2);
if (GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), "")) {
if (result == 0) {
if (turn == 1)
state [i, j] = 1;
else
state [i, j] = 2;
turn = -turn;
}
}
}
}
定义一个表示结果的变量result,每次进入OnGUI就通过check()函数去检查是否游戏结束,谁赢了,若游戏进行中则返回0,若圆圈赢则返回1,若叉叉赢则返回2.检查哪一方胜利也很简单,从横向,纵向,斜线分布判断是否三个值都一样就行,若是就返回该值,若不是则返回0;
//判断游戏结束条件
int check() {
// 横向连线
for (int i=0; i<3; ++i) {
if (state[i,0]!=0 && state[i,0]==state[i,1] && state[i,1]==state[i,2]) {
return state[i,0];
}
}
//纵向连线
for (int j=0; j<3; ++j) {
if (state[0,j]!=0 && state[0,j]==state[1,j] && state[1,j]==state[2,j]) {
return state[0,j];
}
}
//斜向连线
if (state[1,1]!=0 &&
state[0,0]==state[1,1] && state[1,1]==state[2,2] ||
state[0,2]==state[1,1] && state[1,1]==state[2,0]) {
return state[1,1];
}
return 0;
}
当然我们是用GUI做的游戏就不得不理解一下GUI的一些语法。
我们游戏中使用了Lable,Button这两种控件。
static function Label(position: Rect, text: String, style GUIStyle):void;
static function Label(position: Rect, imageTexture, style GUIStyle):void;
static function Button(position: Rect, text: String, style GUIStyle):boolean;
static function Button(position: Rect, imageTexture, style GUIStyle):boolean;
position : Rect ——标签在屏幕上的矩形位置,(起点x坐标,起点y坐标,标签宽度,标签高度)。
text : String ——在标签上显示的文本内容。
image : Texture ——在标签上显示的纹理,图片。
style : GUIStyle ——使用的样式,如果不使用,那么标签的样式使用的就是当前的GUISkin皮肤
描述:
更多控件知识请关注这个博客。
单纯使用GUIStyle,真的很丑
,字真的很小,又不美观。
建议自己设置GUIStyle,语法:GUIStyle fontStyle = new GUIStyle ();
fontStyle.fontSize = 40;//设置字号40
fontStyle1.normal.background = img;//设置背景图片
fontStyle2.normal.textColor = new Color (255, 255, 255);//设置字体颜色
这里提供一个链接关于GUIStyle.
至于图片使用
public Texture2D img;
public Texture2D img1;
public Texture2D img2;
在脚本的检视面板可以看到,直接把图片拖进去就行了
然后讲解一个初学GUI控件的人会遇到的迷惑的地方
static function Button(position: Rect, text: String):boolean;
因为Returns(返回):布尔值——当该按钮被点击时返回true。
所以上面那句话是创建了按钮然后如果被点击就执行Reset(),但是不管是否点击,都会创建按钮;
GUI是Unity3D原生的GUI,实际开发中大多使用NGUI(渣渣的我上网找了好久,才找到一个NGUI版本,而且是付费的),教程自己去找哦,总之觉得功能更加强大了
这是链接:http://pan.baidu.com/s/1o87BuMA 密码:1jgy
有需要自取哈
如果说只有界面没有声音是不是觉得有点乏味呢?
那就加点声音吧。
先来介绍一下音频
游戏音频分为背景音乐与环境音乐两种。
Audio Clip(音频剪辑)有四种音乐格式。
MP3:适合较长音频,作为背景音乐。
Ogg:适合较长音频,作为背景音乐。
Wav:适合较短音频,作为环境音乐。
Aiff:适合较短音频,作为环境音乐。
在主摄像机 属性中单击Add Component 选择Audio 组件单击在选择Audio Source组件。这样声源组件就添加到了主摄像机中了。而要在游戏中听到声音就需要有一个游戏对象添加一个Audio listener组件,一般来说这个组件是添加到主摄像机上的。unity3d中的限制,只能有一个游戏对象有audio listener组件,也就是说一个场景中audio listener组件只能出现一次;而audio source可以出现许多次。更通俗一些,就是游戏世界中只能有一个人有耳朵,但是其他对象都可以有嘴巴。
下载你喜欢的配乐吧
下面贴上我整个项目的代码
using UnityEngine;
using System.Collections;
public class hom1 : MonoBehaviour {
private int turn = 1; //记录是谁的回合
private int[,] state = new int[3,3]; //九方格数据
public Texture2D img;
public Texture2D img1;
public Texture2D img2;
// Use this for initialization
void Start () {
Reset ();
}
void OnGUI() {
GUIStyle fontStyle = new GUIStyle ();
GUIStyle fontStyle1 = new GUIStyle ();
GUIStyle fontStyle2 = new GUIStyle ();
fontStyle.fontSize = 40;
fontStyle1.normal.background = img;
fontStyle2.fontSize = 30;
fontStyle2.normal.textColor = new Color (255, 255, 255);
GUI.Label (new Rect (0, 0, 1024, 781), "", fontStyle1);
GUI.Label (new Rect (230, 120, 100, 100), "Welcome to Game", fontStyle);
GUI.Label (new Rect (50, 150, 200, 100), img1);
GUI.Label (new Rect (600, 150, 200, 100), img2);
if (GUI.Button (new Rect (350, 500, 100, 50), "RESET"))
Reset ();
int result = check ();
if (result == 1) {
GUI.Label (new Rect (50, 250, 100, 50), "O wins!", fontStyle2);
} else if (result == 2) {
GUI.Label (new Rect (600, 250, 100, 50), "X wins!", fontStyle2);
}
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
if (state [i, j] == 1)
GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), img1);
if (state [i, j] == 2)
GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), img2);
if (GUI.Button (new Rect (280 + i * 80, 220 + j * 80, 80, 80), "")) {
if (result == 0) {
if (turn == 1)
state [i, j] = 1;
else
state [i, j] = 2;
turn = -turn;
}
}
}
}
}
void Reset() {
turn = 1;
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
state[i,j] = 0;
}
}
}
//判断游戏结束条件
int check() {
// 横向连线
for (int i=0; i<3; ++i) {
if (state[i,0]!=0 && state[i,0]==state[i,1] && state[i,1]==state[i,2]) {
return state[i,0];
}
}
//纵向连线
for (int j=0; j<3; ++j) {
if (state[0,j]!=0 && state[0,j]==state[1,j] && state[1,j]==state[2,j]) {
return state[0,j];
}
}
//斜向连线
if (state[1,1]!=0 &&
state[0,0]==state[1,1] && state[1,1]==state[2,2] ||
state[0,2]==state[1,1] && state[1,1]==state[2,0]) {
return state[1,1];
}
return 0;
}
}
以上实现感谢胡江川师兄的博客提供思路。
有兴趣可以去我的GitHub看整个项目,这是传送门