Unity实现接口类的例子
【摘要】 👉前言假设在一个游戏世界里,有不同类型的可交互物体,比如门(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)