您的位置:首页 > 产品设计 > UI/UE

UGUI 之 制作敌人不在摄像机视口的UI方向提示(或检测物体在不在摄像机渲染范围内)(四)

2016-06-30 15:02 543 查看
[csharp] view
plain copy

 print?





这篇文章用来处理物体在不在视口范围内的问题,也就是在不在摄像机渲染的视椎体范围内,并且用一个方向的图片在UI上来进行提示(腾讯的全民突击就有用到)  

[csharp] view
plain copy

 print?





一、源代码  

[csharp] view
plain copy

 print?





<pre name="code" class="csharp">/// <summary>  

/// 时间:2014-4-14  

/// 作者:GWL  

/// 描述:对不在视野内的敌人导航提示  

/// </summary>  

using UnityEngine;  

using System.Collections;  

  

public class EnemyDirectTip : MonoBehaviour {  

  

    public GameObject enemyDirectUI;  

    float moveSpeed = 5;  

      

    // Update is called once per frame  

    void Update () {  

        //输入控制测试  

        if (Input.GetKey (KeyCode.A))  

            transform.Translate (Vector3.left * Time.deltaTime * moveSpeed);  

        if (Input.GetKey (KeyCode.D))  

            transform.Translate (Vector3.right * Time.deltaTime * moveSpeed);  

        if (Input.GetKey (KeyCode.W))  

            transform.Translate (Vector3.up * Time.deltaTime * moveSpeed);  

        if (Input.GetKey (KeyCode.S))  

            transform.Translate (Vector3.down * Time.deltaTime * moveSpeed);  

  

        CheckUpInSight ();  

    }  

    /// <summary>  

    /// 逻辑思路:利用窗口坐标系(或视口坐标系)来及时检测敌人是否在摄像机的渲染范围内  

    ///   unity窗口坐标系  

    ///(0,1)| y  

    ///     |  

    ///     |  

    ///     |  

    ///     |              x  

    /// (0,0)-------------- (1,0)  

    /// </summary>  

    void CheckUpInSight(){  

        Vector3 viewVec = Camera.main.WorldToViewportPoint (transform.position);  

        if (viewVec.x < 1 && viewVec.x > 0 && viewVec.y < 1 && viewVec.y > 0) {  

            enemyDirectUI.SetActive (false);  

        } else {  

            enemyDirectUI.SetActive (true);  

            Vector3 newViewVec = new Vector3 ();  

            newViewVec.y = viewVec.y;  

            if(viewVec.x > 1){  

                newViewVec.x = 0.95f;  

                enemyDirectUI.transform.rotation = Quaternion.Euler(new Vector3(0,0,0));  

                  

            }  

            if(viewVec.x < 0){  

                newViewVec.x = 0.05f;  

                enemyDirectUI.transform.rotation = Quaternion.Euler(new Vector3(0,0,180));  

            }  

            enemyDirectUI.transform.position = Camera.main.ViewportToScreenPoint(newViewVec);  

        }  

    }  

}  



二、截图

1、在视野范围内



2、超出视野范围,在左边



3、超出视野范围在屏幕右边

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: