UNITY3D学习(1)之GUI井字棋

       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看整个项目,这是传送门



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值