生命游戏代码_从零开始学基于ARKit的Unity3d游戏开发系列11

2024-01-01 12:40

本文主要是介绍生命游戏代码_从零开始学基于ARKit的Unity3d游戏开发系列11,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

fc4549a17968508849a3fe82a16752ee.png

欢迎回到我们的学习。

到目前为止,敌人的各种功能可以说是比较齐备了,但是作为玩家,却只能被动挨打,不能主动攻击。

因此,在本课的内容中,我们将实现对敌人的反击。为此,我们需要学习Unity中Physics.Raycast的概念。

首先在官方API文档中查看与之相关的定义:

https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

a4c5b3963481988facba7e5d97ad404a.png

可以看到,在Unity中,Phys

ics.Raycast是从origin位置沿着direction的方向,发出一条长度为maxDistance的射线,而目标则是检测场景中的所有碰撞体。

其中layerMask参数用来选择性的过滤某些碰撞体。

queryTriggerInteraction参数用来指定该查询是否应命中trigger。

具体可以参考下图。

e58b2d0ccda379a7c90ee165927cb320.png

在了解了相关原理之后,接下来就是具体来实现了。

打开Unity编辑器,在Project视图中,找到Assets-_Scripts文件夹,然后右键单击,创建一个新的脚本文件,将其命名为ShootEnemy,在MonoDevelop中打开。

更改其中的代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
//1.import namespace
using UnityEngine.UI;public class ShootEnemy : MonoBehaviour {//2.创建到Button对象的引用
public Button shootBtn;
//3.创建到主摄像机的引用
public Camera fpsCam;// Use this for initialization
void Start () {}// Update is called once per frame
void Update () {}
}

以上代码中只有注释行1,2,3相关的代码是我们添加的,大家直接看注释就明白每行代码的作用了,这里就不再赘述。

接下来回到Unity编辑器,在Hierarchy视图中找到Canvas对象,

然后右键单击,选择UI-Button,创建一个新的按钮,并将其命名为btn_Shoot。删除按钮所对应的文本,然后切换到Game视图。

保持选中btn_Shoot对象,在Rect Transform中设置锚点类型为bottom right。

然后设置Pos X和Pos Y,使得按钮显示在合适的位置。

9248d0cbbe680af098f8e098c60041dd.png

d66a469c0c2114e677a5411a42bd6fa4.png

然后更改按钮的Image组件的Source Image属性为UIMask,更改

Rect Transform中的Width 和Height 为300,300

e86e4e69e941d6e9887c2a3828ae57dc.png

设置好了按钮之后,在Hierarchy视图中选择CameraParent对象下面的MainCamera,然后右键单击,创建一个空的游戏对象,将其命名为weapon1。

在Inspector视图中点击Add Component,然后选择ShootEnemy。

在Shoot Enemy组件的属性中,将Shoot Btn设置为btn_Shoot按钮,将Fps Cam设置为Main Camera。

bcdf8378e4ad26f54cc81c7e3b17f9ad.png

接下来打开ShootEnemy.cs,并添加对事件的响应代码,更改后的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//import namespace
using UnityEngine.UI;public class ShootEnemy : MonoBehaviour {//创建到Button对象的引用
public Button shootBtn;
//创建到主摄像机的引用
public Camera fpsCam;// Use this for initialization
void Start () {//1.添加按钮的响应事件
shootBtn.onClick.AddListener (OnShoot);
}void OnShoot(){//2.定义一个RaycastHit类型变量,用于保存检测信息
RaycastHit hit;//3.判断是否检测到命中敌人
if (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit)) {//destroy enemy//instantiate blood effect//load shooting effect//4.输出所命中的对象名称
Debug.Log (hit.transform.name);
}}// Update is called once per frame
void Update () {}
}

按照注释行编号简单解释一下:

1.这里添加射击按钮的响应方法,OnShoot 2.这里定义了一个RaycastHit类型的变量,用于保存检测信息

3.使用Physics.Raycast方法来判断是否检测到命中敌人

4.在实现具体的效果之前,先在Console中输出所命中的对象名称。

回到Unity编辑器,点击Play按钮预览游戏效果。在Game视图中点击Start Game,移动主摄像机的位置,然后点击屏幕右下角的按钮,可以在Console面板中看到所命中的对象名称。

308c535be73822534b1a8877c42742bb.png

接下来让我们完善命中敌人后的具体效果。

首先在Project视图中找到Assets-_Prefabs文件夹,选择zombieEnemy这个预设体,然后在Inspector面板中点击Add Component,添加一个新的脚本,命名为Enemy。

在MonoDeve

lop中将其打开,并更改代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine;  public class Enemy : MonoBehaviour {   //1.设置敌人的生命值  
public float health = 30f;   // Use this for initialization  
void Start () {     
}   //敌人受到伤害后的处理  
public void TakeDamage(float damage){     //2.敌人生命值减少特定的数值   
health -= damage;//输出敌人生命值   print (health);     //3.当敌人生命值变为0的时候,就死亡   
if (health <= 0) {      //4.Enemy Die     
Die ();   
}   
}   
//敌人死亡  
void Die(){    //5.在1秒钟后销毁敌人对象   
Destroy (gameObject, 1f);  
}    
} 

这里还是按照注释行的数字编号来解释下相关代码。

1.设置敌人的生命值变量

之所以设置为public类型,是因为我们将在Enemy.cs之外的代码中访问该变量

2.让敌人的生命值减少特定的数值

3.当敌人生命值减少为0时,就进入死亡状态

4.调用敌人死亡的方法

5.使用Destroy方法,在1秒钟后销毁当前敌人对象。

接下来切换到ShootEnemy.cs,更改后的代码如下:


using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
//import namespace 
using UnityEngine.UI;  public class ShootEnemy : MonoBehaviour {   
//创建到Button对象的引用  
public Button shootBtn;  //创建到主摄像机的引用  
public Camera fpsCam;   //1.设置敌人每次受到伤害的数值  
public float damage = 10f;   // Use this for initialization  
void Start () {    //1.添加按钮的响应事件   
shootBtn.onClick.AddListener (OnShoot);  
}   void OnShoot(){   //定义一个RaycastHit类型变量,用于保存检测信息   
RaycastHit hit;    //判断是否检测到命中敌人   
if (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit)) {          
//2.获取所受攻击的敌人    
Enemy target = hit.transform.GetComponent<Enemy>();    //3.destroy enemy     
if (target != null) {         target.TakeDamage (damage);       }    
//instantiate blood effect 
//load shooting effect 
//输出所命中的对象名称   
Debug.Log (hit.transform.name);  }   
}   
// Update is called once per frame
void Update () {}
}

按照注释行的数字编号来简单解释一下:

1.这里设置了敌人每次受到伤害的数值

2.使用hit信息获取所受攻击的敌人对象

3.如果敌人对象不为空,那么调用Enemy.cs中的TakeDamage方法,让其生命值减少。

回到Unity编辑器,点击工具栏上的Play按钮预览游戏效果。

可以看到每次敌人受到攻击时,都会在Console中显示敌人的当前生命值。

ce4b4a773109a5b6075cd9023c113156.png

为了让我们方便攻击敌人,这里我们再添加一个准星。

在Unity编辑器中切换到Asset Store,搜索crosshair,然后找到下面这个插件。

6775393cfb5b014c0419eda30b3ce8f6.png

下载并导入该插件,并将其归入Components文件夹。

在Hierarchy视图中选择Canvas,右键单击,选择UI-Image,添加一个新的I

mage控件,将其更名为Crosshair。然后在Inspector视图中将Image组件的Source Image属性更改为3这个纹理图片。

165c7928cd6329f28eeaac56df5e9f95.png

3927de362ea7af015ab34b4af575a044.png

好了,此时在Game视图中可以看到多了一个准星。

答疑说明:

1.为了方便大家对课程中的问题提问,创建了一个问答社区。大家后续有开发相关的问题请到课程答疑专区提问http://icode.fun/ask/forum.php

示例项目:

https://github.com/eseedo/AR-VRCourse

如果想要更全面深入的了解虚拟现实行业、产品和技术现状,虚拟现实相关的开发知识,以及相关的工作机会,可以关注我的知识星球。

12ecc81ac5af64cd86774284fef43fc9.png

当然,如果囊中羞涩,也可以关注微信公众号vrlife,或头条号”寒酒仙“,大部分内容也会通过这些途径分享~

这篇关于生命游戏代码_从零开始学基于ARKit的Unity3d游戏开发系列11的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559272

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加