APP下载

一个Unity3D开发教学项目的设计与实现

2023-06-15陈小红

计算机时代 2023年6期
关键词:项目式教学虚拟现实

摘  要: Unity3D引擎是虚拟现实的主要开发工具之一。结合高职院校“Unity3D开发入门”的课程特点和实际教学中的问题,遵循项目式教学原则,设计和开发了一个“丛林寻宝”的Unity3D游戏项目,让学生通过该项目的学习理解Unity3D引擎开发原理,循序渐进地掌握完整的Unity3D项目开发的流程,为相关课程教学活动的开展提供借鉴。

关键词: Unity3D; 虚拟现实; 项目式教学; 游戏项目

中图分类号:TP391.9;G712          文献标识码:A     文章编号:1006-8228(2023)06-153-04

Design and implementation of a Unity3D development teaching project

Chen Xiaohong

(Department of Printing and Packaging, Shanghai Publishing and Printing College, Shanghai 200093, China)

Abstract: Unity3D engine is one of the main development tools of virtual reality. Combined with the course characteristics and the problems in practical teaching of "Introduction to Unity3D Development" in higher vocational colleges, a Unity3D teaching project of "Jungle Treasure Hunting" is designed and developed following the principle of project-based teaching. Students can learn and understand the principle of Unity3D engine development and master the complete Unity3D project development process step by step through the study of this project. It provides a reference for the teaching activities of related courses.

Key words: Unity3D; virtual reality; project-based teaching; game project

0 引言

虚拟现实技术(Virtual Reality即VR),是20世纪发展起来的一项全新的实用技术,VR产业的迅猛发展,相关专业人才的缺口日益扩大[1]。至2022年全国开设“虚拟现实技术应用”专业的高等职业院校已有近200所。对于这个创新性强、多学科交叉的新专业,学校在师资建设、课程体系构建、课程资源建设等各方面均面临巨大的挑战[2]。

1 “Unity3D开发入门”课程教学分析

“Unity3D开发入门”是VR技术人才培养的一门专业核心课程,课程的总体目标是培养学生利用Unity3D引擎开发游戏等虚拟现实应用项目的能力。Unity3D引擎的功能强大,组件和参数设置不仅数量繁多也比较复杂,课程教学面临较大困难,相关课程教学资源和教材的开发也较滞后,缺乏可以借鉴的教学经验。以学生为主体的项目式教学,强调让学生通过理论指导实践、在实践中深化对理论知识的理解。项目式教学的重点是教学项目的设计,教学项目的选取与学生的岗位能力要求是否匹配,直接影响了教学效果[3]。本课程让学生通过完成一个“丛林寻宝”Unity3D项目的分析、设计和开发的过程,理解Unity3D引擎开发原理,掌握完整的项目开发流程,达到课程的教学目标。

2 “丛林寻宝”教学项目的设計

2.1 项目策划

“丛林寻宝”项目在实际教学中打破了学科知识体系次序,教学内容被分解为若干个任务点,涵盖了Unity3D引擎的基本操作、地形系统、光照系统、粒子系统、动画系统、导航系统、物理系统、脚本开发、UI界面系统等大部分内容模块。从主角简单漫游过渡到游戏的交互,从单一的功能实现过渡到项目的综合优化,让学生在实现游戏基本功能的基础上,学会对项目进行个性化的拓展[4],实现学生知识水平与实践能力的同步提升。

“丛林寻宝”项目设计的总体思路是:玩家控制游戏主角跑动,在规定的时间内主角捡拾宝石取得设定的积分值,游戏胜利;但途中会遭遇敌人的袭击,一旦主角血量耗尽,游戏失败。具体游戏规则如下。

⑴ 运行游戏进入开始界面,可以查看游戏的说明文字,点击“开始游戏”按钮,进入游戏场景,场景上方会显示当前的积分、主角的血量进度条、倒计时。

⑵ 玩家单击地面,主角会朝点击的位置前进,主摄像机也会跟随移动,使玩家始终保持适当的视野范围。主角在行进中寻找掩埋在场景各处的宝石,触碰到宝石会取得相应的积分,积分达到设定值,会出现“游戏胜利”的提示。

⑶ 主角在行进中如遭遇敌人,玩家右击敌人,可以从摄像机位置朝敌人发射弓箭,敌人中箭会死亡,并播放音效。

⑷ 主角在行进中如果接近敌人,会遭到敌人的袭击,主角血量会相应的减少,如果血量减到零,或者倒计时为零,会出现“游戏失败”的提示。

2.2 主要功能模块设计

系统功能模式用来控制整个项目的运行。根据游戏规则,本项目中的系统功能有:开始游戏、计时控制、积分显示、血量显示、游戏成功、游戏失败、重新开始、背景音乐、退出游戏。如图1所示。

该项目主要的游戏物体有主角、敌人、宝石以及主摄像机。游戏围绕着这几个主要物体来设计,其中主角和敌人的功能模块如图2所示。游戏主角的功能模块有移动控制、捡拾宝石、射击敌人、血量控制、积分控制。游戏中敌人的功能模块有移动逻辑、攻击逻辑、死亡控制、音效控制。宝石的功能模块仅有被捡拾后销毁,主摄像机的功能模块主要有跟随主角。

3 “丛林寻宝”教学项目的实现

3.1 场景设计与搭建

本项目中的游戏场景从创建地形开始,包括利用地形工具创建高山、湖泊、盆地、花、草、树、天空盒子、风、雾,利用粒子系统和动画系统制作燃烧的火焰等。学生可以根据自己的设想,来创建游戏场景和布置光源,但要保证包含所有项目所需的元素。游戏中的宝石需要导入在3Dmax软件中创建的模型,游戏中的宝石、敌人、弓箭使用的数量较多,都需要创建相应的预制体。可以通过把场景中的物体拖进project面板中来实现预制体的创建。

3.2 倒计时的实现

游戏开始时系统开启倒计时,游戏剩余的时间会显示在游戏界面右上角,并实时更新。当剩余时间为零时,游戏停止。主要代码如下:

void Time_Control() {

leftTime -= Time.deltaTime;

// leftTime为递减的游戏剩余时间

Timetext.GetComponent().text=leftTime.ToString();

//剩余时间显示

if (leftTime<=0) { Time.timeScale=0;

loseUI.SetActive(true); } } //游戏失败

3.3 射线检测:主角的移动与射击控制

⑴ 主角的移动。游戏规则中要求单击地面时能够引导主角的行进,并要对主角行动的区域做合理的限定。Unity自带的寻路即导航系统利用导航网格描述游戏世界的可行走表面,主角需要添加导航组件后才可以在导航网格中自动绕开障碍进行寻路。鼠标单击地面进行主角行动的引导使用的是射线检测,Unity的物理引擎为我们提供了相关射线类以及函数接口,我们需要自行调用这些API来实现一条射线[5]。射线与地面碰撞点作为导航网格代理组件的目标地,当前物体会自动寻路到这个位置。在行走过程中,想要实现人物自然的走动和转向,还需要创建Animator Controller动画控制器,通过speed速度的不同值设置主角idle、walk、run三个动画剪辑的切换,如图3所示。主要代码如下:

if (Input.GetMouseButtonDown(0)) {

Ray ray=Camera.main.ScreenPointToRay

(Input.mousePosition);

RaycastHit hit;

if(Physics.Raycast(ray, out hit))

{ agent.SetDestination(hit.point); } //设置agent的目标地

anim.SetFloat("speed", agent.velocity.magnitude);

//给speed参数赋值

⑵ 射击控制。本项目中射击敌人的弓箭是由摄像机位置发出来的,射击脚本赋予主摄像机或者空物体,这里也运用了射线检测。鼠标右击的点就是弓箭射击的目标,需要注意的是要使箭头保持指向鼠标点击的方向,射击的同时伴有音效。主要代码如下:

if (Input.GetMouseButtonDown(1)) {

Ray cameraRay=Camera.main.ScreenPointToRay

(Input.mousePosition);

GameObject Arrow=Instantiate(arrow, cameraRay

.origin, arrow.transform.rotation) as GameObject;

//弓箭產生

Arrow.GetComponent().velocity=

cameraRay.direction * speed; }

3.4 碰撞检测:捡拾宝石与互相攻击

⑴ 主角捡拾宝石与被攻击。主角捡拾宝石以及被敌人砍到的判断都需要用到碰撞检测。Unity中的两个物体要想发生碰撞,必须依赖于自身的碰撞器组件,其中附带碰撞检测脚本的物体必须有刚体组件。Unity中的碰撞检测主要有碰撞信息检测和触发信息检测两种接口函数[6],为了消除碰撞对主角的影响,在这里使用触发信息检测中的OnTriggerEnter函数,来检测物体的名称或标签。当碰撞到宝石(标签为diamond),积分变量score相应自增,当碰撞到敌人的武器(名称为weapon),血量相应减少。用bloodvalue变量来代表界面中血条(Slider控件)的value值。主角捡拾宝石与被攻击时的主要代码如下:

void OnTriggerEnter(Collider other)

{ if (other.gameObject.tag == "diamond")

{ score+=2; } //积分自增

if (other.gameObject.name == "weapon")

{ GameManager.bloodvalue -=5; } }  //血量自减

⑵ 敌人被弓箭射击。敌人被弓箭射击与主角被敌人的武器攻击类似,不同的是敌人被弓箭射中之后有倒地死亡的动画播放,所以这里使用的是OnCollisionEnter碰撞信息检测函数。主要代码如下:

void OnCollisionEnter(Collision collisionInfo)

{ if (collisionInfo.gameObject.tag == "arrow")

{ isdead = true; } } //切换到死亡动画剪辑

3.5 敌人攻击的逻辑

本项目初始设计中的敌人是随机分布在场景各处,敌人有徘徊、跑动、攻击、死亡四个动画剪辑可以进行切换,只有当主角比较接近的时候,敌人才会朝主角的方向跑动,当距离小于二米时就会近身砍杀,被弓箭射中会死亡。敌人进行攻击的主要代码如下:

if (distance<2f) { this.transform.LookAt(player.transform);

animator.SetBool("isrun", false); //停止跑动

animator.SetBool("ishit", true); }} //启动攻击动画

3.6 摄像机跟随

用Unity脚本来控制摄像机跟随游戏元素。调整摄像机位置在主角上方合适的位置,让摄像机与主角一直保持相同的距离,这样就做到了摄像机一直跟随主角移动,主要代码如下:

void Start ()

{ offset = transform.position - player.position; }

void Update ()

{ transform.position = offset + player.position; }

3.7 UI制作与系统控制

⑴ UI界面的制作。Unity提供了一套很完整的图形化界面引擎。本项目中将开始界面、积分和血量显示界面、游戏成功界面、游戏失败界面分别设计为四个不同的Panel面板组件,用代码来控制他们的显示和隐藏。

⑵ 开始游戏。初始是暂停状态,将Time.timeScale设为0或1可以很方便的将游戏进度暂停或开启。等待玩家点击“开始游戏”按钮,游戏正式开启,主要代码如下:

void Start() { Time.timeScale=0; }

public void readygo() { Time.timeScale=1;

readyUI.SetActive(false); } //隐藏准备界面

⑶ 积分显示与游戏胜利。主要代码如下:

void iswin()

{ Scoretext.GetComponent().text=score;

if (score>=100)

{ Time.timeScale=0; winUI.SetActive(true); } }

⑷ 血量显示与游戏失败。主要代码如下:

void islose()

{ bloods.GetComponent().value=bloodvalue;

if (bloodvalue<=0)

{ Time.timeScale=0; loseUI.SetActive(true); } }

4 結束语

本项目作为Unity3D引擎开发的教学项目,将多个知识点有机地融合在一起,难度也根据学生的知识储备和认知规律来确定。让学生在项目实践中掌握Unity3D的主要知识点和项目开发流程,可以对教学项目做适度扩展,在教学实践中取得了较好的效果,在一定程度上弥补了课程教学资源的不足,也为相关课程的教学提供了借鉴。后续可以在实际教学中对此项目不断进行创新和迭代升级,添加更多的功能模块,如主角的爬高控制、变换场景、设置游戏等级、批量生产敌人等。既让玩家具有更好的游戏体验,也能让学生进行更深入的学习。

参考文献(References):

[1] 中华人民共和国中央人民政府网.中华人民共和国国民

经济和社会发展第十四个五年规划和2035年远景目标纲要[EB/OL].[2021-03-13].http://www.gov.cn/xinwen/2021-03/13/content_5592681.htm.

[2] 陈小红,张银巧.高职虚拟现实应用技术专业课程体系构建

研究[J].职业技术,2021,20(10):99-103

[3] 周玉珍.基于项目式教学培养中职学生高阶思维能力的

研究与实践[D].硕士,贵州师范大学,2020

[4] 汪秀珍,段俊霞.SolidWorks三维设计课程的项目式教学

实践[J].武汉工程职业技术学院学报,2021,33(4):94-96

[5] 曹晓明.Unity3D游戏设计与开发[M].北京:清华大学出版

社,2019

[6] 刘国柱.Unity3D/2D游戏开发从0到1(第二版)[M].北京:

电子工业出版社,2018

猜你喜欢

项目式教学虚拟现实
论虚拟现实艺术的“沉浸”
REALITY BITES
风口上的虚拟现实
民办本科高校新闻专业项目教学的实践与思考
论项目教学在高职计算机网络技术专业课程教学中的应用
初中生物项目式学习活动的探索
虚拟现实技术向科幻小说借灵感
高职《液压技术》课程教学改革探索
虚拟现实:另一个真实世界
机制专业MATLAB软件课程项目式教学研究