接着 “T06_unity人物子物体动画 (钥匙+背包+旋转门) c#”教程,保存场景,起名为
接下来我们的要做的事情是:三把钥匙对应三扇门 一对一才能打开
首先创建一个UI画布
选择画布面板的Render Mode 选择点击 World Space后即可调整画布属性
之后创建UI文本
依次ctrl + d 修改位置坐标 布置场景如下
将背包代码复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bag : MonoBehaviour
{
public List
private void Start()
{
}
}
将KeyTrigger代码复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class KeyTrigger : MonoBehaviour
{
public bool isNear = false; //玩家是否在门附近 要设置成public否则看不到
//public UnityEvent pickUpItemEvent; //拾取道具组件
public GameObject bagObj; //背包物体
public int keyID; //钥匙编号
private void Start()
{
if (bagObj == null)
Debug.LogError("请将背包物体拽入参数栏");
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.E)&& isNear)
{
//if(pickUpItemEvent != null)
//pickUpItemEvent.Invoke();
if (bagObj != null)
{
if (bagObj.GetComponent
bagObj.GetComponent
}
Destroy(gameObject); //自杀
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
isNear = true;
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
isNear = false;
GetComponent
}
}
}
将钥匙对象挂在KeyTrigger代码 填充 bag对象 + 钥匙编号
运行项目这样 点击背包就 显示 吃到的钥匙
将UI图像放在门的子物体下
将OpenDoorByE脚本复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class OpenDoorByE : MonoBehaviour
{
public GameObject bagObj; //背包物体
public bool isNear = false; //玩家是否在门附近 要设置成public否则看不到
[SerializeField]
private int keyID; //开本门的钥匙编号
private Transform player;
public Text infoText; //UI信息
private void Start()
{
if (infoText == null)
{
infoText = transform.Find("Canvas/DoorID").GetComponent
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
if (isNear)
{
//判断玩家身上是否有对应编号的钥匙
if (player != null)
{
//获取背包物体
Transform bagObj = player.Find("EthanSkeleton/EthanHips/EthanSpine/EthanSpinel/EthanSpine2/Bag");
}
if (bagObj != null)
{
if(bagObj.GetComponent
{
//遍历对应钥匙的编号是否存在
foreach (int itemID in bagObj.GetComponent
{
//找到对应编号
if (keyID == itemID)
{
GetComponent
//使用即扔
bagObj.GetComponent
break;
}
else
{
//print("请在UI上显示钥匙错误");
if (infoText != null)
infoText.text = "钥匙错误";
}
}
}
}
}
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
isNear = true;
player = other.transform; //动态获取玩家
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
isNear = false;
GetComponent
player = null;
}
}
}
将 OpenDoorByE代码绑定在ChildDoor1001,ChildDoor1002,ChildDoor1003上
并填充Bag对象,DoorID文本对象,Key ID具体号码
如图下
命名三把对应钥匙
运行走到钥匙附近,按E键 吃到钥匙可以在Bag处查看
此时我们拾取的钥匙是1001
当走到门附近 is Near 就会被打开对勾
如果是对应编号的门,按E键即可开门
如果跑到不是对应钥匙的门编号处
按E键后,会显示错误
接下来我们做背包系统,创建一个UI画布
这次选择的不是 World Space 世界空间 而是 Screen Space 屏幕空间
在画布下创建一个UI图像
起名为UI_Key1001
创建一个picture文件夹存储图片
将图片拖拽至picture中
必须:将图片属性调制成Sprite(2D and UI)
将图片拖拽至Source Image 中
调节瞄点至左下角
我们在Game视图中能看到,通过瞄点在Game视图中存放
ctrl + d复制三把钥匙并且修改新增两个的y坐标
点击Inspector窗口下左上角对勾 是否显示
先给他隐藏起来
给canvals起一个名字 ItemUI
将以下代码复制Bag脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Bag : MonoBehaviour
{
public List
public GameObject[] itemUIArray; //UI数组
public int GetItemIndex(int itemId)
{
return itemList.IndexOf(itemId);
}
private void Awake()
{
//itemList = new List
//ToDo1:查找道具列表父物体,获取其子物体数量,给数组开辟内存
var itemUI = GameObject.Find("ItemUI").transform;
if (itemUI != null)
{
itemUIArray = new GameObject[itemUI.childCount];
}
//ToDo2:将所有子物体存储到数组中
for (int i = 0; i < itemUIArray.Length; i++)
{
itemUIArray[i] = itemUI.GetChild(i).gameObject;
}
}
IEnumerator UpdateUIByTime(float time,bool isActive)
{
while (true)
{
if (itemList.Count == 0)
yield return null;
//遍历道具列表,刷新UI
for (int i = 0; i < itemList.Count; i++)
{
//if (itemUIArray[i].activeSelf && itemList[i] != null)
//{
// 如果道具未被使用且不是钥匙道具,则刷新 UI 图片
itemUIArray[i].SetActive(isActive);
//}
}
yield return new WaitForSeconds(time);
}
}
private void Start()
{
StartCoroutine(UpdateUIByTime(1f,true)); //启动
StartCoroutine(UpdateUIByTime(0.9f, false));
}
public void UseItem(int itemId)
{
int itemIndex = GetItemIndex(itemId); // 获取道具在道具列表中的索引
if (itemIndex != -1) // 如果存在道具
{
if (itemId == 1) // 如果是钥匙道具
{
// 钥匙道具的 UI 图像消失
itemUIArray[itemIndex].SetActive(false);
}
itemList.RemoveAt(itemIndex); // 移除道具
Destroy(itemUIArray[itemIndex]); // 销毁 UI 图像
}
}