T06_unity人物子物体动画 (钥匙+背包+三扇门) c#

接着 “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<int> itemList = new List<int>(); //道具列表
    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<Bag>() != null)
                    bagObj.GetComponent<Bag>().itemList.Add(keyID);
            }
            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<Animator>().SetBool("isOpen", false); //关门
        }
    }
}

 将钥匙对象挂在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<Text>();
        }
    }
    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<Bag>() != null)
                    {
                        //遍历对应钥匙的编号是否存在
                        foreach (int itemID in bagObj.GetComponent<Bag>().itemList)
                        {
                            //找到对应编号
                            if (keyID == itemID)
                            {
                                GetComponent<Animator>().SetBool("isOpen", true);
                                //使用即扔
                                bagObj.GetComponent<Bag>().itemList.Remove(itemID);
                                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<Animator>().SetBool("isOpen", false); //关门
            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)

 点击Apply 应用

将图片拖拽至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<int> itemList = new List<int>(); //道具列表
    public GameObject[] itemUIArray; //UI数组


    public int GetItemIndex(int itemId)
    {
        return itemList.IndexOf(itemId);
    }
    private void Awake()
    {
        //itemList = new List<int>(); //申请内存的使用权限
        //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 图像
        }

    }

}

运行即可完成 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值