二维象棋和三维象棋有什么区别?

此系列博客用以介绍Unity2D游戏开发的基础。

游戏素材建立于传统象棋。但是操作不同于传统象棋,玩家可以同时控制多个棋子移动,每个棋子移动到指定位置需要一定的时间,移动到目的地后需要冷却一定时间。因此游戏不再是回合制行动,棋子的行为模式需要即时判断。由于游戏是两人对战的即时战略模式,还需要实现网络对战功能。

游戏开发逻辑不唯一,目前逻辑仅作参考,欢迎交流更好的逻辑。

加粗字体将介绍Unity主要的特性,如果不关注游戏逻辑可以直接看加粗字体。

  • 棋子符合规则下的动态位移

接下来将以此介绍需要做的工作。

  • 将package拖入Project窗口后即可导入新项目,打开Scenes下的playing窗口即是主要工作场景。

    2019作为脚本开发的IDE工具,还可以选择需要的发行模块如Windows和Android支持,开发文档,以及语言包。安装完成后选择版本可以修改模块、在资源管理器中打开,或者卸载。其中开发文档位于Data\Documentation目录下。在Hub的项目栏目下,新建游戏项目,可以选择Unity的版本,选择游戏类型,这里为2D游戏类型,填写项目名称并选择项目工作的目录位置后,创建项目。

    进入Unity工作窗口,主要涉及六个工作窗口和一个操作工具栏。

    • Project项目窗口,相当于打开项目根目录下的资源管理器,管理所有资源文件。

    • Scene场景窗口,在项目的Scenes目录下新建场景,双击打开场景窗口将进入这个场景工作。场景是搭建游戏舞台的主要工作对象。场景运行中也可以查看有信心对象的具体效果。

    • Layer层级窗口,层级将以打开的Scene场景为跟,展现其中的所有的游戏对象Game Object,通过操控游戏对象来改变游戏状态。

    • Inspector检查器窗口,选择游戏对象后,检查器将展现游戏对象挂载的脚本。其中脚本就是通过代码控制行为的关键。

    • Game游戏窗口,反馈场景中主摄像机视角的画面,也是游戏运行后的画面。点击工具栏中的运行,当前场景开始运反馈真实效果。

    • Console控制台窗口,游戏相关脚本的运行输出与报错将在这里展现,通过Debug的Log()函数可以输出信息到控制台。

    • 操作工具栏包括手形工具、移动工具、旋转工具、缩进工具和矩工具等工具,分别对应快捷键Q、W、E、R和T等。操作工具可以改变游戏对象的基础属性,如位置和空间状态。

    在场景中新建空的游戏对象,空游戏对象默认拥有一个Transform的组件,该组件负责处理游戏对象在场景中的世界位置和父子级相对位置,以及移动、旋转和缩放处理。在Layer窗口下,可以将一个对象挂载到另一个对象的子集中。此处将棋子集合对象chessGroup挂载到棋盘对象board下,以保证场景中层级关系一定的逻辑性。

    新建场景会自带一个主摄影机,用以反馈游戏的画面,目前无需处理。

    精灵是2D游戏处理对象的载体。为了将精灵渲染到对象位置上,需要给添加组件Sprite Render精灵渲染器,并将项目内的图片素材拖到该组件的精灵一栏上,这样对象就关联上了所需的图像。

    通过重复添加对象和精灵渲染器,可以实现棋盘和棋子所需要的图像。

    通过重复以上操作,可以得到棋盘图像和所有棋子图像。现在把棋子按红色和黑色分为两组挂在两个空对象下形成两个玩家组,玩家组挂在一个棋子组下,棋子组和棋盘挂在一个游戏对象下。

    图中的玩家组对象名称带有Clone,是因为由预制件生成的,预制件将在之后介绍。

    现在进入脚本编辑来控制行为。

    默认创建的脚本已经继承MonoBehaviour,并带有两个函数Start()和Update(),它们是MonoBehaviour生命周期中的一环,现在介绍MonoBehaviour生命周期中的主要函数,它们是游戏机能的关键

    • Awake() 对象的脚本实例化后立即执行,一般用以初始化变量。

    • Start() 开始运行的第一帧执行,如果变量初始化引用的其他变量可能因为顺序或异步还未执行,可以在次初始化。还经常再次执行StartCoroutine()与yield return实现协程,来实现理想执行顺序。

    • Update() 是游戏执行中行为控制的关键,游戏运行每一帧将执行一次。

    • LateUpdate() 因为Update在所有游戏对象表现为异步的,为了实现相对顺序功能,这个函数将在一帧中所有Update()执行后再执行。

    • 因Update()受到渲染能力的影响,不同机器执行的频率不同,加载渲染不同物体时的时间不同,调用间隔也有所不同,处理物理碰撞的效果也可能不同。FixedUpdate()为固定频率执行,不受渲染能力干扰,一般处理Foce力,Collider碰撞器,Rigidbody刚体等物理引擎相关的任务,使得效果平滑。Project Setting中可以修改此频率。

    • 脚本激活时执行,可以通过检查器中组件名称前的勾选项修改默认是是否激活。在MonoBehaviour中给enable赋值来启用该组件或者关闭,关闭后将不再执行组件内部的方法,除非再次激活。首次激活时,在Awake()和Start()中执行一次。

    • OnGUI() Unity代码驱动的GUI系统,不建议实现在发行版中。

    以上方法为Unity自动执行,不需手动调用。

    以此选择棋子对象后,在检查其新建脚本,或者在项目中新建脚本,挂载到所有棋子对象上。对棋子控制的脚本,命名为Chess.cs。

    为了使得棋子能在等距离间隔下的坐标间移动,将棋盘和棋子按比例分割。实现坐标类并将基础属性是现在结构体的静态属性中。结构体相较于类更适合存储一些纯数据相关的信息,逻辑相关性较弱。

    棋盘属性可以在实现其他功能中不断实现,这里仅作介绍。

    现在为了转换世界位置和棋子坐标,实现两个函数。

    具体代码部位重点,参考源码。这里设置对象位置用到了go.transform.localPosition赋值一个Vector2,localPosition是修改对象相对于父对象的相对位置,position而是修改位于的世界总位置。

    现在可以通过部署位置的方法把棋子初始化在坐标位置上了。

    现在来实现棋子与简单的鼠标交互。为最基本的board对象添加一个System Contrl.cs,用以处理全局交互与UI相关事件。

    在Chess.cs中,重写MonoBehaviour的方法OnMouseDown(),并且为棋子添加2D盒子碰撞,即可以实现点击棋子触发相关事件。可以在方法中执行Debug.Log(),运行场景查看效果。也存在其他形状的碰撞器,这里2D盒子符合坐标化。

    希望鼠标左键点击选中,右键移动,鼠标移动中实现坐标光标指示器。OnMouseDown()后可以修改System Control.cs中专用的选中静态变量Chess类的对象引用,传入点击对象的组件this即可。右键移动位置可能没有棋子,因此需要判断鼠标点击的位置,再将其转化为坐标。鼠标指示器可在Update()不断检测鼠标位置发聩给变量。

    虽然是2D游戏,但是在Unity场景编辑中仍然存在三维坐标,用以判断物体的前后有优先显示,当Z轴相同时,将按照层级顺序展现物体。判断鼠标点击位置同样需要碰撞,与棋子仅检测碰撞与否不同,鼠标需要点击位置,为棋盘添加一个3D标准的盒子碰撞器,因为鼠标需要用到射线判断,使用2D碰撞器可能造成检测不到碰撞的问题。在System

    Ray与RaycastHit和Physics.Raycast()实现。鼠标位置将赋值给mouseRightHit,mouseRightHit.point.x与mouseRightHit.point.y可到到点击的世界位置。在项目中射线是由摄像机中,鼠标的位置沿着世界Z轴负向射出的。1000为射线长度也是碰撞探测长度。这里给出了LayerMask.GetMask("MapCube")层级遮罩,目的是让射线探测拥有指定的层级遮罩的碰撞器对象,避免获得其他碰撞器,可以在检查器中设置。

    在Update()中探测鼠标位置后可转化为棋盘坐标。

    输入向量乘以速度参数可到具体移动速度,将传给函数transform.Translate()可以实现对象的移动

    设计移动时,需要乘以参数Time.deltaTime,这是两次Update()执行的间隔时间,这样会使得的物体移动的效果更佳平缓。使用Ease()得到速度的缓动参数与Vector3.Lerp()缓动函数可处理速度向量变得更加平滑,手感更佳。

    Translate()移动为已知固定速度的移动,因为路程不确定所以所需消耗的时间不确定,根据速度计算时间。现在的游戏逻辑是固定时间移动到指定位置,所以已知时间,要根据路程计算速度

    在Update()中改变坐标即可

    现在希望移动时,精灵显示在最上层,可以在移动前修改Z轴数值,移动后再该回去。注意,用以计算起止点的世界位置也要修改Z轴,否则会在移动中同时进行Z轴的移动。

    由此可以左键选择棋子,将其对象存入System Control.cs的引用中,右键再触发引用对象的移动函数,使得棋子移动。

    接下来需要实现棋子的棋子判定。

  • 进货单中暂未添加任何货品

阿里巴巴中国站和淘宝网会员帐号体系、《阿里巴巴服务条款》升级,完成登录后两边同时登录成功。

我要回帖

更多关于 二维三维四维的概念 的文章

 

随机推荐