My First RPG Game总结三

来源:互联网 发布:石油进口数据 编辑:程序博客网 时间:2024/06/07 02:02

背包最好不要把属性的勾勾去掉

这样的话你点一下背包按钮,在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;每次视野更改五个单位即可

0 0
原创粉丝点击