背包最好不要把属性的勾勾去掉
这样的话你点一下背包按钮,在start方法里面组件就找不到了,而且即使static背包脚本在false也是找不到的
当把鼠标指针移动到物品上面的时候,要显示出物品的信息,首先来做下当鼠标移动到物品上触发事件怎么弄,在prefab的物品上面添加自带的2个脚本trigger和listener
event listener是监听事件的脚本,这个Event Trigger包含了监听的许多方法,如图我们可以看到它包含了许多的监听方法,我们需要其中的两个方法,在item脚本中写指针移动到的方法和指针移出的方法,在属性中,把prefab的item拖动到notify中,mothod选择自己写的方法
这样当指针移动到物品上的时候就可以触发事件了,接着我们要让label显示出物品的信息
像这样,添加一个图片,里面放一个label,指针移动到物品出发方法自动调用ShowDes方法,这个脚本添加给物品说明的背景图片,背景图片下面有个label
public class Inventory_Des : MonoBehaviour {
public static Inventory_Des _instance;
private UILabel label;
private void Awake()
{
_instance = this;
}
private void Start()
{
label = GetComponentInChildren<UILabel>();
}
public void ShowDes(int id)
{
string s = "";
print(id);
ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);
if (info.type == ObjectType.Drug)
{
s += "名称: " + info.name + "\n";
s += "+HP: " + info.hp + "\n";
s += "+MP: " + info.mp + "\n";
s += "出售价: " + info.price_sell + "\n";
s += "购买价: " + info.price_buy;
}
label.text = s;
}
}
如何让物品说明跟随指针呢在ShowDes添加一段代码
transform.position = UICamera.currentCamera.ScreenToWorldPoint(Input.mousePosition);
我们让显示文字的背景控件的pivot成这样
而不能是这样
这样的效果是当指针移动到物品,物品说明的背景就在鼠标指针的右下侧而不是在指针的中间
最后当鼠标指针移出物品的时候让物品说明也关闭,通过setActive方法即可
效果如下:
找组件的时候可以这样来找
speed_plus = GameObject.Find("Status/speed_plus").GetComponent<UISprite>();
注意我们把所有物品的所有资料存在了项目文件夹下的txt文件,但是写入中文的时候中文显示不出来,说明存储的格式不对,我们把该txt格式的文本保存为utf-8格式即可读取中文
下面讲解技能系统的制作:
把所有技能的资料放到txt中,如上一篇教程做一个类SkillsInfo用字典存放
在NGUI中拖放一个Scroll view,先做出一行的效果,给该行添加box collider和UIDrag Scroll View,把该行复制到下面的每一行,在根控件scroll view的属性中moveMent选择vertical,在NGUI拖动一个scroll bar到技能栏的右侧,并把scroll bar拖动到scroll view属性有个scroll bar 的vertical中在scroll bar的属性有个UI slider把value设置为0这样就让它从上往下滑动,然后创建在scroll view中创建一个grid设置grid的arrangement为vertical,cell的高和宽设置为一个条目的宽和高,把所有条目放到grid中
我们在scroll view 上面做一个item,UI做好后拖动到prefab中,在item中写个脚本用来调用SkillsInfo数据显示UI界面,给item添加box collider和UI Drag Scroll View脚本
要实现每个item的动态更新,首先要在item的脚本中拿到每个控件,然后public一个方法,传入每个技能的id,从txt中拿到该id的对应信息并显示,在Skill技能栏添加脚本skill UI来判断角色是什么职业,取到该职业的所有技能id,用list来存储,遍历list的id调用刚才的public方法来显示所有技能的信息,这里面最重要的就是三行代码:
foreach (int id in list)
{
GameObject item =NGUITools.AddChild(grid.gameObject,skillItemPrefab);
grid.AddChild(item.transform);
item.GetComponent<SkillItem>().SetId(id);
}
遍历每个技能,创建prefab中的技能item,父类是grid.gameObject,然后调用item中的方法显示信息
这里注意的是一开始grid里面没有item,所以在SkillItem脚本中找到item的组件使用transform.find方法不能使用Gameobject.find方法,因为Gameobject.find只能找到没有隐藏的对象
如果最后一行报空指针那么要看看给item有没有添加显示id的脚本
然后要把技能图标拖动到技能栏,给技能图片添加box collider,一定要注意把box collider大小设置为图片大小,否则没反应,然后给图片创建一个脚本继承UIDragDropItem,在脚本属性上勾选Clone On Drag,这样在拖拽的时候会克隆一份,而且会发现拖动的时候在Scroll View里面会显示拖动到外面就不显示了
protected override void OnDragDropStart()
{
base.OnDragDropStart();
transform.parent = transform.root;
GetComponent<UISprite>().depth = 50;
}
复写该方法,让图片当前的父物体等于根物体,这里父物体是item,根物体时UI root,设置depth最大,让它显示到最前面,这样图片拖到scroll view外面也可以显示出来了,拖动技能到技能栏中,那么就要复写OnDragDropRelease方法,用tag判断是不是技能栏,同时,给每个技能栏添加脚本:
public enum ShortCutType
{
Drug,
None,
Skill
}
public class ShortCutGrid : MonoBehaviour {
private UISprite sprite;
public ShortCutType type = ShortCutType.None;
private int SkillId;
private void Awake()
{
sprite =transform.Find("Sprite").GetComponentInChildren<UISprite>();
sprite.gameObject.SetActive(false);
}
public void SetShortCut(int id)
{
sprite.gameObject.SetActive(true);
SkillInfo info = SkillsInfo._instance.GetSkillInfoById(id);
sprite.spriteName = info.icon_name;
type = ShortCutType.Skill;
SkillId = id;
}
public void SetInventory(int id)
{
}
}
在每个技能栏当中放一张图片,在每个技能栏的脚本中awake中先setActive图片不显示,
OnDragDropRelease到技能栏后就让图片显示成传入id的图片
效果如下:
接着当打开技能栏的时候如果技能等级大于人物等级,那么就将该技能显示为阴影状态且不能拖动,在每个条目的技能图片再添加一个阴影图片,awake为false,在技能栏框框弹出的函数中加上
SkillItem[] items=GetComponentsInChildren<SkillItem>();
foreach (SkillItem i in items)
{
i.SetMask(grade);
}
通过getComponentsInChildren拿到技能栏中的每一个条目,调用每个条目的方法传入人物等级,该方法判断人物等级和该条目的技能等级哪个大从而setActive阴影图片,并且通过这行代码让图片的拖拽脚本使用或不能使用
skill_bg.GetComponent<SkillItemIcon>().enabled = true;
效果如图:
接下来讲解游侠左上角人物头像的显示:
给player里面添加一个摄像机,在player的Layer里面设置一个player,让子物体全是player,让相机在Camera属性中Culling Mask只渲染player层而且要把游戏中的主相机渲染层改成everything,我们要把当前相机拍摄的弄成texture,在assets中创建一个render texture命名为faceTexture,把它拖动到camera属性的target texture中。在UI root中创建一个simple texture到界面左上角,把faceTexture拖动到simple Texture属性中的Texture中。
要让正方形的人物头像显示成圆形,在assets中创建一个material,属性shader选择导入的资源包的mask,
main Texture选择face Texture,mask texture 选择导入的资源mask,在UI root中将simple texture的texture去掉,material选择刚才的,
注意,添加了2个摄像机可能会出现报错here are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.解决方法是删去一个摄像机的listener即可
给头像添加个圆圈图片效果如下:
给头像添加血条,在prefabToolbar拖个水平滑动条,更改里面组件的背景图片
接着要进行血条和蓝条的动态显示,给Head添加脚本,这个就不赘述了
接着进行小地图的开发:
这个和头像一样步骤,只不过相机是从人物头顶上向下看,看到这个效果,对于npc卖药的人物要在小地图上面显示卖药的图标而不是人物,做法如下:
选择卖药的npc,创建一个quad,把卖药的图标拖到quad中,给quad的layer添加为miniMapSign,让相机不渲染npc渲染MiniMapSign,主相机不渲染MiniMapSign
给小地图添加放大地图和缩小地图功能,
nimiMapCamera = GameObject.FindGameObjectWithTag("MiniMapCamera").GetComponent<Camera>();来得到相机,nimiMapCamera.fieldOfView -= 5;每次视野更改五个单位即可