生命游戏代码_从零开始学基于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

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona