Unity SKFramework框架(十)、AimableObject 物体交互系统

目录

一、Aimable Object

二、Aim System

三、示例


一、Aimable Object

为场景中需要进行交互的物体挂载AimableObject组件:

 

Description属性表示该物体的描述信息,AimableDistance属性表示该物体可被瞄准检测到的距离,通过OnEnterOnExitOnStay分别为该交互物体设置瞄准进入事件、瞄准退出事件、瞄准停留事件,也可以通过继承AimableObject类,来重写这些事件,如下所示:

using UnityEngine;
using SK.Framework;

public class Example : AimableObject
{
    protected override void OnEnter()
    {
        //TODO
    }
    protected override void OnStay()
    {
        //TODO
    }
    protected override void OnExit()
    {
        //TODO
    }
}

二、Aim System

瞄准交互系统的核心,需要在场景中挂载该组件:

Toggle表示整个系统的开关,将其设为false后,系统将不再进行瞄准检测,MainCamera是用于瞄准检测的相机,AimLayer表示检测的层级,AimMaxDistance表示检测的最大距离,AimMode表示瞄准的方式,包含两种,一种是Mouse,使用鼠标的位置发出射线进行瞄准检测,当我们的相机是自由视角、上帝视角时,通常使用这种方式;另一种则是View Centre,通过屏幕的中心点发出射线进行瞄准检测,当我们的相机是第一人称或第三人称视角时,通常使用这种方式。需要注意,当AimMode为ViewCentre模式时,AimMaxDistance属性才起作用。

除此之外,AimSystem中的核心属性还包括CurrentAimableObject,它记录了当前所瞄准的物体:

/// <summary>
/// 当前瞄准的物体
/// </summary>
public IAimableObject CurrentAimableObject { get; private set; }

三、示例

上例中,我们在物体的瞄准进入事件里添加了一个物体高亮的效果,并且通过一个Text文本来显示该物体的描述信息,在瞄准退出事件里隐藏物体的高亮效果,并将Text文本清空。实现过程如下:

using UnityEngine;
using SK.Framework;

public class Example : AimableObject
{
    [SerializeField] AimView view;

    protected override void OnEnter()
    {
        //显示物体高亮效果
        GetComponent<HighlightOutline>().enabled = true;
        //显示描述信息
        view.OnEnter(description, transform.position);
    }
    protected override void OnExit()
    {
        //隐藏物体高亮效果
        GetComponent<HighlightOutline>().enabled = false;
        //清空描述信息
        view.OnExit();
    }
}

将Example挂载于各个可交互物体,并填写各自的Description描述信息

using UnityEngine;
using UnityEngine.UI;

public class AimView : MonoBehaviour
{
    //用于显示描述信息的文本
    [SerializeField] Text descriptionText;

    public void OnEnter(string description, Vector3 worldPos)
    {
        //描述信息
        descriptionText.text = description;
        //世界坐标转屏幕坐标 更新文本位置
        Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
        descriptionText.rectTransform.anchoredPosition3D = screenPos;
    }
    public void OnExit()
    {
        descriptionText.text = null;
    }
}   

注意Text文本的锚点和轴心点的设置:

AimMode使用的是Mouse模式:

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity SKFramework 是一个基于 Unity 引擎开发的框架,为开发者提供了一系列的工具和功能,用于简化游戏开发过程中的任务管理、资源管理、事件处理等方面的工作。 在任务管理方面,SKFramework 提供了一个强大的任务系统,可以帮助开发者更方便地管理游戏中的各种任务。可以定义任务的类型、优先级以及执行顺序,并且支持任务的暂停、恢复、取消等操作。开发者可以通过任务系统来控制游戏中的关卡流程、敌人行为、动画序列等各种任务。 在资源管理方面,SKFramework 提供了一个灵活的资源管理器,可以帮助开发者更高效地管理游戏中的各种资源。资源管理器支持异步加载资源、资源的实例化和销毁、资源的缓存等功能。开发者可以通过资源管理器来管理游戏中的模型、纹理、音频等资源,提高游戏的加载速度和性能。 在事件处理方面,SKFramework 提供了一个简单而强大的事件系统,可以帮助开发者更方便地处理游戏中的各种事件。事件系统支持事件的订阅和派发,开发者可以通过事件系统来实现游戏中的对象间的通信和交互。通过事件系统,开发者可以实现游戏中的物体碰撞、按键响应、UI界面切换等各种事件处理。 总的来说,Unity SKFramework 提供了一套完整的开发框架,可以帮助开发者更高效、更快速地开发游戏。无论是任务管理、资源管理还是事件处理,SKFramework 都提供了简单而强大的工具和功能,帮助开发者节约时间和精力,提升游戏的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderZ1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值