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

接着 “T06_unity人物子物体动画 (钥匙+背包+旋转门) c#”教程,保存场景,起名为T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第1张图片

接下来我们的要做的事情是:三把钥匙对应三扇门 一对一才能打开

首先创建一个UI画布

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第2张图片 选择画布面板的Render Mode 选择点击 World Space后即可调整画布属性

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第3张图片

之后创建UI文本

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第4张图片 而后调整文本属性

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第5张图片

 依次ctrl + d 修改位置坐标 布置场景如下

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第6张图片

 将背包代码复制

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

public class Bag : MonoBehaviour
{
    public List itemList = new List(); //道具列表
    private void Start()
    {
        
    }
}
T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第7张图片

 将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() != null)
                    bagObj.GetComponent().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().SetBool("isOpen", false); //关门
        }
    }
}
T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第8张图片

 将钥匙对象挂在KeyTrigger代码 填充 bag对象 + 钥匙编号

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第9张图片

 运行项目这样 点击背包就 显示 吃到的钥匙

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第10张图片

将UI图像放在门的子物体下

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第11张图片

 将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() != null)
                    {
                        //遍历对应钥匙的编号是否存在
                        foreach (int itemID in bagObj.GetComponent().itemList)
                        {
                            //找到对应编号
                            if (keyID == itemID)
                            {
                                GetComponent().SetBool("isOpen", true);
                                //使用即扔
                                bagObj.GetComponent().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().SetBool("isOpen", false); //关门
            player = null;
        }
    }
}
T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第12张图片

将 OpenDoorByE代码绑定在ChildDoor1001,ChildDoor1002,ChildDoor1003上

并填充Bag对象,DoorID文本对象,Key ID具体号码

如图下

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第13张图片

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第14张图片

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第15张图片

命名三把对应钥匙

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第16张图片

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第17张图片

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第18张图片

运行走到钥匙附近,按E键 吃到钥匙可以在Bag处查看

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第19张图片

此时我们拾取的钥匙是1001

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第20张图片

当走到门附近 is Near 就会被打开对勾

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第21张图片

如果是对应编号的门,按E键即可开门

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第22张图片

 如果跑到不是对应钥匙的门编号处

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第23张图片

按E键后,会显示错误

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第24张图片

接下来我们做背包系统,创建一个UI画布

 这次选择的不是 World Space 世界空间 而是 Screen Space 屏幕空间

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第25张图片

 在画布下创建一个UI图像

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第26张图片

 起名为UI_Key1001

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第27张图片

 创建一个picture文件夹存储图片

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第28张图片

将图片拖拽至picture中

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第29张图片

必须:将图片属性调制成Sprite(2D and UI)

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第30张图片 点击Apply 应用

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第31张图片

将图片拖拽至Source Image 中

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第32张图片

调节瞄点至左下角

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第33张图片 

我们在Game视图中能看到,通过瞄点在Game视图中存放

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第34张图片 

ctrl + d复制三把钥匙并且修改新增两个的y坐标

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第35张图片 

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第36张图片 

点击Inspector窗口下左上角对勾 是否显示

 

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第37张图片

先给他隐藏起来

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第38张图片 

给canvals起一个名字 ItemUI

T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第39张图片 

 将以下代码复制Bag脚本

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

public class Bag : MonoBehaviour
{
    public List itemList = new 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 图像
        }

    }

}
T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第40张图片

运行即可完成T06_unity人物子物体动画 (钥匙+背包+三扇门) c#_第41张图片 

 

你可能感兴趣的:(unity,c#,游戏引擎)