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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.