Unity游戏角色按按键拾取物体

2024-01-22 03:50

本文主要是介绍Unity游戏角色按按键拾取物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标:游戏角色在可拾取物体前按下F键播放拾取动画,完成对目标物体的拾取

如下动图所示(速度加快了,主要看个效果,别介意)

实现方法

触发器和帧事件添加

主要通过的是GameObject的触发器以及动画的帧事件。

首先对游戏物体增加一个Sphere Collider组件,将该组件的Is Trigger勾选上,制作一个简易的触发器,如下图所示

 ,然后再在角色拾取动画中添加一个帧事件(这个游戏角色是在资源商店免费获取的,搜索关键字为:Character Pack),如下图所示

 之后编辑C#脚本进行操作

C#脚本

我创建了一个ItemBehavior类专门管理这些可拾取的物体,一个BoyBehavior类来管理游戏角色类,这里只展示实现该功能的部分代码

BoyBehavior类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BoyBehavior : MonoBehaviour
{//.........//标志位public bool isPickUp ;void Start{isPickUp =false;}//这里定义了在动画PickUp中的添加的帧方法public void PickUpThings(){isPickUp = true;}//.....}

ItemBehavior类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ItemBehavior : MonoBehaviour
{public GameBehavior gameManager;public BoyBehavior boy;//这里使用onTriggerStay,即角色呆在触发器中private void OnTriggerStay(Collider other){if (other.name == "Boy" && boy.isPickUp){Destroy(this.transform.parent.gameObject);Debug.Log("Item collected!");gameManager.Items += 1;boy.isPickUp = false;}}void Start(){gameManager = GameObject.Find("Game Manager").GetComponent<GameBehavior>();//注意这里要对boy进行初始化,否则会报错boy = GameObject.Find("Boy").GetComponent<BoyBehavior>();}}

代码解释:

首先在BoyBehavior类中创建了一个标志位isPickUp并将其初始化为false,当角色执行动画时会触发帧事件,即PickUpThings,在该方法中将isPickUp赋值为true。然后在ItemBehavior中写了onTriggerStay事件,在该事件中添加一个条件判断,当人物处在触发器范围内并且标志位isPickUp为true时,摧毁游戏事件,并将拾取的物体数加1。此外还要注意,在进行完这些操作之后要将isPickUp标志位重新置为false,否则人物一旦进入其他可拾取物体的触发器范围内将自动拾取,这是我们不希望看到的。

犯的错误:

将onTriggerStay误用成了onTriggerEnter,这一错误导致在运行游戏之后,人物在物体面前按下F键触发动画之后物体并没有消失,而是在人物重新进入触发器范围内物体才消失。原因就是两个函数的机制不同,onTriggerStay是在角色呆在触发器范围内才触发,而onTriggerEnter是在角色开始进入触发器范围内才会触发。

综上完成了初始目标要求

本文是对《Unity和C#游戏编程入门》该书籍中的Hero Born案例的改进,希望对大家有所帮助。

更正:

BoyBehavior类中的标志位的访问权限是public,这样的设置存在一定的问题,其权限为public时,在Unity编辑界面可以直接设置,如下图所示

 但是这个标志位并不应该在此处随意修改。所以对代码进行优化:

BoyBehavior类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BoyBehavior : MonoBehaviour
{//.........//标志位private bool isPickUp ;public bool PickUpFlag{get { return isPickUP;}set { isPickUp = value;}}void Start
{isPickUp =false;
}//这里定义了在动画PickUp中的添加的帧方法public void PickUpThings(){isPickUp = true;}//.....}

ItemBehavior类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ItemBehavior : MonoBehaviour
{public GameBehavior gameManager;public BoyBehavior boy;//这里使用onTriggerStay,即角色呆在触发器中private void OnTriggerStay(Collider other){if (other.name == "Boy" && boy.PickUpFlag){Destroy(this.transform.parent.gameObject);Debug.Log("Item collected!");gameManager.Items += 1;boy.PickUpFlag = false;}}// Start is called before the first frame updatevoid Start(){gameManager = GameObject.Find("Game Manager").GetComponent<GameBehavior>();boy = GameObject.Find("Boy").GetComponent<BoyBehavior>();}// Update is called once per framevoid Update(){}
}

这里主要使用了get和set属性对代码进行了优化

此外,由于需要可拾取的触发器来触发拾取操作,因此每个可拾取物体上都要挂载该脚本,因此这样的方法存在一定的缺陷,游戏物体和脚本之间的耦合性太高,如果某个物体有什么独特的拾取效果,比如这个物体是个假的宝石,拾取时会爆炸伤害玩家,那么单一修改该物体的脚本会导致其他物体的脚本全部被修改,从而所有的物体都变成了爆炸物品。因此可以换个思路。

该思路就是在游戏角色上添加一个触发器,当物体进入游戏角色的触发器范围内且游戏角色按下拾取键后拾取物体,该方法读者可以自己先实现,并不困难。

这篇关于Unity游戏角色按按键拾取物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu