生命游戏代码

阅读: 评论:0

生命游戏代码

生命游戏代码

欢迎回到我们的学习。

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

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

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

.Raycast.html

可以看到,在Unity中,Phys

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

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

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

具体可以参考下图。

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

打开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,使得按钮显示在合适的位置。

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

Rect Transform中的Width 和Height 为300,300

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

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

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

接下来打开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.添加按钮的响应事件
Click.AddListener (OnShoot);
}void OnShoot(){//2.定义一个RaycastHit类型变量,用于保存检测信息
RaycastHit hit;//3.判断是否检测到命中敌人
if (Physics.Raycast (ansform.position, ansform.forward, out hit)) {//destroy enemy//instantiate blood effect//load shooting effect//4.输出所命中的对象名称
Debug.Log (ansform.name);
}}// Update is called once per frame
void Update () {}
}

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

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

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

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

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

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

首先在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.添加按钮的响应事件   
Click.AddListener (OnShoot);  
}   void OnShoot(){   //定义一个RaycastHit类型变量,用于保存检测信息   
RaycastHit hit;    //判断是否检测到命中敌人   
if (Physics.Raycast (ansform.position, ansform.forward, out hit)) {          
//2.获取所受攻击的敌人    
Enemy target = ansform.GetComponent<Enemy>();    //3.destroy enemy     
if (target != null) {         target.TakeDamage (damage);       }    
//instantiate blood effect 
//load shooting effect 
//输出所命中的对象名称   
Debug.Log (ansform.name);  }   
}   
// Update is called once per frame
void Update () {}
}

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

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

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

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

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

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

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

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

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

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

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

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

答疑说明:

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

示例项目:

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

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

本文发布于:2024-01-31 14:30:57,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668266029201.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:生命   代码   游戏
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23