js 塔防游戏从零开始开发_从零开始学基于ARKit的Unity3d游戏开发系列21

本文介绍了在Unity中如何实现玩家角色捡起地面上的武器并开火的功能。首先从AssetStore下载武器资源,将其添加到场景中,并调整位置和碰撞体。接着创建一个脚本来处理碰撞事件,当角色与武器碰撞时,显示拾取武器的按钮,同时隐藏准星。当离开武器时,恢复准星并隐藏拾取按钮。最后,添加一个UI按钮,实现点击按钮真正拾取武器的操作。文章还提供了代码示例和资源下载链接,帮助读者理解并实践这一过程。
摘要由CSDN通过智能技术生成

09d3773b8b47d65e65b9de4338f3ff29.png

在本课的内容中,我们将让玩家可以在地面上捡起武器,然后开火。而不是一开始就已经一人一枪横扫千军了。

为此,首先我们要从Asset Store中下载一个武器资源。

在Asset Store中搜索pistol,然后选择FREE ONLY,从搜索结果中选择下图中的这个资源。

4e174018d33d919c537cbadd550c2ab8.png

把下载后的资源拖入到Arts文件夹。打开[PBR]Makarov文件夹,然后将其中的预设体拖动到Hierarchy视图中,使其成为ruined_house的子对象,并更名为myWeapon。

015c1d21c329b4b910b896fd386437f4.png

接下来在Inspector视图中调整Transform中的相关属性如下(仅供参考):

35cc904a1cdd0a33d4bceb4cd7ebe9ef.png

接下来点击Inspector视图中的Add Component,给pistol对象添加一个Box Collider组件,然后设置碰撞体的大小,如图所示。

再次强调,这些数字是相对比较主观的,你觉得合适就行。

除了Box Collider,我们还需要继续给pickupWeapon对象添加一个Rigidbody组件,因为我们希望武器受到重力的影响。这样当游戏开始的时候,武器就会自动掉落到地面。

好了,接下来我们需要创建脚本,来处理拾取武器的操作。

在Hierarhcy视图中选中CameraParent-Main Camera,然后点击Inspector视图中的Add Component按钮,给它添加一个新的脚本组件,并将其命名为PickupWeapon。

在MonoDevelop中将其打开并更改其中的代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine;  

public class PickupWeapon : MonoBehaviour {   

// Use this for initialization  
void Start () {  
   }   

//1.开始碰撞   
void OnCollisionEnter(Collision col){    
if (col.gameObject.name == "myWeapon") {       

Debug.Log ("Enter test");     
 }  
}   

//2.碰撞结束   
void OnCollisionExit(Collision col){     

if(col.gameObject.name == "myWeapon"{     
Debug.Log("Exit test");   
}    
}  
}  

这里我们只是添加了两个方法,而这两个方法在之前的课程中有提过,分别是用于处理碰撞开始合碰撞结束的事件。这里我们再是只是在Console中输出相应的信息。

好了,接下来回到Unity编辑器,在Hierarchy视图中选中CameraParent-Main Camera,然后在Inspector视图中点击Add Component,添加一个Rigidbody组件,并取消勾选Use Gravity。此外在Rigidbody组件的Constraints属性处勾选所有的选项。

41d53e4e02d7ba2754406bab873630e2.png

接下来可以测试一下,点击Unity编辑器上的Play按钮进行测试。

当我们在场景中拖动主摄像机到地面上的武器位置附近时,可以看到武器被撞飞了,同时在Console中输出了相应的提示。

cf4dcac0985171bfe089aefc36399db7.png

不过看起来武器的重量太轻了点,让我们给它增加点重量。

在Hierarchy视图中选中HitCubeParent-ruined_house-myWeapon,然后在Inspector视图中将其Rigidbody组件的Mass属性设置为40.

2ecda1e8aa4807528116c64d300742c7.png

再次运行测试,看起来差不多了~

然后从这里下载本章所需的资源素材:

链接:https://pan.baidu.com/s/1pLKGvhT 密码:s6pz

将其中的文件解压缩,并将hand-sprite.png资源文件拖动到Uni

ty编辑器的Project视图的Arts文件夹中。

选中该文件,然后在Inspector视图中点击Texture Type旁的下拉列表,然后选择

Sprite(2D and UI)

ad5de999f6e0dea1bf99d70f9b691578.png

然后别忘了点击右下角的Apply按钮

接下来在Hierarchy视图中选中Canvas,添加一个新的Button UI元素,将其命名为btn_Pickup,删除该按钮的文本子对象。

然后在Inspector视图中将Image组建下的Source Image属性设置为hand-sprite。

更改Rect Transform属性中的Width 和Height为150和150.

最后在默认情况下对其禁用,如图所示。

ad5de999f6e0dea1bf99d70f9b691578.png

好了,现在可以回到我们的PickupWeapon.cs脚本,修改其中的代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine;  

public class PickupWeapon : MonoBehaviour {   

//1.创建到拾取武器按钮的引用  
public GameObject pickupBtn;  

// Use this for initialization  
void Start () {   

  }   

//1.开始碰撞   
void OnCollisionEnter(Collision col){    
if (col.gameObject.name == "myWeapon") {    

//   Debug.Log ("Enter test");     

//2.启用拾取武器按钮    
pickupBtn.gameObject.SetActive (true);      
}  
}  

//2.碰撞结束   
void OnCollisionExit(Collision col){     
if(col.gameObject.name == "myWeapon"){  

//   Debug.Log("Exit test");    

//3.禁用拾取武器按钮    
pickupBtn.gameObject.SetActive (false);   
}   
} 
}  

在以上代码中,按照注释行的数字编号来简单解释一下:

1.创建了到拾取武器按钮的引用。

2.当碰撞发生时,启用拾取武器按钮

3.当碰撞结束时,禁用拾取武器按钮。

回到Unity编辑器,在Hierarchy视图中选中CameraParent-Main Camera,然后在Inspector视图中将Pickup Weapon组件的Pickup Btn属性更改为btn_Pickup,如图所示。

75ef2eb756cd36f6004d4530959bca69.png

好了,接下来我们完成一个之前别遗忘的工作,给准星创建一个引用。

回到PickupWeapon.cs,更改代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PickupWeapon : MonoBehaviour {

//创建到拾取武器按钮的引用
public GameObject pickupBtn;

//1.创建到准星的引用
public GameObject crossHair;


// Use this for initialization
void Start () {

}

//开始碰撞

void OnCollisionEnter(Collision col){

if (col.gameObject.name == "myWeapon") {

//   Debug.Log ("Enter test");

//启用拾取武器按钮
pickupBtn.gameObject.SetActive (true);

//2.禁用准星
crossHair.gameObject.SetActive(false);

}
}

//碰撞结束

void OnCollisionExit(Collision col){

if(col.gameObject.name == "myWeapon"){

//   Debug.Log("Exit test");
//禁用拾取武器按钮
pickupBtn.gameObject.SetActive (false);

//3.启用准星
crossHair.gameObject.SetActive(true);
}

}

}

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

1.创建了到准星UI控件对象的引用

2.当碰撞发生时,禁用准星

3.当碰撞结束时,启用准星

然后回到Unity编辑器,在Hierarchy视图中选中CameraParent-Main Camera,然后在Inspector视图中将Pickup Weapon组件的Cross Hair属性设置为Crosshiar UI元素,如图所示。

01e61dac298db813903afded6e72e4cf.png

接下来点击工具栏上的Play按钮,预览下游戏效果。

到了这一步的,基本的操作已经完成了,让我们再做一些完善工作。

在Hierarchy视图中选中Canvas,然后在Inspector视图中点击Add Component,给其添加一个新的脚本组件,将其命名为WeaponPickup。在MonoDevelop中将其打开,并更改其中的代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
//1.导入UI相关的命名空间 
using UnityEngine.UI;   

public class WeaponPickup : MonoBehaviour {   

//2.创建到拾取武器按钮的引用  
public Button pickupBtn;   

//3.创建到武器的引用  
public GameObject weapon1;   

// Use this for initialization  
void Start () {    

 }    

// Update is called once per frame  
void Update () {   

  } } 

以上代码比较简单,这里就不在赘述了,大家直接看注释应该就可以明白。

回到Unity编辑器,首先在Hierarchy视图中找到CameraParent-Main Camera-weapon1,然后在默认状态下将其禁用。

然后在Hierarchy视图中选中Canvas,设置Weapon Pick Up组件的属性如图:

6c74651aa609501e881278c5e629f181.png

接下来回到WeaponPickup.cs脚本,更改其中的代码如下:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
//导入UI相关的命名空间 
using UnityEngine.UI;   

public class WeaponPickup : MonoBehaviour {   

//创建到拾取武器按钮的引用  
public Button pickupBtn;   

//创建到武器的引用  
public GameObject weapon1;   

// Use this for initialization  

void Start () {    

//1.启用武器   
pickupBtn.onClick.AddListener (EnableWeapon);     

}   

void EnableWeapon(){     

weapon1.gameObject.SetActive (true);   
 }    

// Update is called once per frame  

void Update () {   

  } }  

以上代码中,我们只是在用户按下拾取武器的按钮时启用武器。

好了,接下来可以点击工具栏上的Play按钮预览游戏效果。

本课的内容到此结束,我们下一课再见~

答疑说明:

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

示例项目:

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

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

dd2b24ca066778bacf58a60fae893e49.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值