【Unity3D】判断是否鼠标点击物体与血条制作

本文介绍如何在Unity3D中使用Slider组件制作一个简单的血条,并通过鼠标点击事件实现扣血效果。

血条是在游戏中非常常见的东西,和Cocos2dx中《【Cocos2dx】利用音量螺旋控件控制血量条 》(点击打开链接)一样,Unity3D的血条也其实就是用一个slider就能做完的事情。同时,本文也将继《【Unity3D】用鼠标点击事件、AddForce完成跳跃与二段跳》(点击打开链接)说明鼠标点击屏幕屏幕进一步说明鼠标点击任一物体的监听。

下面将举一个例子说明这个物体,如图,血条代表10格血,如果球被点一下,则扣1格血,点屏幕其它地方不扣血。


一、场景布置

1、这部分主要叙述怎么将Slider改成血条的。开始先放个球、调整下照相机,在球中放个灯光看起来更好看,就不赘述了。


2、如同《【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏》(点击打开链接)中所有UI一样,一旦用到UGUI,先要添加一个Canvas,之后再于Canvas上整个Slider。Slider添加完毕,直接将Handle SliderArea去掉,也就是那个滑动杆、滑块。


同时在Slider的Inspector中是不可交互的,以为不允许用户自行滑动滑块。


3、修改Background的背景色为黑色,Fill Area的Fill填充色为红色,如图所示。


4、弄好之后,发现血条并未被填满。其实空出来这部分原本就是留给被我们去掉的Handle SliderArea的。


现在选择Fill Area在Inspector面板中修改Rect Transform中个属性,将Left、Right的值都设为0,至此一个简单的血条就制作完成了,或者你直接用矩形工具将红色的Fill Area调整到和Background一样大小也行。

5、之后我们并不需要这个Canvas和《【Unity3D】UGUI自适应屏幕与锚点》(点击打开链接)一样填充到整个屏幕。如下图,将Canvas的渲染设置到World Space,也就是像普通东西一样渲染。


之后我们需要同时对Slider和Canvas的位置和大小进行调整。调整后的属性,如图所示,不然太大了。


二、脚本布置

之后我们要实现点击球,就扣血的功能,编写如下脚本SphereClicked.cs,赋予到球上。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;    //Slider属于UI,用到这个头文件

public class SphereClicked : MonoBehaviour
{

    public Slider HPStrip;    //添加血条Slider的引用
    public int HP = 10;//开始为10滴血
    void Start()
    {
        HPStrip.value = HPStrip.maxValue = HP;    //初始化血条
        GameObject.Find("Sphere").AddComponent<MeshCollider>();//球与下面的抽象射线碰撞检测必须
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))//鼠标左键点下
        {
            //住摄像机向鼠标位置发射射线  
            Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit mHit;
            //射线检验  
            if (Physics.Raycast(mRay, out mHit))
            {
                if (mHit.collider.gameObject.tag == "Sphere")
                {
                    HP--;//点到这个球,血就-1
                    HPStrip.value = HP;    //对血条执行操作
                }
            }
        }

        /*之后还可以根据HP进行一些操作*/
        if (HP <= 0)
        {
            //写下血条被清空之后的处理
        }
    }

}
给球上这个脚本之后,还没有完,如同《【Unity3D】利用物体碰撞检测、键盘输入处理完成平衡球游戏》( 点击打开链接)碰撞检测一样,我们先要给这个球,赋予一个tag,根据代码,这里的tag就是"Sphere"。再如同《【Unity3D】同场景物体传值与Vector》( 点击打开链接)中,设定我们这个脚本的public Slider HPStrip;就是我们刚才弄好的血条。


### 需求分析 要在 Unity3D 中实现鼠标右键点击物品并通过 Slider 控制量恢复功能,需要完成以下几个部分: 1. **检测鼠标右键点击事件**:通过 `Input.GetMouseButton` 或者 `Physics.Raycast` 来判断鼠标右键是否被按下以及点击的对象是什么。 2. **绑定目标对象滑动器 (Slider)**:将目标对象的量属性 UI 上的 Slider 组件关联起来。 3. **控制量变化逻辑**:当鼠标右键点击某个物品时,触发量恢复操作,并同步更新 Slider 的数值。 --- ### 解决方案 以下是完整的解决方案代码及其说明: #### 1. 创建一个脚本来处理鼠标右键点击量恢复逻辑 ```csharp using UnityEngine; using UnityEngine.UI; public class MouseRightClickHeal : MonoBehaviour { public GameObject targetObject; // 被点击的目标物体 public Slider healthSlider; // 控件 private float maxHealth = 100f; // 最大生命值 private float currentHealth; // 当前生命值 void Start() { if (healthSlider != null) healthSlider.maxValue = maxHealth; // 设置最大值 ResetHealth(); // 初始化健康状态 } void Update() { if (Input.GetMouseButtonDown(1)) // 检测鼠标右键点击 { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.gameObject == targetObject) // 判断是否点击到了指定目标 { HealTarget(); } } } } void HealTarget() { if (currentHealth < maxHealth) { currentHealth += Time.deltaTime * 50f; // 每帧增加一定比例的生命值 if (currentHealth > maxHealth) currentHealth = maxHealth; // 不超过最大值 if (healthSlider != null) healthSlider.value = currentHealth; // 更新UI上的显示 } } void ResetHealth() { currentHealth = maxHealth / 2f; // 初始化为一半的最大生命值 if (healthSlider != null) healthSlider.value = currentHealth; } } ``` #### 2. 将脚本挂载到场景中的合适对象上 - 创建一个新的空 Game Object 并将其命名为 `GameManager`。 - 将上述脚本附加到该对象上。 - 在 Inspector 界面中配置 `targetObject` 和 `healthSlider` 参数: - `targetObject`: 设定为希望被点击并恢复量的游戏对象。 - `healthSlider`: 拖入已经创建好的 Slider 组件。 #### 3. 添加 Slider 组件至 Canvas - 打开 Unity 编辑器,在 Hierarchy 中创建一个 Canvas 对象。 - 在 Canvas 下添加一个 Slider(可以通过右键菜单 -> UI -> Slider 完成)。 - 自定义 Slider 外观样式,例如颜色、宽度等。 #### 4. 测试运行效果 单击 Play 运行项目后尝试以下操作: - 使用鼠标右键点击设定为目标 (`targetObject`) 的游戏对象。 - 查看 Slider 是否随时间逐渐上升表示量正在恢复。 --- ### 关键点解析 - **射线投射机制**: 使用 `Physics.Raycast` 方法能够精准定位当前鼠标所指向的世界坐标下的碰撞体[^1]。这一步骤对于确认玩家意图至关重要。 - **动态调整量**: 基于每帧的时间间隔(`Time.deltaTime`)来平滑改变角色的生命值而非一次性跳跃式增长[^2]。这样可以让视觉体验更加流畅自然。 - **UI 同步更新**: 一旦修改了内部变量(currentHealth),立即通知对应的 UI 元素(Slider)刷新其外观表现形式[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值