UI在游戏方面的应用

来源:互联网 发布:js女装是什么牌子档次 编辑:程序博客网 时间:2024/06/10 11:31

游戏界面的跳转

第一种方式:

需要扩充命名空间:using UnityEngine.SceneManagement;

加载新的场景:SceneManager.LoadScene("场景名称");

第二种方式:


public void OnStartGame(string sceneName)

{

    Application.LoadLevel(sceneName);

}

第三种方式:


public void OnStartGame(int a)

{

    Application.LoadLevel(a);

}

游戏开发技能图标冷却效果



public Button mButton;//图标

public Image maImage;//遮罩

public Text mText;//技能CD

public const float MAX_CODE_TIME = 3;//技能冷却时间

private float curTime;

void Start()

{

    EndSkill();

    mButton.onClick.AddListener(OnClickSkillBtnEvent);

}

void Update()

{

    if(false == mButton.interactable)

    {

        //表明我们的技能按钮被点击了,这个时候,就需要CD显示和遮罩旋转处理

        //得让我们的Image(Mask)遮罩旋转起来

        if(mImage,fillAmount <= 1f && mImage.fillAmount >=0f)

        {

            //这个时候需要让它旋转

            //Time.deltaTime表示当前帧与上一帧时间的差值(就是做线性插值用的,这样cuiTime变化对遮罩旋转,就不会生硬了)

            curTime += Time.deltaTime;

            //MAX_CODE_TIME - curTime 就是剩下多少冷却时间

            //(MAX_CODE_TIME - curTime) / MAX_CODE_TIME 就是剩下的这个冷却时间 / 总的冷却时间,算出来一个旋转比例,这个比例正好介于0--1之间

            mImage.fillAmount = (MAX_CODE_TIME - curTime) / MAX_CODE_TIME;

            mText.text = Mathf.CeilToInt(MAX_CODE_TIME-curTime).ToString();

            //这个意思是说,当技能CD冷却结束了,就是转圈结束了,我们立即将技能按钮恢复到初始状态

            if(mImage.fillAmount == 0)

            {

                EndSkill();

            }

        }

    }

}

void OnClickSkillBtnEvent()

{

    //单机时,调用这个状态

    StartSkill();

}

void StartSkill()

{

    //开始时,设置fillAmount不可用

    mButton.interactable = false;

    //设置fillAmount开始转圈

    mImage.fillAmount = 1f;

    //设置冷却时间

    mText.text = MAX_CODE_TIME.ToString();

    curTime = 0f;

}

void EndSkill()

{

    //还原StartSkill设置

    mButton.interactable = true;

    mImage.fillAmount = 0f;

    mText.text = string.Empty;

    curTime = 0f;

}

UI——游戏场景加载进度条的实现



public Image mImage;

public Text text;

private AsyncOperation async;

//AsyncOperation跟踪异步操作

private int curProgressValue = 0;

//设置一个计数器

void Start()

{

    StartCoroutine(LoadScene());

    //调用协程

}

IEnumerator LoadScene()

{

    async = SceneManger.LoadSceneAsync("youxi_1");

    //加载异步场景

    async.allowSceneActivation = false;

    //就是加载完(90%)这个youxi_1场景之后呢,我们不让它直接跳转到youxi_1的场景

    yield return async;

}

void Update()

{

    if(async == null)

    {

        return;

    }

    int progressValu = 0;

    if(async.progress < 0.9f)//async.progress介于0--1之间

    {

        progressValu = (int)async.progress * 100;

    }

    else

    {

        progressValu = 100;

    }

    if(curProgressValue < progressValu)

    {

        curProgressValue++;

    }

    text.text = curProgressValue + "%";

    mImage.fillAmount = curProgressValue / 100f;

    if(curProgressValue == 100)

    {

        async.allowSceneActivation = true;

        //curProgressValue == 100时,跳转场景

    }

}

UI——游戏背包的拖拽事件




ShowImage的编写脚本

public Sprite[] sprites;

public  int index = 0;

void Start()

{

    Image img = GetComponent<Image>();

    img.sprite = sprites[index];

}

Drag的编写脚本

需要使用UnityEngine.EventSystems;命名空间

public class Drag:MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler

{

    public GameObject grid;

    GameObject Instead_gameObject;

    public void OnBeginDrag(PointerEventData eventData)

    {

        if(eventData.button == PointerEventData.InputButton.Left)

        //如果当前是按下鼠标左键

        {

            transform.llocalScale = new Vector3(0.5f,0.5f,0.5f);

            //缩放物体

            Instead_gameObject = transform.parent.gameObject;

            //移动物体的父对象

            transform.SetParent(grid.transform,true);

            //指定拖拽图片的父控件

            transform.GetComponent<CanvasGroup>().blocksRaycasts = false;

            //设定它自己不需要碰撞检测

        }        

    }

    public void OnDrag(PointerEventData eventData)

    {

        //正在拖拽事件

        if(eventData.button == PointerEventData.InputButton.Left)

        //如果当时是按下鼠标左键

        {

            GetComponent<RectTransform>().pivot.Set(0,0);

            //调整原点

            transform.position = Input.mousePosition;

            //让物体随着鼠标移动

        }

    }

    public void OnEndDrag(PointerEventData eventData)

    //拖拽结束事件

    {

        if(eventData.button == PointerEventData.InputButton.Left)

        {

            transform.localScale = new Vector3(1f,1f,1f);

            //还原物体的大小

            if(eventData.pointerCurrentRaycast.gameObject != null && eventData.pointerCurrentRaycast.gameObject.tag == "cell")

            //如果松开鼠标时下面有物体并且这个物体的名字叫cell

            {

                transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);

                //把拖拽物体放到碰到的物体上

            }

            else if(eventData.pointerCurrentRaycast.gameObject != null && eventData.pointerCurrentRaycast.gameObject.tag == "item")

            {

                Transform transform_A = eventData.pointerCurrentRaycast.gameObject.transform;

                //记下放到的物体

                Transform transfomr_B _parent = transform_A.parent.transform;

                //得到它的父物体

                transform_A.SetParent(Instead_gameObject.transform,true);

                //把拖拽的物体放到它里面

                transform_A.localPosition = Vector3.zero;

                //还原位置为0

                transform.SetParent(transform_B_parent);

                /把另外的物体放过去

            }

            else//如果没有碰到空的单元或物体

            {

                transform.SetParent(Instead_gameObject.transform,true);

                //把拖拽物品放回

            }

            transform.localPosition = Vector3.zero;

            //还原位置

            transform.GetComponent<CanvasGroup>().blocksRaycasts = true;

            //设定它可以碰撞检测

        }

    }

}

MouseEvent的编写脚本

需要使用UnityEngine.EventSystems;命名空间

public class MouseEvent:MonoBehaviour,IPointerEnterHandler,IPointerExitHandler

{

    public void OnPointerEnter(PointerEventData eventData)

    {

        print("this is Enter");

    }

    public void OnPoitnerExit(PointerEventData eventData)

    {

        print("this is Exit");

    }

}

0 0
原创粉丝点击