Unity3D 实践学习1 GUI井字棋的实现

Unity3D游戏一:IMGUI井字棋 Unity3D游戏一:IMGUI井字棋 要求 游戏内容: 井字棋 技术限制: 仅允许使用 IMGUI 构建 UI 作业目的: 了解 OnGUI() 事件,提升 debug 能力 提升阅读 API 文档能力 实现 完整代码传送门->[????][https://github.com/Tifinity/Unity3DStudy-master/tree/master/%E7%AC%AC%E... 阅读详情

     这是我学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 initialization
    void 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游戏界面 前言:    本学习笔记仅供参考,有问题可以留言!    至于Unity游戏引擎的安装破解之类的问题请自行百度。    基本的Unity界面也可以随意百度的到,所以不做阐述。一、GUI高级控件    圣典百科GUI界面纲要    系统高级UI控件已经成为游戏开发中不可或缺的一部分。高级界面由系统提供,比低级界面运行效率高(高级界面为系统实现,低级界面为自己手动实现),高级界面有很多种,可以应用于各... 阅读详情

相关推荐

Unity3D实现GUI和UGUI按下显示文本

Unity3D实现GUI和UGUI按下显示文本用GUI实现按下显示关闭文本用UGUI实现按下显示关闭文本 用GUI实现按下显示关闭文本 首先新建一个脚本click1 创建GUI,声明一下纹理,再声明一下游戏物体 public Texture image;//按钮纹理 public GameObject obj; //声明游戏物体 接下来就开始创建一个GUI按钮void OnGUI() //创建GUI按钮,创建的时候要有图片,事先要定义{ if (GUI.Button(new Rect(600, 10

jerry1036的博客 3359

Unity制作井字棋小游戏

Unity制作井字棋小游戏 前言 成果展示 项目地址 演示视频 Unity官网对ECS的定义 The Entity Component System (ECS) is the core of the Unity Data-Oriented Tech Stack. As the name indicates, ECS has three principal parts: Entities — the entities, or things, that populate your game or prog

m0_50547440的博客 568

unity3D游戏开发十三之GUI

GUI在游戏的开发中占有重要的地位,游戏的GUI是否友好,使用是否方便,很大

wangdaren的专栏 5万+

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

编程实践,小游戏井字棋,有ESC的概念,展示逻辑与业务逻辑要分开3D作业评分指标:ECS的基本理念要在实验报告中体现。一个具体指标就是OnGUI代码少。

毕业作品网站 1065

python GUI井字棋

python实现的GUI井字棋游戏,精美的开始界面及开始按钮 游戏功能: 机器人:简单的AI人工智能算法 玩家:鼠标操作

基于matlab的井字棋

基于matlab的井字棋实现,人工智能。人机对战,电脑后手。整体分为8个步骤。

Unity2D 井字棋

学习Unity2D后胡编乱造写的井字棋,很粗糙,低劣,让人无语,慎看!嘿嘿。欢迎指正批评。 直接导入写好的md,不知道有没有可能识别出错,图片是一定识别不到,是手动添加的。

Misasagi Inori的博客 1020

基于unity3d实现的井字棋游戏

【作品名称】:基于unity3d实现的井字棋游戏 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于unity3d实现的井字棋游戏

Unity3D游戏编程-井字棋

3D游戏编程-井字棋 文章目录3D游戏编程-井字棋作业要求项目配置项目演示视频演示文字说明项目截图实现过程和方法(算法)ECS框架项目构思算法项目代码项目笔记参考资料 作业要求 利用unity制作井字棋小游戏。 项目配置 Windows 10 Unity 2020.3.17f1c1 项目演示 视频演示 点击此处可以前往 文字说明 在Asset>Scenes中create一个C# script,命名为Chess_1 编辑Chess_1,输入项目代码并且保存 将Chess_1拖拉到Main Came

学习记录 991

如何理解反步法设计控制器?

假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...

weixin_42736130的博客 2万+

SpyGlass Lint脚本实战:从环境配置到报告生成的完整流程解析

本文详细解析了使用SpyGlass Lint脚本进行数字芯片设计代码质量检查的完整自动化流程。从环境配置、目录结构设计,到核心TCL脚本的编写与模块化配置,再到脚本执行、调试技巧及报告解读,提供了构建健壮、可维护自动化检查框架的实战指南。文章重点阐述了如何通过脚本实现从环境配置到报告生成的一键式操作,并探讨了与企业级CI/CD流程集成的进阶方案。

weixin_29196613的博客 439

Unity3d井字棋实现

整体框架: 首先我们要明确我们要做什么,需要什么函数实现。我只是设计了简单的双人游戏模式,在这个模式中,我们需要下列几个函数: 重置函数Reset(); 棋盘界面,我们用OnGUI();函数创建棋盘,该函数用于渲染和处理GUI事件,这意味着每次落子都会调用此函数渲染棋盘。 判断函数Check();用于判断输赢。 一开始我们用一个3*3二维数组创建棋盘,并将数组的初始值设定为0,如果O方在...

hellowangld的博客 1080

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

php 井字棋,Unity3D 井字棋

Unity3D 井字棋今天第一次Unity实战,先用GUI写个井字棋的小游戏。先上成品图:首先创建c#脚本,添加GUI方法。此时考虑到要记录九宫格每个位置的状态以及此时是谁在点击,所以创建两个私有变量。private int count = 0;private int[,] map = new int[3, 3];OnGUI函数在每帧被调用,每次调用OnGUI函数时,先调用Check()函数判断是...

weixin_30293523的博客 187

ArduSub程序学习(1)——ardupilot框架整理

AP_HAL层(硬件抽象层)是我们制作 ArduPilot 的方式可移植到许多不同的平台。有一个顶级AP_HAL libraries/AP_HAL,用于定义代码其余部分的接口 有针对具体的板子特性,然后就有了AP_HAL_XXX 子目录,例如,AP_HAL_AVR 用于基于 AVR 的 开发板,AP_HAL_PX4用于 Pixhawk 开发板和 AP_HAL_Linux 基于 Linux 开发板。工具目录tools directories工具目录是杂项支持目录。

weixin_49839886的博客 2816

使用Termux在Android设备上编译运行SpecCPU2006

SPEC2006搭配Termux,竟然还能这么玩?!

菜菜的菜园子 2960

unity3D IMGUI井字棋

目标 使用IMGUI构建UI,做一个井字棋游戏。IMGUI文档 目的: 1. 提升 debug 能力 2. 提升阅读 API 文档能力 结果 核心设计 GUI.Button(new Rect(x, y, width, height), “Something you want to show in Button”); 该函数用于创建一个bu...

qq_36184359的博客 521

复制幻灯片到另一个PPT编程

请确保将源PPT文件和目标PPT文件的文件名修改为你实际使用的文件名。运行上述代码后,目标PPT将包含源PPT中的所有幻灯片和形状。这里假设源PPT文件名为"source.pptx",目标PPT文件名为"target.pptx"。方法将每个幻灯片的布局添加到目标PPT中。是一个强大的库,可以用于创建、修改和操作PPT文件。要将一个PPT中的幻灯片复制到另一个PPT,可以使用Python的。这段代码遍历源PPT的每个幻灯片,并使用。步骤 3: 打开源PPT和目标PPT。这将保存修改后的目标PPT文件。

ByteSparkX的博客 1322

UNITY3D学习(1)之GUI井字棋

Unity3D是由Unity Technologies开发的一个强大的游戏引擎。Unity3D具有入门快,操作方便,开发迅速等特点大受欢迎。Unity3D具有AI,渲染,物理运算,声音,动画系统,资源管理,跨平台,系统架构等模块并且同时支持开发3D和2D游戏,使得开发游戏门槛大大降低。        这里安利一下官网便于大家下载Unity3D和资料学习------Unity3D官网

zzj051319的博客 3251

C# 零基础入门知识点汇总

本文属于C#零基础入门之百识百例系列目录文章。此系列文章已经完结,欢迎大家点击文中文章链接查看详情进行学习。

陈言必行 -- Unity游戏开发领域优质博主 5348

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1640

中山大学软件工程-Unity井字棋作业

# Unity3D井字棋小游戏 ## 一、 一些小问题 由于这是第一次作业,业务不太熟悉,在完成的过程中遇到了一些问题,在此记录下来。 * OnGUI()函数是每隔一段时间自动执行的,因此尽量在避免在该函数中出现次数过多的循环甚至死循环,这样可能会导致游戏无法运行,甚至整个Unity程序无法响应,最后只能任务管理器强行关闭... * Game视角和整个游戏build and run之后的视角大小是不一样的,比如ctrl+B之后运行的游戏视角是正常的,但在点击运行按钮在程序中看到的视角是不全的。 .

hj1353188493的博客 788

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Unity3D 背包系统的实现

如在“魔鬼与牧师游戏开发”项目和“魔鬼与牧师游戏(动作分离版)开发”项目中,我都熟练地使用UML清晰表达对象设计结果,说明动作的分离和集成的原理,我的项目示例和代码片段也展现出了我在实际应用中的游戏程序设计能力。

weixin_63734223的博客 2530

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unity3D 井字棋

Unity3D 井字棋 今天第一次Unity实战,先用GUI写个井字棋的小游戏。先上成品图: Github源代码及演示视频 首先创建c#脚本,添加GUI方法。此时考虑到要记录九宫格每个位置的状态以及此时是谁在点击,所以创建两个私有变量。 private int count = 0; private int[,] map...

weixin_34148340的博客 234

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Unity3D学习——井字棋游戏

Unity3D学习——井字棋游戏成品展示实现 OnGUI OnGUI()函数可以在每帧调用,就像Update( )函数一样。Button 使用GUI.Button()方法添加按钮,当该方法返回true时,表示按钮被按下了,这样我们就可以在按钮点击后作出相应记录和显示操作。思路 每一帧都用button渲染出3x3的棋盘,用一个3x3数组记录落子状态。在OnGUI函数中先检测游戏状态,若未分胜负,则根据

我和facker五五开 1171

Unity 3D游戏开发学习笔记(1) 井字棋

第一次用Unity 3D写游戏,做了个井字棋。 由于不熟悉onGUI()和C#,参考了师兄的笔记。代码实际上很简单,逻辑也简单,主要是通过这个小游戏来熟悉一下Unity 3D的一些基本操作实现,比如OnGUI()的原理,实际上这里面的Button并不是点击触发的效果,而是每一帧都在发生改变,因此这里Button实际上是不断重叠制造的吧。(显然变深色了),我感觉这样的做法不太好,但暂时不知道怎么

没有标题 705
上一篇: Unity3D课程 第一次作业
下一篇: C#学习笔记——List
七月简语
博客等级 码龄10年 14粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值