首先创建一个新项目
首先创建一个Canvas
接着创建一个画布
调节画布大小
创建一个按钮
改名为关闭背包,设置锚点为右上角,初始位置xyz设置为0
添加关闭功能
修改Panel名字为背包
将背包拖拽至功能绑定框
选择
ctrl+d再创建一个打开背包
层级显示
设置打开背包的锚点
将打开背包设置成1
运行即可实现 开关背包了
接下来在背包下创建Panel
将Panel改名为背包拖拽式滑动面板
再ctrl + d复制两个Panel
层级拖拽
修改名字
对背包拖拽式滑动面板添加组件Scroll Rect
取消横项控制
添加Mask
对背包父物体添加Grid L Group
新建Picture文件包,将图片移至Picture包中,修改贴图为精灵
绑定对象框
调节透明精度
其属性面板
设置方块大小,使ctrl + d顺序排列没有缝隙
对背包父物体添加 Content Size Fitter
调节布局
将背包父物体拖拽至 背包拖拽式滑动面板 右侧属性栏Scroll Rect 绑定框中
运行即可拖动物品栏
给背包对象添加一个空物体
点击隐藏
作为大概预制体类的东西
给背包添加一段代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pack : MonoBehaviour
{
public Transform 背包父物体;
public GameObject 背包对象;
public List<GameObject> 所有背包对象 = new List<GameObject>();
public int 背包格子数量 = 98;
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].SetActive(true);
}
}
private GameObject Instanttiate(GameObject 背包对象, Transform 背包父物体)
{
throw new NotImplementedException();
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
}
}
将Pack代码绑定在背包对象上
添加绑定
给背包对象添加一个Panel用来贴图,
删除掉GameObject
从网上档下一个钥匙贴图设置为精灵
将贴图放在属性面板绑定框上
再创建一个Panel
修改名字为背景,
修改另一个为物品,
将背包的Image复制
粘贴到背景上
再将背包Image透明度改为0
调节物品,背景和背包对象属性,让钥匙显示出来
创建一个c#脚本 PackDx
将以下代码复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PackDx : MonoBehaviour
{
public GameObject 物品美术;
public bool 是否放置物品;
private void Start()
{
}
private void Update()
{
物品美术.SetActive(true);
}
}
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pack : MonoBehaviour
{
public Transform 背包父物体;
public PackDx 背包对象;
public List<PackDx> 所有背包对象 = new List<PackDx>();
public int 背包格子数量 = 98;
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
throw new NotImplementedException();
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
}
}
将背包对象隐藏
将PackDx代码绑定在背包对象身上,并且将物品美术 绑定在 右侧脚本框内
然后将背包对象 拖拽至 背包 右侧属性绑定框中,
下载物品贴图
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无=0,药水,剑
}
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 98;
public List<物体类型> 背包已经防止的物品类型 = new List<物体类型> ();
public List<int> 背包放置物品数量 = new List<int> ();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
throw new NotImplementedException();
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
}
}
修改PackDx代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PackDx : MonoBehaviour
{
public GameObject 物品美术;
public bool 是否放置物品;
public Pack.物体类型 这个背包的物品类型;
public int 背包放置数量 = 0;
public Image 贴图显示;
public Sprite[] 物品贴图;
private void Start()
{
}
private void Update()
{
物品美术.SetActive(true);
贴图显示.sprite = 物品贴图[(int)这个背包的物品类型];
}
}
点击 背包对象 右侧代码 贴图显示 上添加 以上道具
将物品美术 放置 贴图上
修改PackDx代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PackDx : MonoBehaviour
{
public Image 物品美术;
public bool 是否放置物品;
public Pack.物体类型 这个背包的物品类型;
public int 背包放置数量 = 0;
public Sprite[] 物品贴图;
private void Start()
{
}
private void Update()
{
物品美术.gameObject.SetActive(是否放置物品);
物品美术.sprite = 物品贴图[(int)这个背包的物品类型];
}
}
最后修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无 = 0, 药水, 剑
}
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 20;
public List<物体类型> 背包已经防止的物品类型 = new List<物体类型>();
public List<int> 背包放置物品数量 = new List<int>();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
背包父物体 = 背包对象.transform.parent;
return 背包对象;
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
}
}
运行即可实现
下面我们做 拾取道具进入背包
首先创建一个Cube
改名为小宝箱
将背包脚本复制并移除
创建一个空物体
改名为背包系统
将复制内容粘贴到组件上
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无 = 0, 药水, 剑
}
public Camera 当前相机;
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 20;
public List<物体类型> 背包已经防止的物品类型 = new List<物体类型>();
public List<int> 背包放置物品数量 = new List<int>();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
背包父物体 = 背包对象.transform.parent;
return 背包对象;
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit ray;
if (Physics.Raycast(当前相机.ScreenPointToRay(Input.mousePosition), out ray))
{
if (ray.collider.GetComponent<PackSQ>())
{
Destroy(ray.collider.gameObject);
}
}
}
}
}
将主摄像机放置右侧绑定框
创建c#脚本 PackSQ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PackSQ : MonoBehaviour
{
public Pack.物体类型 宝箱物品类型;
public int 数量 = 1;
public GameObject 被拾取后的特效;
public float 拾取后特效的持续时间 = 2;
private void Start()
{
}
private void OnDestroy()
{
Destroy(Instantiate(被拾取后的特效), 拾取后特效的持续时间);
}
private void Update()
{
}
}
下载资源作为特效
将特效绑定在 Cube的脚本文件绑定框上
此时运行项目点击Cube就会消失
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无 = 0, 药水, 剑
}
public Camera 当前相机;
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 20;
//public List<物体类型> 背包已经防止的物品类型 = new List<物体类型>();
//public List<int> 背包放置物品数量 = new List<int>();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
背包父物体 = 背包对象.transform.parent;
return 背包对象;
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit ray;
if (Physics.Raycast(当前相机.ScreenPointToRay(Input.mousePosition), out ray))
{
//一个格子里只能装一个
if (ray.collider.GetComponent<PackSQ>())
{
for (int ffor = 0; ffor < 所有背包对象.Count; ffor++)
{
if (所有背包对象[ffor].这个背包的物品类型 == 物体类型.无)
{
所有背包对象[ffor].这个背包的物品类型
= ray.collider.GetComponent<PackSQ>().宝箱物品类型;
所有背包对象[ffor].背包放置数量
= ray.collider.GetComponent<PackSQ>().数量;
}
}
Destroy(ray.collider.gameObject);
}
}
}
}
}
我们设置一下物品类型设置成药水,在我们运行后点击箱子,药水就可以进入背包了
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无 = 0, 药水, 剑
}
public Camera 当前相机;
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 20;
//public List<物体类型> 背包已经防止的物品类型 = new List<物体类型>();
//public List<int> 背包放置物品数量 = new List<int>();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
背包父物体 = 背包对象.transform.parent;
return 背包对象;
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit ray;
if (Physics.Raycast(当前相机.ScreenPointToRay(Input.mousePosition), out ray))
{
//一个格子里只能装一个
if (ray.collider.GetComponent<PackSQ>())
{
if (ray.collider.GetComponent<PackSQ>())
{
for (int ffor = 0; ffor < 所有背包对象.Count; ffor++)
{
if (所有背包对象[ffor].这个背包的物品类型 == 物体类型.无)
{
所有背包对象[ffor].这个背包的物品类型
= ray.collider.GetComponent<PackSQ>().宝箱物品类型;
所有背包对象[ffor].背包放置数量
= ray.collider.GetComponent<PackSQ>().数量;
break;
}
}
}
Destroy(ray.collider.gameObject);
}
}
}
}
}
接下来设置宝物拾取距离
修改Pack代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
public class Pack : MonoBehaviour
{
public enum 物体类型
{
无 = 0, 药水, 剑
}
public Camera 当前相机;
public float 宝物拾取距离 = 30;
public Transform 玩家角色模型;
public Transform 背包父物体;
public PackDx 背包对象;
public int 背包格子数量 = 20;
//public List<物体类型> 背包已经防止的物品类型 = new List<物体类型>();
//public List<int> 背包放置物品数量 = new List<int>();
public List<PackDx> 所有背包对象 = new List<PackDx>();
public void 改变背包格子数量(int _I格子的数量)
{
for (int ffor = 0; ffor < _I格子的数量; ffor++)
{
所有背包对象.Add(Instanttiate(背包对象, 背包父物体));
所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
}
}
private PackDx Instanttiate(PackDx 背包对象, Transform 背包父物体)
{
背包父物体 = 背包对象.transform.parent;
return 背包对象;
}
private void Start()
{
改变背包格子数量(背包格子数量);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit ray;
if (Physics.Raycast(当前相机.ScreenPointToRay(Input.mousePosition), out ray))
{
//一个格子里只能装一个
if (ray.collider.GetComponent<PackSQ>())
{
if (Vector3.Distance(ray.collider.transform.position, 玩家角色模型.position) <= 宝物拾取距离)
{
if (ray.collider.GetComponent<PackSQ>())
{
for (int ffor = 0; ffor < 所有背包对象.Count; ffor++)
{
if (所有背包对象[ffor].这个背包的物品类型 == 物体类型.无)
{
所有背包对象[ffor].这个背包的物品类型
= ray.collider.GetComponent<PackSQ>().宝箱物品类型;
所有背包对象[ffor].背包放置数量
= ray.collider.GetComponent<PackSQ>().数量;
break;
}
}
}
Destroy(ray.collider.gameObject);
}
}
}
}
}
}