这是我学Unity3D的第一个小游戏,挺简单的,代码量也不多,参考博客是 UNITY3D学习(1)之GUI井字棋。对于Unity3D,想必大家都比较熟悉了的,我就不多作介绍了。需要了解Unity3D的,可以去这个博客——【Unity3D入门教程】Unity3D简介、安装和程序发布。

好了,闲话就不说了,先来看看成品:

首先就是游戏背景,在这次项目中呢,背景其实是有点水分的。就是Create一个plane,然后,用一张贴图贴在plane上,再将摄像机的镜头对准平面就好了,就这么伪装出了一个背景。当然,你要是觉得这样子操作麻烦,也可以用代码实现。代码如下:

 public Texture2D img;GUIStyle bground = new GUIStyle();bground.normal.background = img;GUI.Label(new Rect(0, 0, Screen.width, Screen.height), "", bground);

后面就都是代码实现就好了。先是在Asserts里面创建一个一个C#文件(最好还是讲将资源归类,即在Asserts下面创建一个Scripts文件夹,再将C#文件放在Scripts里面)。

下面对代码实现说明一下过程:
     首先,就是实现一个ResetMap()函数,用于放在Start()中将棋盘初始化,同时也用在Reset按钮中,实现棋盘的初始化。代码实现很简单,就是开一个3*3的数组,将里面的元素全部初始化为0就好。如下:

    /// <summary>/// 重置地图(全为0)/// </summary>void ResetMap(){for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){map[i, j] = 0;}}}

其次,写一个WhetherWin()函数,用来判定游戏是否已经结束了,并且给出是蓝方赢了还是红方赢了。判定的方法也很简单,就判断数组行、列或对角是否三个数相等即可。具体代码如下:

    /// 判断游戏是否结束/// </summary>/// <returns>1表示蓝方赢,2表示红方赢</returns>private int WhetherWin(){for(int i = 0; i < 3; i++){if(map[i, 0] == map[i, 1] && map[i, 1] == map[i, 2] && map[i, 0] != 0){return map[i, 0];}}for(int j = 0; j < 3; j++){if(map[0, j] == map[1, j] && map[1, j] == map[2, j] && map[0, j] != 0){return map[0, j];}}if(map[0, 0] == map[1, 1] && map[1, 1] == map[2, 2] && map[0, 0] != 0){return map[0, 0];}if(map[0, 2] == map[1, 1] && map[1, 1] == map[2, 0] && map[1, 1] != 0){return map[1, 1];}return 0;}

最后,就是完成OnGUI()方法就好了。主要的做法,就是做出一个由九个Label组装成的九宫格,每个Label分别对应map数组中的每个元素。例如,当map[0, 0]中的值为0时,表示这个地方还为被占领,当值为1时,表示已经被蓝方占领了,当值为2时,表示已经被红方占领了。每一次鼠标点击Label,若对应数组元素的值为0,就把该处的值赋值为1或者2,并在每帧图像中对已经被占领了的Label加上背景,作为占领的标志。具体的实现如下:

        for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){float x = midWidth - 1.5f * buttonEdge + j * buttonEdge;float y = midHeight - 1.5f * buttonEdge + i * buttonEdge;if ( map[i, j] == 1){GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), img_0);}else if(map[i, j] == 2){GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), img_1);}else{if(GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), "")){if(player % 2 == 0){map[i, j] = 1;}else{map[i, j] = 2;}player = (player + 1) % 2;}}}

在这次项目中,主要用到的是GUI控件中的Label和Button,关于这两个控件的具体用法,可参考这个博客——Unity3D入门篇——第三讲 GUI控件(一)。
     核心的逻辑大概就是这些啦。至于具体的UI要设置成什么样子,可以在了解了这些控件的用法后,实现成自己想要的那个样子。
     当然,既然是游戏,就肯定不能就这么一个画面,肯定要加一点声音上去的。找一个游戏对象(在这里就只有摄影机和平面了),然后,AddComponent -> Audio ->Audio Source。接下来,如图:

     接着,在摄像机这个对象上,AddComponent -> Audio -> Audio Listener,游戏就会有背景音乐了。要是需要对音频有更高的要求,可以参考博客——关于Unity中3D声音的使用。

接下来就说一下贴图怎么放进去吧。虽然这个挺简单的,当时自己也找了挺久才知道怎么弄。由于我们把C#文件绑定在了摄像机上,在摄像机的C#文件组件中,我们可以看到下面这样:

     然后,就是一样的套路,点击箭头所指的那里,添加textures就行了。

至此,我的第一个小项目就完成了,下面附上完成的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameScense : MonoBehaviour {//地图。 0表示未被占据,1 表示蓝色方占据, 2表示红色方占据private int[,] map = new int[3, 3];private int player = 0;public AudioClip audio; //开始的音乐private AudioSource audioSource;//玩家图片public Texture2D img_0;public Texture2D img_1;/// <summary>/// 重置地图(全为0)/// </summary>void ResetMap(){for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){map[i, j] = 0;}}audioSource.Play();//startAudio.gameObject.GetComponent<AudioSource>().Play();}private void Awake(){//设置AudioSource组件audioSource = this.gameObject.GetComponent<AudioSource>();audioSource.loop = false;audioSource.volume = 1.0f;audioSource.clip = audio;}// Use this for initializationvoid Start () {ResetMap();    }/// <summary>/// 判断游戏是否结束/// </summary>/// <returns>1表示蓝方赢,2表示红方赢</returns>private int WhetherWin(){for(int i = 0; i < 3; i++){if(map[i, 0] == map[i, 1] && map[i, 1] == map[i, 2] && map[i, 0] != 0){return map[i, 0];}}for(int j = 0; j < 3; j++){if(map[0, j] == map[1, j] && map[1, j] == map[2, j] && map[0, j] != 0){return map[0, j];}}if(map[0, 0] == map[1, 1] && map[1, 1] == map[2, 2] && map[0, 0] != 0){return map[0, 0];}if(map[0, 2] == map[1, 1] && map[1, 1] == map[2, 0] && map[1, 1] != 0){return map[1, 1];}return 0;}//用屏幕的高度作为度量单位来处理屏幕大小不同而导致的问题private void OnGUI(){int midWidth = Screen.width / 2;int midHeight = Screen.height / 2;int buttonEdge = Screen.height / 5;GUIStyle fontStyle_0 = new GUIStyle();fontStyle_0.fontSize = buttonEdge / 2;fontStyle_0.fontStyle = FontStyle.Bold;fontStyle_0.normal.textColor = Color.black;GUIStyle fontStyle_1 = new GUIStyle();fontStyle_1.fontSize = buttonEdge /2;fontStyle_1.fontStyle = FontStyle.Bold;fontStyle_1.normal.textColor = Color.blue;GUIStyle fontStyle_2 = new GUIStyle();fontStyle_2.fontSize = buttonEdge / 2;fontStyle_2.fontStyle = FontStyle.Bold;fontStyle_2.normal.textColor = Color.red;GUI.Label(new Rect(midWidth - buttonEdge * 4, midHeight - 1.5f * buttonEdge, 1.5f * buttonEdge, 1.5f * buttonEdge), img_0);GUI.Label(new Rect(midWidth - buttonEdge * 4, midHeight, 1.5f * buttonEdge, buttonEdge), "Blue", fontStyle_1);GUI.Label(new Rect(midWidth + buttonEdge * 3, midHeight - 1.5f * buttonEdge, 1.5f * buttonEdge, 1.5f * buttonEdge), img_1);GUI.Label(new Rect(midWidth + buttonEdge * 3, midHeight, 1.5f * buttonEdge, buttonEdge), "Red", fontStyle_2);int winner = WhetherWin();//    Debug.Log(winner);if(winner == 1){if (GUI.Button(new Rect(midWidth - buttonEdge * 1.5f, 0.5f * buttonEdge, 3 * buttonEdge, 3.5f * buttonEdge), "Blue Win", fontStyle_1)){ResetMap();}}else if(winner == 2){if (GUI.Button(new Rect(midWidth - buttonEdge * 1.5f,0.5f * buttonEdge, 3 * buttonEdge, 3.5f * buttonEdge), "Red Win", fontStyle_2)){ResetMap();}}else{GUI.Label(new Rect(midWidth - buttonEdge * 2.5f, buttonEdge / 4, buttonEdge * 2, buttonEdge), "Welcome To Tictactoe", fontStyle_0);}if(GUI.Button(new Rect(midWidth - 0.5f*buttonEdge, midHeight + 1.75f*buttonEdge, buttonEdge, 0.5f*buttonEdge), "Reset")){ResetMap();}for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){float x = midWidth - 1.5f * buttonEdge + j * buttonEdge;float y = midHeight - 1.5f * buttonEdge + i * buttonEdge;if ( map[i, j] == 1){GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), img_0);}else if(map[i, j] == 2){GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), img_1);}else{if(GUI.Button(new Rect(x, y, buttonEdge, buttonEdge), "")){if(player % 2 == 0){map[i, j] = 1;}else{map[i, j] = 2;}player = (player + 1) % 2;//改变玩家角色}}}}}
}

Unity3D 实践学习1 GUI井字棋的实现相关推荐

  1. 用Unity3D实现简单的井字棋小游戏

    用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...

  2. Unity3D学习笔记(2)——用GUI制作井字棋游戏

    本来拿gui来做游戏蛮怪的,但这却是一个熟悉gui的不错的途径.今天我就学着使用GUI.Button做了一个十分简单的井字棋游戏.上个成品图: 首先创建一个C#脚本文件,去掉Update方法,因为这里 ...

  3. php 井字棋,Unity3D 井字棋

    Unity3D 井字棋 今天第一次Unity实战,先用GUI写个井字棋的小游戏.先上成品图: 首先创建c#脚本,添加GUI方法.此时考虑到要记录九宫格每个位置的状态以及此时是谁在点击,所以创建两个私有 ...

  4. 基于Unity设计的井字棋小游戏

    资源下载地址:https://download.csdn.net/download/sheziqiong/86871335 资源下载地址:https://download.csdn.net/downl ...

  5. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

    来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...

  6. java井字游戏_java井字棋源代码(双人对战版)

    [实例简介] [实例截图] [核心代码] package com.pan.ttt; import java.awt.*; import java.awt.event.*; import javax.s ...

  7. 3D游戏编程与设计-井字棋

    3D游戏编程与设计-井字棋 目录 3D游戏编程与设计-井字棋 A. 简答题 1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系 ① 游戏对象 ② 资源 2. 下载几个游戏案 ...

  8. unity井字棋和一些重要概念(中山大学3D游戏作业2)

    中山大学3D游戏作业2 一.简答题 1. 解释游戏对象和资源的联系和区别 2.下载几个游戏案例,总结资源.对象组织的结构. 3.编写代码使用debug语句验证MonoBehaviour基本行为或事件触 ...

  9. python井字棋ai,python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

最新文章

  1. P2261 [CQOI2007]余数求和
  2. 玩转Regsvr32命令
  3. cJSON库源码分析
  4. 短时能量法代码c语言,[蓝桥杯][算法提高]能量项链 (Python代码)
  5. Windows服务器修改默认TTL值的方法
  6. 设计模式练习_设计练习是邪恶的
  7. 总结 Visual Studio 2019 发布以来 XAML 工具的改进
  8. 一款简约图库开源代码
  9. 谁说我们没有美国富---中国公款消费一年X掉9个航母战斗群
  10. nginx 日志过滤网络爬虫
  11. 如何将一棵树转换成二叉树
  12. json在线格式化【推荐】
  13. VS2010+VAX+CUDA6.0配置语法高亮和自动补充
  14. Android知识点 121 —— AlarmManager与RTC唤醒
  15. 岁月划过生命线(从阿里到微店)
  16. 找回SecureCRT密码
  17. R语言随机森林报错The response has five or fewer unique values. Are you sure you want to do regression原因及解决办法
  18. Hive操作——删除表(drop、truncate)
  19. vue实现input输入模糊查询(三种方式)
  20. Python练习-2

热门文章

  1. Data Mesh的原则和逻辑架构
  2. 换服务器要做网站备案吗,换服务器后域名要重新备案吗
  3. Android APK 瘦身 - JOOX Music项目实战
  4. 在Chrome中安装vue_devtools调试工具
  5. 宗地,图斑,线状地物,零星地物
  6. HashData外部表分隔符 E‘\001‘
  7. SSH authorized_keys 无效问题
  8. 阿里云SAG 2.0发布,助力企业全球互联
  9. 乐视TV超级电视今日发布 互联网入侵传统电视
  10. 京东量化教你用kline获取量化数据