生存之战

388

3.

2

介绍: COMBAT OF SURVIVAL

“在战争的迷雾中。。你的生命岌岌可危。。有了一系列武器,你需要与一大群朝你方向来的物体作战!”

游戏灵感

随着技术在现代世界迅速推进,它使我们的生活更舒适和奢华。但这种贸易措施产生了一个不健康的生活方式,人们迷恋和依赖该技术,导致他们放弃最基本和锻炼的健康活动。而这可能会导致各种问题,主要是明显的一个是肥胖,这可能导致其他更严重的疾病,如心血管疾病。

看起来技术是所有邪恶的根源。而这就是我们进入解决问题的地方,使用技术与技术的落后一侧作战。我们要做的是创造一个游戏,不仅会很有趣和愉快,而且还保持用户积极地移动。

描述和游戏的目标

我们的比赛是增强现实(AR)基于。

用户将得到2个AR标记,第一个我们称之为武器制造者。武器标记将显示一系列武器供用户更改。武器将在标记底部标记上显示的虚拟按钮上的磁带时发生变化。第二,我们称之为忍者标记。该标记在从武器标记中选择要使用的武器后使用。将显示选定的武器,并用于与对象进行战斗。有多个物体的武库,它们会出现并朝你的方向移动,你必须使用武器在物体击中你之前,将其斜射向你。用户将获得三个生命,如屏幕右上方所示,三个药丸。当对象击中用户时,生命将减少。每个对象的得分都不同,你所说的分数越多越好。

继续: How to build our project?

第一步:下载CombatOfSurvival文件和演示视频

我们的游戏文件:(包括我们游戏的zip文件夹,里面有apk,WeaponMarker,NinjaMarker)

https://drive.google.com/open?id=1hJiyGb4XbkMz0RH22JEe6eKrjtenwOo0

我们的演示视频:

https://youtu.be/hlpsa1djbgw.

License:


本工程根据知识共享署名4.0国际许可

第二步:如何建设我们的项目?

硬件要求:

  • 打印的VR标记图像(WeaponMarker,NinjaMarker)
  • 智能手机与相机,GPS和闪光灯
  • AR耳机
  • 电脑类

Software requirements:

截至2018年11月18日更新的链接

步骤3:软件配置

为武福利亚准备统一

在我们使用vuforia之前,我们必须在vuforia上创建一个开发人员帐户。然后打开unity项目并在层次结构窗口中删除摄影机对象。转到Vuforia开发人员门户上的License Manager,然后创建新的许可证密钥使用开发人员帐户。插入许可证密钥团结一致。在“项目窗口”下,转到资产>武福里亚>预制件>阿卡迈拉。选择Arcamera并将其拖动到层次结构窗口。

这将是我们使用vuforia的基本环境。

步骤4:构建我们的项目

安装基本程序后,单击统一枢纽>正常开放>活尸(找到保存的文件)。

中的对象等级制度面板:

  • AR摄像机- 用户将从中查看的视图
  • _游戏管理器–包含用于处理游戏环境(生成、音乐等)的脚本的对象
  • 破坏点- 目标对象将被销毁的终点
  • 产卵箱- 一个3维框,指示可以产生对象的位置
  • 画布–用于“播放”的用户界面(UI)
  • 野味–用于“游戏结束”的用户界面(UI)
  • 忍者图像目标–显示默认/当前武器的标记
  • 武器图像目标–显示武器射程的标记

低于资产>场景,有

  1. 主菜单–包含用户进入游戏时看到的UI
  2. 教程- 包含游戏教程的组件
  3. 射击方块(主场景)–包含游戏所需的所有其他内容

现在你可以浏览CombatOfSurvival的文件夹了!

步骤5:开始

AR CAMERA

为了概括用户将要看到的视图和方向,我们需要在场景中有一个摄像头。

  • 点击游戏对象>武福里亚>AR摄像机

创建游戏对象

创建将产生的对象并与用户交互。

立方体(游戏对象)

  • 点击游戏对象>三维对象>立方体
  • 点击立方体在里面这等级制度面板,将以下组件添加到对象:
    1. 网格渲染器(默认情况下,应该存在)
    2. 盒子碰撞器(Default) – allows object to collide with each other
    3. 添加组件>刚体禁用“使用重力”-当物体与其他物体碰撞时,允许物体在物理控制下动作
    4. 添加组件>动画师- 允许我们将动画添加到对象(旋转,缩放等)

添加立方体的连续动画

  • 点击立方体在里面这等级制度面板并转到窗户>动画>动画
  • 动画面板,按“创建并将动画保存在“资源”下的“动画”文件夹中
  • 点击添加属性>变换>旋转
  • 点击“1:00” sec, and press the recording mode button (Red Button), and change the rotation of x and y to 360
  • For smooth looping animation, in the动画面板,去曲线,按Ctrl+A选择整个曲线,然后右键单击曲线的起点,然后选择“自动“ - 这将提供动画的线性速度

在立方体出现时向其添加一次性动画

  • 点击立方体在里面这等级制度面板并转到窗户>动画>动画师
  • Right click in the background of动画师>创建状态>空的
  • 将其重命名为CubeAppear
  • 在“Animator”>“Set as Layer Default”状态中右键单击“CubeAppear”–这将确保在播放其他动画之前先播放CubeAppear的动画
  • Right Click on CubeAppear in the Animator> Make transition > point it to CubeAni
  • 低于动画面板>创建新剪辑>立方体
  • 将“0:00”(x,y,z)设置为(0,0,0)
  • Go to CubeAppear > disable Loop Time

最后,在资源下创建文件夹“对象”,然后拖动立方体进入文件夹。删除立方体等级制度控制板。

第6步:设置产卵箱并构建产卵器

产卵箱

创建对象将生成的区域

  • 右键单击等级制度面板>三维对象>立方体
  • 重命名多维数据集(1)到Spawnbox
  • 禁用网格渲染器盒子碰撞器–此框仅用于定义繁殖区域。
  • 更改位置(X,Y,Z)到(0,0,30)–这将指示繁殖区域到相机的距离
  • 更改比例尺(X,Y,Z)到(20,10,10)–这将指示产卵区域的大小

产卵者

Writing a script to spawn a Game Object at different time interval

  • 点击产卵箱>添加组件>新建脚本>命名为“产卵者”>创建和add
  • 右键点击Script>编辑脚本
  • 插入以下代码(有关说明,请参阅代码中的注释
使用系统集合;使用UnityEngine;公共类产卵器:单行为{//GameObjects Variabes public GameObject Object1;//在此处插入多维数据集公共转换框//给出spawnbox的位置、旋转、缩放//改变变量public float SpawnTime=1f;public int MaxNoOfObjects=5;public static bool objectdestromed=false//全局变量void Start(){//Start spawing objects startcroutine(spawnLoop());}void Update(){if(objectdestromed){objectdestromed=false;createObj();}}public GameObject createObj(){//此函数将在空间向量3 randomPos=getRandomPos()中生成一个obj//get random位置//实例化(object,position,rotation,parent,instantiateInWorldSpace)//这将产生一个对象GameObject newObj=Instantiate(Object1,randomPos,Quaternion.identity)作为GameObject;return newObj;}public Vector3 getRandomPos(){//get random position in the spawnBox

//spawnBox area float MIN\u X=-spawnBox.localScale.X/2,MAX\u X=spawnBox.localScale.X/2;float MIN\u Y=-spawnBox.localScale.Y/2,MAX\u Y=spawnBox.localScale.Y/2;float MIN_Z=spawnBox.position.Z-(spawnBox.localScale.Z/2),MAX_Z=spawnBox.position.Z+(spawnBox.localScale.Z/2);float x=UnityEngine.Random.Range(最小值x,最大值x);float y=UnityEngine.Random.Range(最小值y,最大值y);float z=UnityEngine.Random.Range(最小值z,最大值z);Vector3 pos=新的Vector3(x,y,z);返回pos;}private IEnumerator spawnLoop(){yield return new WaitForSeconds(2)//等待5秒int i=0;while(i

最后,拖动立方体在下面资源>对象产卵箱在里面等级制度面板到产卵者编写输入框脚本。现在,您应该看到对象以不同的速度生成。基本上,这个脚本所做的是它将在SpawnBox中的一个随机位置以给定的秒间隔生成一个给定的游戏对象(本例中是一个立方体)。您也可以参考此脚本的附加文件。

步骤7:为对象设置端点/销毁点

破坏点

创建对象将飞到并被销毁的墙

  • 右键单击层次结构面板> 3D对象>立方体
  • Rename it as “DestroyPoint”
  • 禁用网格渲染器并启用长方体碰撞器
  • 将位置(X,Y,Z)更改为(0,0,0)
  • 将秤(x,y,z)更改为(10,10,10)

反对行为

Flying the cubes from SpawnBox to Camera and Exploding it when it collide with DestroyPoint

  • 单击Assets>Objects下的Cube,Add Component>new script>Name it“objectbehavior”>Create and Add
  • 在脚本中插入以下代码(有关说明,请参阅代码中的注释
使用System.Collections;使用UnityEngine;public class ObjectBehaviour : MonoBehaviour { //Variables Vector3 DestroyPtPos; Rigidbody rb; GameObject[] pieceList; //array of debris after explode Renderer rd; //public variables public float speed = 2f; // Speed public float cubeSize = 0.15f; //size of debris after explode public int noOfPieces = 30; //no of debris void Start() { //get Destroy position GameObject destroyPt = GameObject.Find("DestroyPoint"); DestroyPtPos = destroyPt.transform.position; //get rigidbody rb = GetComponent(); //get renderer rd = GetComponent(); } // Update is called once per frame void Update () { //make objects fly to camera // takes 5 sec for it to reach the camera transform.position = Vector3.MoveTowards(transform.position, DestroyPtPos, speed * Time.deltaTime); } private void OnTriggerEnter(Collider other) { //if object collide DestroyPoint if (other.gameObject.name == "DestroyPoint") { //to make object untouchable rb.isKinematic = false; rb.detectCollisions = false; //make object disappear rd.enabled = false; //explode after it touches DestroyPoint explode(); //clear debris after 1 sec of explode StartCoroutine(delPieces()); //decrease totalobjects count since 1 is destroyed Spawner.objectDestroyed = true; } } void explode() { //For loop to create 30 pieces as debris after explode int x = 50; pieceList = new GameObject[noOfPieces]; for (int i = 0; i < noOfPieces; i++) { pieceList[i] = createPiece(x); x *= -1; } } public GameObject createPiece(int x) { //create piece GameObject piece; piece = GameObject.CreatePrimitive(PrimitiveType.Cube); //set piece position and scale and rotation piece.name = "Debris"; piece.transform.position = transform.position + new Vector3(cubeSize, cubeSize, cubeSize); piece.transform.localScale = new Vector3(cubeSize, cubeSize, cubeSize); piece.transform.localEulerAngles = new Vector3(cubeSize * x, cubeSize * x, cubeSize * x); //add rigidbody and set mass piece.AddComponent(); piece.GetComponent().mass = 0.05f; //add color piece.GetComponent().material.color = new Color(1, 1, 1, 1); return piece; } private IEnumerator delPieces() { //Clear debris after 1 seconds yield return new WaitForSeconds(1); foreach (GameObject item in pieceList) { Destroy(item); } pieceList = new GameObject[0]; yield return new WaitForSeconds(5); Destroy(gameObject); } }

基本上,这个脚本所做的是使立方体飞向DestroyPoint,当它与DestroyPoint的墙碰撞时,它将“爆炸”并从场景中取出。之后,它将触发对产卵器的调用,以在产卵框中产卵另一个对象。您可以参考随附的脚本文件。

继续:使用AR标记和游戏用户界面(UI)创建武器

第8步:创建标记和虚拟按钮

要使用我们的个人标记,我们必须去
vuforia门户登录并添加跟踪程序数据库。在那里,我们可以添加任何我们希望vuforia跟踪的图像跟踪器。完成后,选择所有我们想要的图像并将其导出到unity包。下载软件包。

转到unity并将下载的包添加到中(转到“资源”>“导入包”>“自定义包”>“选择vuforia包”,然后导入中的所有内容)

所有这些都完成后,我们现在设置并准备使用我们的个性化标记!

例如,创建球体(游戏对象)

  • 点击游戏对象>3D对象>球体
  • 单击层次面板中的球体,将以下组件添加到对象中:
  1. 网格渲染器(默认情况下,应该存在)框碰撞器(默认)-允许对象彼此碰撞
  2. 添加组件>刚体并禁用“使用重力”-允许对象在与其他对象碰撞时在物理控制下动作
  3. 添加组件>动画器–允许我们向对象添加动画(旋转、缩放等)

使标记跟踪虚拟对象

  • 单击游戏对象>vuforia>图像
  • 单击ImageTarget并转到Inspector>Image Target Behavious(脚本)。

In here there would be three settings we have to set to use our personalized marker.

  1. 类型:选择预定义。
  2. 数据库:选择用于在vuforia门户中添加标记跟踪器的数据库名称。
  3. Image Target:选择要使用的图像。
  • 将在中显示标记时要显示的游戏对象拖动到ImageTarget。
  • 转到场景视图并将游戏对象(球体)移动到要在标记对象的位置显示的位置。
  • 有了这个设置,当构建和运行时,你可以看到每当标记在视图中时显示的游戏对象。

添加虚拟按钮

  • 单击ImageTarget并转到Inspector>Image Target Behavious(脚本)。
  • 单击“高级”>“添加虚拟”按钮。
  • 经过doing this, a Virtual Button object will be created and stored in the ImageTarget hierarchy.
  • 单击虚拟按钮,然后转到Inspector>Virtual Button行为(脚本)

这里有两种设置:

  1. 姓名:选择虚拟按钮的名称。
  2. 敏感环境:选择高、中、低(高意味着对虚拟按钮附近的移动非常敏感的检测,例如,即使是阴影也会导致虚拟按钮触发。剩下的分别是。)

步骤9:每当按下虚拟按钮时,更改游戏对象&跟踪标记(脚本)

把事情联系起来

  • 单击ImageTarget并转到Inspector>Add a component>Script。
  • 右键单击脚本>编辑脚本
  • 插入以下代码(请参阅代码中的注释进行解释)
使用单一生命; 
使用vuforia;
公共类Wchange:monobhavior、ITrackableEventHandler、IVirtualButtonEventHandler{
私有可跟踪行为MTRACKABLEATS;公共游戏对象VirtualTN;公共游戏对象光剑;公共游戏物炮塔武器;公共游戏对象针织品[System.Noserialized]公共int Changinstate=2;私人NCANGE nWc;void awike(){nWc=GameObject.FindObjectOfType();}//使用此选项初始化void Start(){mtrackTableBehavity=GetComponent();if(mtrackableperformance){mtrackableperformance.registerTrackEventHandler(this);}
VirtualButton=GameObject.Find(“VirtualButton”);virtualBtn.GetComponent().RegisterEventHandler(this);}//在这里做点什么。public void OnTrackableStateChanged(trackablebehavior.Status previousStatus,trackablebehavior.Status newStatus){if(newStatus==trackablebehavior.Status.DETECTED | | newStatus==trackablebehavior.Status.TRACKED/| | newStatus==trackablebehavior.Status.EXTENDED|trackablebehavior){Debug.Log(mtrackablebehavior.TrackableName+“::::;int stateCorrection=更改状态-1;如果(stateCorrection==0){stateCorrection=3;}if(stateCorrection==1){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=true;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=false;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=false;}else if(stateCorrection==2){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=false;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=false;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=true;}else if(changingState==3){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=false;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=true;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=false;}
var rendererComponents=virtualBtn.GetComponentsInChildren(真);foreach(rendererComponents中的var component)component.enabled=true;}else{var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=false;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=false;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=false;var rendererComponents=virtualBtn.GetComponentsInChildren(真);foreach(rendererComponents中的var component)component.enabled=false//OnTrackingLost();}}受保护的虚拟void OnTrackingLost(){var rendererComponents=GetComponentsInChildren(true);var colliderComponents=GetComponentsInChildren(真);var canvasComponents=GetComponentsInChildren(真);//禁用呈现:foreach(rendererComponents中的var component)component.enabled=false;
//禁用碰撞器:foreach(colliderComponents中的var组件)component.enabled=false;
//禁用canvas“:foreach(canvasComponents中的var component)component.enabled=false;}public void OnButtonPressed(virtualbuttonbehavior vb){Debug.Log(“Btn_Pressed”)//传递状态到忍者显示nWc.chgState=changingState;
if(changingState==1){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=true;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=false;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=false;}else if(changingState==2){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=false;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=false;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=true;}else if(changingState==3){var LightSaberComponents=lightSaberWeapon.GetComponentsInChildren(true);foreach(LightSaberComponents中的var组件)component.enabled=false;var炮塔组件=炮塔武器.GetComponentsInChildren(真);foreach(var component in components)component.enabled=true;var KnifeComponents=knifeWearm.GetComponentsInChildren(真);foreach(KnifeComponents中的var组件)component.enabled=false;}//如果(changingState==3){changingState=1,则更改重启循环;返回;}更改状态++;}public void OnButtonReleased(virtualbuttonbehavior vb){Debug.Log(“Btn_Released”);}}

*In the code, make sure you implement two important interface for it. (ITrackableEventHandler,

IVirtualButtonEventHandler.)

  1. iTrackableEventHandler.:此界面将为您提供抽象方法OnTrackableStateChanged()这将允许您控制在视图中标记时要做什么以及标记不在视图中时要做的操作。
  2. IVirtualButtonEventHandler:如果虚拟按钮为此接口,它将为您提供抽象方法onbutton抑制()onbuttonreleased()。这将允许您控制按下虚拟按钮时要做的操作。
  • 一个重要的注意事项:
    • 因为我们已经使用ITrackableEventHandlerterface, this means we are actually accessing more control in the Handler. But Vuforia have its own script that uses ITrackableEventHandler in global scope. So, because we want more control, we have to disable or comment out Vuforia script.
    • 到了vuforia>脚本> defaulttrackableEventHandler
    • 在那里,您可以注释掉OnTrackingFound(),因为我们不需要它来帮助我们渲染对象,因为我们将自己定制渲染过程。
  • 最后,在脚本变量中拖动虚拟按钮对象和所有要更改的游戏对象。位于图像目标>检查器>脚本。

第10步:创建主菜单

添加背景图像和粒子

  • 单击“到GameObject”选项卡>“UI”>“Canvas”。
  • 右键单击画布>CreateEmpty。
  • 在空游戏对象中,单击添加组件>精灵渲染器。
  • 在Sprite renderer of the GameObject, there will be a Sprite field. At there you can add whatever image you want. (For us its the SF background)
  • 为了使小颗粒漂浮在周围,统一有自己的内置组件,因为这将使我们的生活变得更加容易。
  • 添加组件>粒子系统。
  • 在这个粒子系统场中,我们可以操纵我们想要的东西,比如我们想要粒子移动的速度,颜色,大小等等

创建画布/面板

*画布和面板将保存所有UI对象。

  • 单击“到GameObject”选项卡>“UI”>“Canvas”。
  • 单击创建的画布,右键单击>UI>面板(创建面板)
  • 单击已创建的画布,右键单击UI>按钮以创建一个按钮(创建按钮)

结果层次结构如下:

画布>面板>按钮

为了让按钮改变场景,我们必须连接一些脚本。

连接脚本

  • 单击按钮,转到检查器向下滚动,您将看到按钮的单击处理程序。选择runtime仅在下拉菜单上,并将按钮对象拖入。
  • 单击addcomponent按钮并添加一个脚本,将其命名为“LoadSceneOnClick”(或您的任何命名选择)。双击它打开你最喜欢的IDE上的脚本。

在中添加函数,此函数将允许我们按索引更改场景

公共void LoadByIndex(int-sceneIndex){
SceneManager.LoadScene(sceneIndex);}

完成后,返回按钮单击处理程序,然后选择脚本,然后选择函数。下面的空框中是我们传递的参数,它是要加载的场景的索引。

更改画布/面板不是现场

  • 为此,基本是在单击并显示另一个时隐藏一个画布。这将提供改变的影响。
  • 1st we have to hide the panel we do not want to display.
  • 点击a panel, for us its the IntroPanel, on the inspector tab, there is a check box. Untick the check box, this will setActive of the object to be false. You can write in code GameObject.setActive(false) if you prefer.
  • 单击按钮,然后单击inspector>on Click()
  • 这个On Click()设置允许我们控制用户单击按钮时发生的事情。
  • 将单击时要隐藏的面板拖到onclick()框中。右边的框可以让我们控制调用游戏对象的函数。
  • 单击GameObject>设置活动。
  • 底部是参数。由于setActive()接受一个布尔值,unity给了我们一个复选框,当有一个勾号时显示,否则表示true。
  • 因此,从这个设置中,我们可以隐藏一个面板并显示另一个面板,展示屏幕的变化幻觉。

第11步:奖励(射击炮塔)

*我们假设你在前线跟随一切,并且知道如何使用基本的统一。

基本设置

  • 我们有炮塔和DiskProjects对象的GameObject,所以只要下载它并拖动到层次结构中就可以了。
  • 还可以下载炮塔“掩体”的动画剪辑,如所提供。
  • 创建一个ImageTarget并添加一个虚拟按钮,如前面所示。
  • 在图像目标中添加炮塔对象。
  • *我们的主要目标是让炮塔在按下虚拟按钮时射击弹丸磁盘

勾搭

  • 转到炮塔并单击添加组件>脚本
  • 插入以下代码(请参阅代码中的注释进行解释)
    使用UnityEngine;使用UnityEngine.Events;
    公共类征集系统:Monobehaviour {[标题(“射击属性”)]公共浮动MaxProjectileForce = 18000F;//弹丸公共浮子的最大力冷却= 1f;
    [标题(“投射物属性”)]公共游戏对象ProjectePreFab//要发射的炮弹
    变换射影变换//炮弹应该产生的位置bool canShoot=true;动画师//对animator组件的引用
    void avake(){//获得对弹丸产生的引用。通过向这样的对象提供路径,我们正在制作//低效方法调用更有效的ProjectIleSpawnTransform = GameObject.find(“几何/驾驶舱/炮齿升降枢轴点/射弹生成点”)。变换;
    //获取对动画组组件的引用= getComponent ();
    public void fireprojectle(){if(!(c)返回;
    GameObject go=(GameObject)实例化(projectleprefab,projectlespawntransform.position,projectlespawntransform.rotation);Vector3 force=projectlespawntransform.transform.forward*最大投影力;go.GetComponent().AddForce(力);anim.SetTrigger(“火”)
    canShoot=假;调用(“冷却”,冷却);}
    void cowldown(){canshot=true;}
  • 将其添加到炮塔后,转到虚拟按钮,以便何时可以执行按的脚本按钮。

  • 在按钮中,添加先前教导的脚本,按按钮按下,调用函数火箭筒()在炮塔脚本中。

  • This will allow the turret to play the animation and fire a Game object which is the projectile Disk which will hook up now.

  • 单击转台>检查器>脚本

  • 转到脚本部分(我们刚才添加),然后拖动弹丸磁盘游戏对象。在那里,我们可以设置冷却时间和弹丸力,这是我们希望弹丸磁盘游戏对象飞行的速度执行虚拟按钮。

第12步:离开你去!

你已经成功地做了一个完全正常工作的手机游戏!

您可以包括的其他功能:

  • UI的设计
  • 游戏对象和武器的设计(例如创建自己的3D对象或从Unity的资产库下载3D对象)
  • 游戏导航(从一个场景到另一个场景)

玩得高兴!

步骤13:我们项目的未来改进

首先,在用户输入方面,我们希望插入更多的操作,这些操作可以由用户执行,使游戏更具互动性。目前,我们的用户输入是对用于销毁对象的武器进行标记跟踪。由于摄像机检测不如我们预期的那样健壮,所以运动的范围和速度非常有限。因此,其他输入,例如使用语音识别执行动作是合理的。

其次,可以引入多人模式,其中第一个玩家将是一个削减对象,而第二个玩家将是一个谁是产卵的对象。这可以在另一个标记的帮助下完成,以便第二个玩家初始化下一个对象的生成位置。这将增加游戏的参与性,并通过引入竞争对手使其更具竞争力。

第三,增加计分范围。对象可以从天上掉下来,或者在场景中任意位置出现一段时间,用户可以用它来砍加分,而不是用它来砍飞向用户的对象来得分。这将使游戏更加激烈,并确保用户总是在球上试图获得更多的分数,同时,试图摧毁物体飞向用户,这将减少他的健康酒吧。

Step 14: Other Challenges to Consider

Overall, Combat Of Survival is playable but there are limitations that will affect the user experience of the game which we did not foresee during the creation of the game. We overestimated the robust image detection of the camera. We realized that users cannot move their marker too quickly in front of the camera when playing the game because the camera would not be able to detect the marker. Moreover, lighting of the area is essential for the marker to be visible to the camera. As a temporary solution, we triggered the mobile phone's flash light when the user start the game in order to maximize the lighting in the area. This is effective to only a certain extent.

注意的另一个方面是使用使用标记显示的虚拟按钮。按钮的灵敏度也高度依赖于用户手的运动和如上所述的区域的照明。

第15步:额外:工作分配

君邦:

  • 第一步:下载CombatOfSurvival文件和演示视频
  • 第二步:如何建设我们的项目?
  • 步骤4:构建我们的项目
  • 步骤5:开始
  • 第6步:设置产卵箱并构建产卵器
  • 步骤7:为对象设置端点/销毁点
  • 第12步:离开你去!
  • 步骤13:我们项目的未来改进

莱斯特:

  • 介绍
  • 步骤3:软件配置
  • 第8步:创建标记和虚拟按钮
  • 步骤9:每当按下虚拟按钮时,更改游戏对象&跟踪标记(脚本)
  • 第10步:创建主菜单
  • 第11步:奖励(射击炮塔)
  • Step 14: Other Challenges to Consider

第一个分享

    建议书

    • 词干比赛

      词干比赛
    • 角色扮演游戏挑战

      角色扮演游戏挑战
    • 数控竞赛

      数控竞赛

    2评论

    1
    blorgggg

    两年前

    干得好!