Unity实现接口类的例子

举报
心疼你的一切 发表于 2024/12/13 17:18:07 2024/12/13
【摘要】 👉前言假设在一个游戏世界里,有不同类型的可交互物体,比如门(Door)和宝箱(Chest),当玩家靠近并按下交互键时,它们会执行各自特定的交互行为。我们通过定义一个接口来规范这些可交互物体的交互行为,然后让具体的物体类去实现该接口。博客将会介绍抽象类的方法。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。欢迎点赞评...

👉前言

假设在一个游戏世界里,有不同类型的可交互物体,比如门(Door)和宝箱(Chest),当玩家靠近并按下交互键时,它们会执行各自特定的交互行为。我们通过定义一个接口来规范这些可交互物体的交互行为,然后让具体的物体类去实现该接口。


👉二、使用步骤

👉2-1、创建接口

首先创建接口 IInteractable(定义可交互对象的交互行为规范),创建一个带参数的一个不带参数的
代码如下:

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

// 定义可交互接口,规定了Interact方法,所有实现该接口的类都要实现此方法来定义具体交互行为
public interface IInteractable 
{
    //不带参数的接口
    void Interact();
    //带参数的接口
    void Interact(int intSpeed);
}

👉2-2、创建具体的可交互物体类 Door(门,实现 IInteractable 接口)

代码如下:

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

public class Door : MonoBehaviour,IInteractable
{
    public bool isOpen = false;
    public Animator animator; // 假设门有对应的动画组件来控制开关动画

    public void Interact()
    {
        isOpen = !isOpen;
        //animator.SetBool("IsOpen", isOpen);
        Debug.Log("门 " + (isOpen ? "已打开" : "已关闭"));
    }

    void IInteractable.Interact(int intSpeed)
    {
        if (intSpeed > 5)
        {
            isOpen = true;
            //animator.SetBool("IsOpen", isOpen);
            Debug.Log("门被大力推开,已打开");
        }
        else
        {
            if (!isOpen)
            {
                isOpen = true;
                //animator.SetBool("IsOpen", isOpen);
                Debug.Log("门被轻轻推开,已打开");
            }
            else
            {
                Debug.Log("门已经是打开的了");
                isOpen = false;
            }
        }
    
}
}


👉2-3、创建另一个具体的可交互物体类 Chest(宝箱,同样实现 IInteractable 接口)

代码如下:

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

public class Chest : MonoBehaviour,IInteractable
{
    public bool isOpened = false;
    public GameObject[] items; // 假设宝箱里存放着一些物品的游戏对象,这里简单用数组表示

    public void Interact()
    {
        if (!isOpened)
        {
            isOpened = true;
            Debug.Log("宝箱已打开,获得物品:");
            foreach (var item in items)
            {
                // 这里可以添加实际获取物品的逻辑,比如添加到玩家背包等,简单示例只打印
                Debug.Log(item.name);
            }
        }
        else
        {
            Debug.Log("宝箱已经是空的了");
            isOpened = false;
        }
    }

    void IInteractable.Interact(int intSpeed)
    {
        if (!isOpened)
        {
            isOpened = true;
            if (intSpeed > 3)
            {
                Debug.Log("宝箱被暴力打开,获得所有物品:");
            }
            else
            {
                Debug.Log("宝箱被小心打开,获得部分物品:");
            }
            foreach (var item in items)
            {
                // 这里可以添加实际获取物品的逻辑,比如添加到玩家背包等,简单示例只打印
                Debug.Log(item.name);
            }
        }
        else
        {
            Debug.Log("宝箱已经是空的了");
            isOpened = false;
        }
    }
}

👉三、应用

新建TestInteractables.cs脚本
脚本挂到相机上面即可
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//脚本挂到相机上 实现射线交互
public class TestInteractables : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown (0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 500f))
            {
                IInteractable interactable = hit.collider.GetComponent<IInteractable>();
                if (interactable != null)
                {
                    interactable.Interact();
                    
                }
            }
        }
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 500f))
            {
                IInteractable interactable = hit.collider.GetComponent<IInteractable>();
                if (interactable != null)
                {
                    interactable.Interact(10);
                   
                }
            }
        }
        if (Input.GetKeyDown (KeyCode.E))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 500f))
            {
                IInteractable interactable = hit.collider.GetComponent<IInteractable>();
                if (interactable != null)
                {
                    interactable.Interact(1);

                }
            }
        }
    }
}

运行测试即可

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。