精华内容
参与话题
问答
  • VR开发教程之Unity3d开发入门教程

    千次阅读 2016-12-16 16:23:43
    最近对Unity3d进行学习的过程中,发现unity不仅入门教程做的丰富,而且Script API文档也是看过的所有API文档中最清晰易用的。不得不说,这极大降低了入门unity3d的门槛。 Unity3d入门学习资料   Unity3d的学习...

    最近对Unity3d进行学习的过程中,发现unity不仅入门教程做的丰富,而且Script API文档也是看过的所有API文档中最清晰易用的。不得不说,这极大降低了入门unity3d的门槛。

    Unity3d入门学习资料  

        Unity3d的学习首先从官方tutorials入手,如图1所示。



         Tutorial中最经典的demo便是Roll-A-Ball,直接看英文的视频讲解各种术语听起来有点头晕,有些东西也讲得太啰嗦。不过没关系,下面的这个unity圣典的中文教程绝对能满足你对unity开发入门的基本需求,作者逻辑清晰,讲解细致,不得不说入门视频首选:Unity5.2入门课程 - 进入Unity开发的奇幻世界

        每个tutorial中配套有相关的开发视频,并且能找到相关demo源码。在对unity3d的界面视窗和基本操作,以及对SceneGameObjectcomponent有基本了解之后,从demo源码入手学习是最快的,很容易加深对unity3d工程的理解,以及对Script API document的熟悉。


    Unity3d和Android的类比学习

        由于许多人有Android开发经验,Android与unity3d两者在设计上有诸多相似之处,下面以Android的角度来与unity3d进行类比学习,以加深对相关概念的理解。

    一、坐标系:




        Unity3d的三维坐标系,再加上不同的参考基准,相比Android的二维坐标系要复杂很多:

        1.在处理GameObjecttransform相关属性,如positionrotationscale时,假如直接用 鼠标放缩移动工具,三维坐标系拖动起来太难控制了。最方便精准的控制方式为两种:第一种是直接设定属性值;第二种便是shift+点击单个坐标轴,将三维坐标转到两位坐标进行控制。

        2.另外针对不同参考基准,unity坐标系划分为几种:

        1)世界坐标系:以描述所有场景内所有物体作为基准

        2) 局部坐标系:GameObject之间在位置上可构成父子关系,以父GameObject为基准

        3) 相机坐标系:相机是最终Game视角的真正观察者,以相机为基准,观察整个场景中    GameObject的立体位置前后和遮挡关系。

       4) 屏幕坐标系:很简单,就是把屏幕当作二维坐标,描述像素在屏幕中的位置。

        其中Transform提供了各坐标系相互转换的接口。

        3.向量和矩阵运算

        二维空间中,单纯对xy坐标进行操作,书写容易。但三维空间,向量和矩阵的运算形式的简洁性和高效性便体现出来。向量主要用于坐标轴的控制,矩阵对阵列数据的放缩、旋转和平移,以前学的《矩阵分析》理论便派上用场啦。 

    二、界面布局和控件的ID引用

     

    下面从unity3dGameObject引用和GameObject中的组件引用分别进行叙述。

    1.unity3dGameObject引用

        在界面布局元素中,Android叫控件,unity3dGameObject(游戏对象)。Android的的布局文件中定义了所需要的控件,在Java代码中通过查找id(findViewById)进行引用和控制。

        Unity3d的布局定义在scene文件中,并且在Hierarchy窗口中展现了所有GameObject列表。GameObject通过在inspector窗口中添加脚本组件来实现具体的逻辑控制。假如脚本中要对另外一个GameObject进行控制,比如roll-a-ball游戏中,球撞完所有立方体之后,需要触发一个文本UI的显示,显示为“You win!”,就需要球所在的游戏对象Player的脚本类中定义一个public变量: 

     public GUIText winText;

        随后在playerinspector面板中指定wintext对应的 GUI text对象,如图2所示。便可在脚本代码中实现修改GUIText对象的显示逻辑:winText.text = “You win!”     


        随后在playerinspector面板中指定wintext对应的 GUI text对象,如图2所示。便可在脚本代码中实现修改GUIText对象的显示逻辑:winText.text = “You win!”     

    2

       另一种引用的方法是设置为GameObject设置tag,通过GameObject.FindWithTag("tag")获取到需要引用的GameObject。下一段内容中会对此方法进行介绍。

    2.引用其他GameObjectComponent(组件)

        假如一个脚本组件想调用另一个GameObject的脚本组件中的public方法,怎么办呢?这种应用场景出现在roll-a-ball游戏中的球体撞击到立方体时,立方体需要调用球体绑定的脚本中的addScore函数,对分数显示GUI Text进行修改,实时更新分数。

        绑定到GameObject的脚本组件,本身是一个类文件,随着Scene的周期开始和结束,创建和销毁自己的实例。在整个内存空间中,应该是属于单例的,但实际上并不写成单例模式,那怎么获取其中的实例对象呢?

        其实原理很简单,直接通过GameObject来获取其绑定的脚本即可,下面便是具体方法:

        1) GameObject设置tag,一个tag便能分类一个或一类的GameObject,名字可以自定义,如图3所示。

    3

           2) 随后在脚本中通过tag获取到具体的GameObject

         GameObject gameControllerObject = GameObject.FindWithTag("pickup");
         if (gameControllerObject != null)
         {
             gameController = gameControllerObject.GetComponent <GameController>();
         } else {
             Debug.LogError("Cannot find 'GameController' script", transform);
         }

        3) 从步骤中获取的GameObject实例,获取其脚本组件,并对其Public方法进行调用:

       PlayController gameController;
       gameController = gameControllerObject.GetComponent <PlayController >();
       gameController.AddScore(scoreValue);
    

      三、生命周期

        AndroidServiceActivity都有自己的生命周期,也直接决定了不同函数的调用顺序。unity也是如此,unity脚本有自己固定的生命周期函数,常见函数如下:

       执行顺序为:awake>start>update

       更多函数的执行顺序如图4所示,欲知更多可参考这篇文章:Unity3D中自带事件函数的执行顺序

                                                     图4

    四、界面跳转

        Android一个完整的界面称之为Activity,通过startActivity来启动一个新的Activity实现跳转。但在Unity中称之为Scene(场景或关卡),假如只有一个scene,直接切换相机视角便可实现画面变化。但是如何实现不同scene的切换和跳转呢?

        在Scenes文件夹中创建不同的scene文件,File->Build Settings,可以看到图5界面。若创建的scene无法展现出来,首先确保scene文件是有内容的,然后点击“Add Open Scenes”,就可以实时加载进来。

                                                图5

        每一个scene文件都会对应一个level,要跳转到某个scene有两种方法:scene文件名和index level。下面是实现不同scene文件循环跳转的方法:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.SceneManagement;
    public class SwitchScence : MonoBehaviour {
        public int scence_level;
        private int delay_cnt = 0;
           // Use this for initialization
           void Start () {
           }    
           // Update is called once per frame
           void Update () {
            delay_cnt ++;
            if (delay_cnt == 100) {
                SceneManager.LoadScene(scence_level);
                delay_cnt = 0;
            }       
        }
    }
    

         在Unity5.3中只要调用:SceneManager.LoadScene(scence_level),便可跳转到指定levelscene









    展开全文
  • Unity 3D 入门 介绍



    一. 工作区域详解


    1. Scence视图 (场景设计面板)


    scence视图简介 : 展示创建的游戏对象, 可以对所有的游戏对象进行 移动, 操作 和 放置;

    -- 示例 : 创建一个球体, 控制摄像机, 让球体在摄像机拍摄的视图中显示出来;




    (1) 摄像机导航


    摄像机旋转(Tumble) : alt + 鼠标左键, 摄像机会按照鼠标滚动的垂直中线进行旋转, 可以查看摄像机当前的状态, 注意只是改变视图中的状态, 摄像机还是在视图正中央位置, 摄像机的位置属性是不变的;

    摄像机移动(Track) : alt + 鼠标中键, 移动摄像机到视图中的其它位置, 注意只是改变视图中的位置, 摄像机的实际坐标是不会改变的;

    缩放视野(Zoom) : alt + 鼠标右键/滚轮, 缩小放大摄像机视野;

    穿越模式(Flythrough) : 鼠标右键 + A/S/D/W, 第一人称模式在场景中移动, 鼠标控制前进方向, WASD控制 左 前 后 右 方向;

    居中(Center) : F 键, 在 Hierarchy 面板中选中对象, 按 F 键, 即可将选中的对象居中;


    (2) 摄像机视角


    Persp工具 : 在场景视图的右上角有一个 Persp 工具, 可以对该工具操作 切换摄像机视角;



    顶视图 : 单击 y , 就会进入顶视图模式;



    侧视图 : 单击 z 进入侧视图;



    正视图 : 单击 x 进入正视图;



    透视视图 : y 轴在上, 使用 alt + 鼠标左键, 调整到透视视图;




    (3) 高级视图操作


    在设计面板中有一个工具栏



    绘制模式 : 控制对象的绘制, 默认 Textured 模式, 使用指定的颜色 或 贴图绘制对象;

    -- Wireframe 模式 : 显示对象的物理网格;

    -- Tex Wire 模式 : 把对象的贴图 和 它们的线框叠加在一起;



    渲染模式 : 对对象进行微调, 优化; 

    -- 默认 RGB 模式 : 带颜色的方式显示所有对象;

    -- Alpha 模式 : 使用对象的 Alpha 值(灰度显示) 显示对象;

    -- OverDraw 模式 : 显示场景中有多少时间消耗在重复绘制上;

    -- Mipmaps 模式 : 显示对象使用的最理想的贴图大小;



    场景光照 : 切换光照方式, 方式一 使用默认的内置光照, 方式二 使用开发者设置的光照;


    (4) 对象变换 (Object Transform)


    对象变换 : 处理选中对象的位置, 旋转 和 大小, 主要有以下两种修改方式;

    -- 属性查看器修改 : 在 Inspector 视图中输入新的属性值, 可以进行变换;

    -- 变换工具修改 : 通过变换工具;


    通过属性查看器修改 : 选中 Camera, 可以在 Inspector 视图中查看 Camera 属性, 其中的 Transform 属性就是摄像机的 位置, 旋转 和 缩放属性;




    改变位置

    -- 通过拖动属性坐标轴修改(位置改变) : 选中 Camera 对象之后, 在Scence 视图中Camera 会出现三个坐标轴, 可以使用鼠标拖动 Camera 沿着某一条坐标轴移动;



    -- 自由拖动对象(位置改变) : 点击 对象 的 中心位置, 可以自由拖动, 但是不精确;


    旋转 : 选中 对象, 按 E 键, 或者点击工具栏的旋转图标, 使用鼠标拖动即可进行旋转操作;



    缩放 : 选中物体, 按 R 键, 或者 点击工具栏的 缩放工具, 使用鼠标拖动坐标轴 即可 在这个坐标轴方向进行缩放;




    2. Game视图 (游戏预览面板)


    Game视图 : 显示摄像机拍摄的内容, 是摄像机朝向的内容;



    播放控件


    -- 运行游戏 : 激活预览面板, 开始游戏;

    -- 暂停游戏 : 使运行中的游戏暂停, 再次点击该按钮 从 暂停处继续运行;

    -- 单帧运行 : 游戏 一帧 一帧 的移动, 主要用于调试bug, 错误等;


    游戏预览面板控制栏


    -- Aspect (任意显示比例下拉列表) : 改变 Scence 视图的显示比例, 默认为任意比例显示, 在为不通大小的界面制作游戏时使用;


    -- Maximize on Play(最大化) : 将Scence 视图扩大到整个视图中;

    -- Gizmos 工具 : 切换游戏中 绘制 和 渲染 的所有工具;




    3. Hierarchy 视图 (游戏组成对象列表)


    Hierarchy视图 : 存放游戏对象 和 文件;



    创建对象 : 点击 create 按钮可以创建 游戏场景内的 物体对象;

    删除对象 : 选中对象之后 按 Delete 键, 即可删除对象;


    对象的父子关系 : 父子关系就是将无关对象建立分组, 位于一个单一的对象之下, 父对象包括的对象叫做 孩子对象;


    -- 作用 : 对父对象进行移动 缩放 旋转操作, 其下的孩子对象也进行同样的操作;


    添加光照 : 球体创建好后, 在Game视图中却只能看到 一个圆, 这是因为我们没有创建 光照;

    -- 创建定向光 : 选择 create 创建对象, 创建 Directional Light 之后, 之后可以看到 Game 中的 3D 效果;


    -- Game效果





    4. Project视图 (项目资源列表)


    Project视图 : 存放一些游戏资源 (脚本, 对象, 场景, 文件等),;

    -- Assets目录 : 开发者创建 和 导入的资源 都放在该目录下, 包括 贴图, 脚本 Camera 等;


    给游戏中的对象涂装 : 给游戏对象改变颜色, 可以在Project视图中创建一个材质, 然后将材质赋给对象;
    -- 创建材质 : 点击 Project 视图的 create 按钮, 选择材质;


    -- 给材质选择颜色 : 在 Assets 中选中刚创建的材质;


    -- 选择颜色 : 这时 Inspector 视图中会出现材质的属性, 点击 Main Color 按钮, 可以选择材质的颜色;

          

    -- 为将材质赋给对象 : 直接将 Assets 中的材质 拖拽到 Hierarchy 视图中的对象上即可, 效果如下 : 





    5. Inspector 视图 (属性查看器)


    在这个视图中可以修改Game视图的颜色, 以及Scence 视图的属性;


    设置Game视图的颜色 : 选中摄像机, 然后在 Inspector 视图中会出现下面的内容, 点击Background 会出现 右图;

         

    改变后的效果 : 




    Transform属性 : 选中球体, 在 Inspector 视图中会看到以下信息;

    -- Position : 选中物体的位置坐标;

    -- Rotation : 选中物体的角度;

    -- Scale : 选中物体的缩放大小;




    二. 入门示例一 - 第 一/三 人称控制游戏


    1. 制作地形


    (1) 引入地形 


    Project 视图中, 右键点击 Assets, 选择 Import Package --> Terrain Assets (地形), 下面是 引入的地形资源;



    (2) 移动摄像机到正常位置




    (3) 编辑地形


    在 Hierarchy 视图中选中 Terrain 地形, 在 Inspector 中可以对地形进行操作;


    地形隆起操作 : 点击刷子, 在地形上进行操作;





    让地形变得圆滑 : 上图中 红框中的 山地比较尖锐, 使用 第三个工具可以使地形变得圆滑;


    -- 圆滑效果




    (4) 移动摄像机到合适的位置


    移动摄像机 : 点击 Hierarchy 视图中的 Main Camera 对象, 调整摄像机的位置, 使摄像机能够完整的拍摄地形;



    摄像机拍摄的地形效果




    (5) 为场景贴图


    导入场景贴图 : 在 Project 视图中, 右键点击 Assets, 选择 Import Package --> Terrain Assets, 下面是导入的地形纹理;



    为地形添加纹理 : 在Hierarchy 视图中选中 Terrain(地形) 对象, 在 Inspector 视图中会显示 地形的属性;

    -- 点击 Inspector 视图中的 Edit Textures, 选择 Add Texture, 在弹出的 Add Terrain Texture 对话框中选择对应的贴图;     


    纹理贴图效果




    (6) 添加天空盒


    在上图中没有天空, 不是很美观;


    配置天空盒 : 选择菜单栏 Edit --> Render Settings --> Inspector视图 --> skybox material;



    选择天空盒 : 在弹出的 Select Material 对话框中选择天空盒;



    最终效果




    2. 第一人称控制


    (1) 导入角色控制包


    右键点击 Project 视图中的 Assets, 选择 Import Package --> Character Controller, 全部导入;




    (2) 在 Scence 视图添加第一人称控制


    删除摄像机 : 摄像机需要删除, 因为第一人称视角就是摄像机, 如果有摄像机的话就不会出现第一人称视角了, 这里将摄像机在 Scence 视图中删除;


    设置第一人称控制 : 将第一人称控制拖拽到 Scence 视图中, 调整坐标, 注意 y 轴坐标必须大于0, 也就是必须在地平面以上, 否则会掉下去;





    游戏效果 : 进入 Game 视图, 可以进行游戏体验, 与 CS 差不多, 可以跳跃, 行走, 鼠标控制方向;





    3. 第三人称控制 


    将第三人称角色拖拽到 Hierarchy 视图中 : 在 Scence 视图中调整 角色位置;



    选择摄像机



    效果




    三. 入门示例二 - 篮球场景



    1. 创建篮球场


    (1) 创建长方体


    创建过程 : GameObject --> Create Other --> Cube, 创建长方体;



    查看自己创建的长方体 : 在 Hierarchy 视图中, 双击刚才创建的 Cube 长方体, 就可以在 Scence视图中定位到这个 Cube上; 



    (2) 调整 Cube 大小


    将Cube调整成篮球场比例的大小 : 根据下面截图进行调整;



    (3) 为篮球场添加纹理


    导入纹理图片 : 选择菜单栏 Assets --> Import New Assets, 在弹出的对话框中选择要导入的纹理资源图片;

     


    创建新的纹理 : 在 Project 视图中, 选择 create 创建一个新的纹理;



    为篮球场添加纹理

    -- 显示属性 : 在 Hierarchy 视图中选择 Cube; 

    -- 选择材料 : 在 Inspector 视图中的 Materials 中选择之前创建的纹理; 

    -- 选择纹理 : 然后在 下面的 纹理属性中选择 刚才的篮球场 纹理贴图图片;




    2. 创建篮球


    (1) 创建球体


    创建过程 : 菜单栏 GameObject --> Create Other --> Sphere (球体);



    调整大小位置姿态 : 按照下图中的数据进行调整;



    (2) 为篮球添加纹理


    添加纹理过程

    -- 创建一个新的材料 : 在 Project 视图中, 选择 create --> Materal;

    -- 显示属性 : 在 Hierarchy 视图中, 点击 Sphere 对象, 在 Inspector 视图中显示出 球体的属性;

    -- 选择材料 : 点击 Inspector 视图中的 Material 中的圆点, 选择刚创建的材料;


    -- 选择纹理 : 点击 材料中的 纹理图片上的 Select 按钮, 弹出对话框选择纹理;



    篮球对象已添加完毕




    3. 添加光源和摄像机


    (1) 创建光源


    创建过程 : 选择 菜单栏 GameObject --> Create Other --> Directional light (平行光);



    (2) 调整光源姿态和强度


    根据下图中的参数调整



    (3) 调整摄像机参数


    调整摄像机参数, 背景颜色, 视角大小



    4. 为篮球添加动作


    (1) 导入材料包


    导入材料包 : 菜单栏 Assets --> Import Package --> Physic Materials;



    (2) 为篮球添加刚体属性


    添加过程 : 在 Hierarchy 视图中选中篮球, 然后选择 菜单栏 Component --> Physic --> Rigidbody;



    (3) 为篮球添加球体碰撞者


    添加过程 : 在 Hierarchy 视图中选中球体, 选择菜单栏 Component --> Physic --> Sphere Collider;



    (4) 为篮球添加弹性属性


    添加过程 : 选择 球体属性的 Sphere Collider属性, 选择材料 Material --> Bouncy (弹性);



    5. 运行示例


    点击Game视图中的运行按钮


    .


    展开全文
  • 【Unity3D入门教程】Unity3D开发实战之五子棋

    万次阅读 多人点赞 2017-01-11 17:07:42
    经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后...

    前言

    经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后我们会把完整工程的源代码发布出来,以供初学者参考。先展示一下最后的运行效果吧。

    1 准备工作

    (1)开发环境:Win10 + Unity5.4.1

    (2)图片素材准备:

    黑棋子和白棋子

       

    棋盘


    获胜提示图片




    2 开发流程

    上文提到的素材可以直接下载我们给出的这些图,也可以自己制作。注意黑白棋子要做成PNG格式,以保证显示的时候棋子四个角是透明的。将用到的图片素材导入到工程当中。新建一个场景,创建一个Plane,作为MainCamera的子物体。将棋盘贴图拖动到Plane上,并且将Plane正面面向摄像机。


    再创建四个sphere,作为Plane的子物体,分别命名为LeftTop、RightTop、LeftBottom、RightBottom。然后把他们的MeshRenderer勾选掉。这些球是为了计算棋子落点所设置的,所以需要把它们与棋盘的四个角点对准。


    然后我们创建一个chess.cs脚本,绑定到MainCamera上。脚本中包含了所有的功能。需要绑定的一些物体如图所示。


    chess.cs脚本如下:

    using UnityEngine;
    using System.Collections;
    
    public class chess : MonoBehaviour {
    
    	//四个锚点位置,用于计算棋子落点
    	public GameObject LeftTop;
    	public GameObject RightTop;
    	public GameObject LeftBottom;
    	public GameObject RightBottom;
    	//主摄像机
    	public Camera cam;
    	//锚点在屏幕上的映射位置
    	Vector3 LTPos;
    	Vector3 RTPos;
    	Vector3 LBPos;
    	Vector3 RBPos;
    
    	Vector3 PointPos;//当前点选的位置
    	float gridWidth =1; //棋盘网格宽度
    	float gridHeight=1; //棋盘网格高度
    	float minGridDis;  //网格宽和高中较小的一个
    	Vector2[,] chessPos; //存储棋盘上所有可以落子的位置
    	int[,] chessState; //存储棋盘位置上的落子状态
    	enum turn {black, white } ;
    	turn chessTurn; //落子顺序
    	public Texture2D white; //白棋子
    	public Texture2D black; //黑棋子
    	public Texture2D blackWin; //白子获胜提示图
    	public Texture2D whiteWin; //黑子获胜提示图
    	int winner = 0; //获胜方,1为黑子,-1为白子
    	bool isPlaying = true; //是否处于对弈状态
    	void Start () {
    		chessPos = new Vector2[15, 15];
    		chessState =new int[15,15];
    		chessTurn = turn.black;
    
    	}
    
    	void Update () {
    
    		//计算锚点位置
    		LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);
    		RTPos = cam.WorldToScreenPoint(RightTop.transform.position);
    		LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);
    		RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);
    		//计算网格宽度
    		gridWidth = (RTPos.x - LTPos.x) / 14;
    		gridHeight = (LTPos.y - LBPos.y) / 14;
    		minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;
    		//计算落子点位置
    		for (int i = 0; i < 15; i++)
    		{
    			for (int j = 0; j < 15; j++)
    			{
    				chessPos[i, j] = new Vector2(LBPos.x + gridWidth * i, LBPos.y + gridHeight * j);
    			}
    		}
    		//检测鼠标输入并确定落子状态
    		if (isPlaying && Input.GetMouseButtonDown(0))
    		{
    			PointPos = Input.mousePosition;
    			for (int i = 0; i < 15; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{   
    					//找到最接近鼠标点击位置的落子点,如果空则落子
    					if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i,j]==0)
    					{
    						//根据下棋顺序确定落子颜色
    						chessState[i, j] = chessTurn == turn.black ? 1 : -1;
    						//落子成功,更换下棋顺序
    						chessTurn = chessTurn == turn.black ? turn.white : turn.black;                        
    					}
    				}
    			}
    			//调用判断函数,确定是否有获胜方
    			int re = result();
    			if (re == 1)
    			{
    				Debug.Log("黑棋胜");
    				winner = 1;
    				isPlaying = false;
    			}
    			else if(re==-1)
    			{
    				Debug.Log("白棋胜");
    				winner = -1;
    				isPlaying = false;
    			}            
    		}
    		//按下空格重新开始游戏
    		if (Input.GetKeyDown(KeyCode.Space))
    		{
    			for (int i = 0; i < 15; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					chessState[i, j] = 0;
    				}
    			}
    			isPlaying = true;
    			chessTurn = turn.black;
    			winner = 0;
    		}     
    	}
    	//计算平面距离函数
    	float Dis(Vector3 mPos, Vector2 gridPos)
    	{
    		return Mathf.Sqrt(Mathf.Pow(mPos.x - gridPos.x, 2)+ Mathf.Pow(mPos.y - gridPos.y, 2));
    	}
    
    	void OnGUI()
    	{ 
    		//绘制棋子
    		for(int i=0;i<15;i++)
    		{
    			for (int j = 0; j < 15; j++)
    			{
    				if (chessState[i, j] == 1)
    				{
    					GUI.DrawTexture(new Rect(chessPos[i,j].x-gridWidth/2, Screen.height-chessPos[i,j].y-gridHeight/2, gridWidth,gridHeight),black);
    				}
    				if (chessState[i, j] == -1)
    				{
    					GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), white);
    				}               
    			}
    		}
    		//根据获胜状态,弹出相应的胜利图片
    		if (winner ==  1)
    			GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), blackWin);
    		if (winner == -1)
    			GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), whiteWin);
    
    	}
    	//检测是够获胜的函数,不含黑棋禁手检测
    	int result()
    	{
    		int flag = 0;
    		//如果当前该白棋落子,标定黑棋刚刚下完一步,此时应该判断黑棋是否获胜
    		if(chessTurn == turn.white)
    		{
    			for (int i = 0; i < 11; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					if (j < 4)
    					{
    						//横向
    						if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//左斜线
    						//if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    					}
    					else if (j >= 4 && j < 11)
    					{
    						//横向
    						if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//左斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    					}
    					else
    					{
    						//横向
    						//if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						//if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    						//左斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    					}
    
    				}
    			}
    			for (int i = 11; i < 15; i++) 
    			{
    				for (int j = 0; j < 11; j++) 
    				{
    					//只需要判断横向  
    					if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)  
    					{  
    						flag = 1;  
    						return flag;  
    					}  
    				}
    			}
    		}
    		//如果当前该黑棋落子,标定白棋刚刚下完一步,此时应该判断白棋是否获胜
    		else if(chessTurn == turn.black)
    		{
    			for (int i = 0; i < 11; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					if (j < 4)
    					{
    						//横向
    						if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//左斜线
    						//if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    					}
    					else if (j >= 4 && j < 11)
    					{
    						//横向
    						if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] ==- 1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//左斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    					}
    					else
    					{
    						//横向
    						//if (chessState[i, j] == -1 && chessState[i, j + 1] ==- 1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] ==- 1 && chessState[i + 2, j] ==- 1 && chessState[i + 3, j] ==- 1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						//if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    						//左斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    					}
    				}
    			}
    			for (int i = 11; i < 15; i++) 
    			{
    				for (int j = 0; j < 11; j++) 
    				{
    					//只需要判断横向  
    					if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)  
    					{  
    						flag = -1;  
    						return flag;  
    					}  
    				}
    			}
    		}       
    		return flag;
    	}    
    }



    运行效果截图:



    小结

    本程序实现了五子棋的基本功能,纯属娱乐而作。暂时没有加入各种UI、网络模块等。本程序经过了简单的测试,没有什么问题,如果大家在使用的时候发现有什么Bug,请联系我改正,谢谢。

    *************************************************************************************

    下面是工程源码下载地址:

    https://github.com/zzlyw/FiveChess_Tutorial



    展开全文
  • Unity3D入门到精通

    2018-06-01 09:26:42
    unity3d入门到精通中文教程是国内第一本以面向对象和项目流程开发角度,全面系统介绍 Unity3D 的书籍。本书以具体项目结构开发的角度,结合 Unity3D 层级式的综合开发环境、视觉化编辑、详细的属性编辑器和动态的...
  • 使用Unity 3D开发Hololens入门教程

    千次阅读 2018-02-02 10:43:21
    Microsoft已经发布了官方的Hololens SDK,本文将深入介绍使用Emulator(模拟器)开发Hololens,教大家如何使用Visual Studio 和 Unity 3D打造你的第一个Hololens项目。 预先准备 在编写代码之前,请先确定...
    Microsoft已经发布了官方的Hololens SDK,本文将深入介绍使用Emulator(模拟器)开发Hololens,教大家如何使用Visual Studio 和 Unity 3D打造你的第一个Hololens项目。


    预先准备

    在编写代码之前,请先确定计算机满足最低配置要求并安装了SDK。计算机应该满足下列要求:
    • 64-bit Windows 10 专业版、企业版或者教育版(家庭版不支持Hyper-V)
    • 64位 CPU
    • 8 GB或更多的 RAM
    • 必须在BIOS中支持并启用以下功能:
    • 硬件辅助虚拟化
    • 二级地址转换(SLAT)
    • 基于硬件的数据执行保护(DEP)
    • GPU(模拟器可能与不支持的GPU一起工作,但是速度会显著减慢)
    • DirectX 11.0 或更新版本
    • WDDM 1.2驱动或更新版本

    注意!计算机需要开启硬件虚拟化来虚拟硬件。 按照如下指示(是的,需要更改BIOS设置)
                    更多关于系统要求的信息。
                    更多关于安装SDK的信息。


    第0步-安装SDK

    安装SDK所需的步骤如下:
    • 开启Virtualization
    • 开启Hyper-V
    • 安装 Visual Studio 2015 Update 2
    • 安装模拟器
    • 安装Unity Technical Preview
    (这里说明一下,此链接下必须安装两个软件,一个是Unity,另一个是UWP Runtime,第三个是可选项)


    第1步-新建Unity项目

    所有配置准备完毕,就可以开始动手制作了。首先启动Technical Preview (5.4.0b10)并创建一个新的项目。指定好项目存放位置和名称。确保选定了 3D模式。然后点击创建项目。

    Unity是一个神奇易用的游戏引擎,具有强大的3D编辑器。它的初衷是为了快速开发游戏,现已用于商业应用开发。

    Unity提供免费和收费版本。下面的截图使用的都是收费版本,但是开发Hololens应用并不需要付费版本,免费版本也一样可以完成。

    第2步-配置Main Camera
    新建项目后Unity会显示一个空的3D场景。这就是Unity Editor(Unity编辑器)。看到如下面板:
    • 游戏面板展示游戏渲染效果。
    • 场景面板展示布置在3D世界中的元素。可与该面板进行交互并重新排列元素的位置。
    • 层级面板以列表的形式展示了场景中的元素。
    • 检视面板展示选定元素的属性信息。

    在全息应用中,主相机是使用者的视角(使用者眼睛所在的位置)。所以需要将主相机的位置设为0。选定主相机并将位置属性的X, Y, 和 Z值设置为0。(创建相机GameObject > Camera)



    第3步-清除背景
    Hololens的看到的世界和真实物理世界是一样的。传感器使得3D元素可以在实际物理空间中产生投影。因此,应用需要使用透明的背景。
    要创建一个透明的背景,将Clear Flags(清除标识)属性设定为Solid Color(固定颜色):


    此外将背景属性设定为[0, 0, 0, 0] 或者 #00000000(16进制和RGBA的透明值)

    第4步-添加3D元素

    现在先在场景中添加一个3D对象。在Hierarchy(层级)面板下点选Create → 3D Object → Cube。这样就会在场景中添加一个立方体。试着改变立方体的Position(位置)、Rotation(旋转)和Scale(缩放)属性。位置Z值意味着对象位置的远近。将这个值设定为正值就可以让它出现在前面。例如,如果将Z值设定为“2”,立方体就会出现在位于使用者面前2米的位置。(截图中能看到立方体的原因是因为添加了方向光,添加方式为Create → Light → Directional Light。)


    第5步-发布


    你可以在场景中添加更多元素来创造自己的3D世界。场景布置完毕后,需要发布应用并使用模拟器测试。Unity支持多种发布目标平台。但Hololens只能与Windows Store(Windows商店)发布平台兼容。Windows Store是最新的Microsoft APIs(微软API)。在Windows Store发布的方式是点击File → Build Settings就会弹出如下的窗口。(如果Windows Store的选项的Build按钮是灰色的,无法按下并且提示No Windows Store Module loaded 意味着 UWP Runtime 的相应组件并没有被安装,请访问Unity Technical Preview页面下载相应的UWP Runtime文件。双击下载好的文件,并指定Unity所在目录,注意不是Unity Editor所在目录,安装完毕即可。)



    构建设置

    • 首先需要Add Open Scenes(添加打开的场景)。这会要求保存当前场景并将它打包到程序包中。
    • 然后选定Windows Store作为构建目标
    • 在SDK选项中选择Universal 10。
    • 在UWP Build Type中选择D3D。
    • 为了方便调试请勾选Unity C# Projects。

    Player Settings


    在指定了生成的目标平台之后,需要选择Windows Store中的一些功能。点击Player Settings(播放设置)。检视面板会出现一些选项。点击绿色的Windows Store图标找到Capabilities(功能,这个在Publishing Settings下)列表。必须勾选下列选项:
    • SpatialPerception(空间知觉)
    • Microphone(话筒)
    • InternetClient(网络客户端)

    SpatialPerception(空间知觉)意味着应用能够使用空间映射功能。话筒意味着应用可以使用语音(Cortana)作为输入。最后,InternetClient(网络客户端)意味着应用需要网络连接。当模拟器作为虚拟机运行时,即使应用本身不使用因特网,也需要检查并勾选这个选项。如果网络选项没被勾选,在发布应用之后会应用会报错。

    最后,点击生成。

    Unity会要求指定生成目录。在计算机中新建一个空的文件夹并选定。这样就会生成Visual Studio解决方案文件。


    第6步-启动Visual Studio
    Unity生成Visual Studio解决方案文件需要几分钟的时间。当执行完毕后,打开新建的文件夹并双击.sln文件启动Visual Studio。


    第7步-运行

    Visual Studio打包了二进制文件并创建了日后可供提交到Windows Store的项目包。要运行程序,需要从主命令栏中修改以下参数:
    • 选择Release(发布)作为目标
    • 选择x86作为架构
    • 选择Hololens Emulator(Hololens模拟器)作为设备。


    这就完成了,点击绿色的按钮或者选择Debug → Start without debugging(启动并不调试)。


    第8步 – 开始娱乐!

    完成了!Hololens模拟器稍后就会启动了(有可能需要15分钟才能启动,所以稍微耐心点)。模拟器启动后可以看到我们创建的立方体并且和它进行交互。试着用鼠标和箭头按键来旋转视角。点击回车或者空格键来选定某些东西。模拟器就像是使用者的视野。那个小的圆环就是使用者的注视点。


    如果点击Start(开始)键,模拟器将会显示出Hololens的开始屏幕。可以随意的在应用之间切换(方向键+回车)。下图选定Edge浏览器。这里甚至还有虚拟键盘!


    这是作者网站的全息图!很酷吧?

    展开全文
  • Unity快速入门系列课程(第1部)

    千人学习 2019-05-08 15:49:57
    项目: "太空射击" 讲解使用3D空间,开发2D手游的过程,其中讲解“单例模式”做数据传值技术、基本粒子系统的使用、音频处理方法、碰撞与触发检测脚本算法......     5:   模块...
  • 内容简介 本书是国内第一本以面向对象和项目流程开发角度,全面系统介绍 Unity3D 的书籍。 本书以具体项目结构开发的角度,结合 Unity3D 层级式的综合开发环境、视觉化编辑、详 细的属性编辑器和动态的游戏预览的...
  • Unity3D 入门 游戏开发 Unity3D portal game development   作者:韩梦飞沙 Author:han_meng_fei_sha   邮箱:313134555@qq.com E-mail: 313134555 @qq.com   视频学习链接:Video...
  • 实际上本文不看也罢,因为整个过程除了网速之外基本没啥坑。不过装完可能有一些配置,所以如果不知道的话可以参考本文。 @TOC 安装 我们共需要安装两款应用: ...安装 Visual Studio 2019 的 Unity 编辑...
  • 每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习! 免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时...
  • 好资料,希望大家需有所成。高清版本,没有套路,数学不学好,游戏玩不了
  • 一. 工作区域具体解释1. Scence视图 (场景设计面板)scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置;-- 演示样例 : 创建一个球体, 控制摄像机, 让球体在摄像机拍摄的视图...
  • ShaderLab 是Unity3d自己封装的一个调用CG/HLSL/GLSL的接口。这篇文章主要记录一下基本的用法.
  • 【03】Unity3D特效入门 视频教学内容 ::: 第1课:课程介绍与Unity3D环境搭建.mp4 第2课:游戏场景基本操作.mp4 第3课:游戏场景制作3D模型.mp4 第4课:3D模型美化之材质球.mp4 第5课:3D模型重用之预制体.mp4 ...
  • Unity3D游戏开发入门学习笔记

    千次阅读 2017-01-21 17:06:47
    学习内容概要: 软件面板功能、材质球、预制体、摄像机、灯光、鼠标键盘输入、组件、刚体、碰撞体、PC端游戏打包发布.... ...3.Unity3D开发优势,一次开发多平台发布。 4.基础前提:编程语言C#、英语、数学 5
  • 今天首先完善了昨天的小僵尸,然后开始做火箭鼠(老师所谓“第一个丑陋的完整小游戏”hhhhh,后天继续!) 任务一:接昨天小僵尸行走动作完善: ... 仍存在的问题:一:鼠标点击只是确定了移动方向而不是末位置,...
  • 2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。...Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...
  • Unity3D Shader 入门

    千次阅读 2018-06-03 00:38:42
    什么是ShaderShader(着色...OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。而Unity的Shader 是将传统的图形接口的Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而...
  • Unity3D简单入门

    2020-03-01 15:16:24
    博主学Unity是因为在学校报了个AR游戏的项目,然后在开发的过程中感觉蛮有趣的,也算是把Unity从零基础入门了吧,因此写篇博客来记录一下。
  • Unity 3D Android 入门

    2016-11-30 16:05:16
    unity开发android游戏(一)搭建Unity安卓开发环境 标签: unity开发androidunity安卓开发 2016-11-26 00:35 48347人阅读 评论(2) 收藏 举报  分类: Unity(37)  版权声明:本文为...

空空如也

1 2 3 4 5 ... 20
收藏数 611
精华内容 244
关键字:

unity3d 开发入门