【常用】2DUI跟随3D物体移动(待修复)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25601345/article/details/88547899
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UImovePlusSample : MonoBehaviour
{
    /// <summary>
    /// 3D物体
    /// </summary>
    public Transform rectBloodPos;
    public bool actived = false;
    public int btnpos;
    private float distance;
    public bool started = false;

    public void Start()
    {
        //开始时创建对应2d图标。

        rectBloodPos.GetComponent<Button>().onClick.AddListener(SetActiveBool);
        rectBloodPos.transform.GetChild(0).GetComponent<Button>().onClick.AddListener(SetInActiveBool);
        if (gameObject.tag == "Replay")
        {
            Destroy(rectBloodPos.transform.GetChild(0).gameObject);
        }


        //---
        distance = Vector3.Distance(rectBloodPos.transform.position, Camera.main.transform.position);
        //---

        Text[] relist = rectBloodPos.GetComponentsInChildren<Text>(true);

        for (int i = 0; i < relist.Length; i++)
        {
           if(relist[i].transform.parent.name=="Image")
                relist[i].text = gameObject.name;
        } 
            
      
    }



    public bool IsInView(Vector3 worldPos)
     {
         Transform camTransform = Camera.main.transform;
         Vector2 viewPos = Camera.main.WorldToViewportPoint(worldPos);
         Vector3 dir = (worldPos - camTransform.position).normalized;
         float dot = Vector3.Dot(camTransform.forward, dir);//判断物体是否在相机前面
 
         if (dot > 0 && viewPos.x >= 0 && viewPos.x <= 1 && viewPos.y >= 0 && viewPos.y <= 1)
             return true;
         else
             return false;
     }
 
     void Update()
     {
        Vector2 vec2 = Camera.main.WorldToScreenPoint(this.gameObject.transform.position);
 
         if (IsInView(transform.position)) 
         {
            if(!rectBloodPos.gameObject.activeInHierarchy)
             rectBloodPos.gameObject.SetActive (true);
            //rectBloodPos.anchoredPosition = new Vector2(vec2.x - Screen.width / 2 + 0, vec2.y - Screen.height / 2 + 0);
            float newDistance = distance / Vector3.Distance(rectBloodPos.position, Camera.main.transform.position);
            rectBloodPos.GetComponent<Image>().rectTransform.position = vec2;//位置 
            //if(rectBloodPos.GetComponent<Image>().rectTransform.localScale.x<3)
//            rectBloodPos.GetComponent<Image>().rectTransform.localScale = Vector3.one * newDistance*1.5f;


            if (started)
            {
                if ((Vector3.Distance(transform.position, Camera.main.transform.position) < 3.5))
                {
                    actived = true;
                }
                else
                {
                    actived = false;
                }
            }
           //if( rectBloodPos.childCount>0)
            rectBloodPos.GetChild(0).gameObject.SetActive(actived);


        }
         else
             rectBloodPos.gameObject.SetActive (false);


     }

    public void SetActiveBool()
    {
        actived = true;

    }
    public void SetInActiveBool()
    {
        started = false;
        actived = false;

    }

    private void OnMouseDown()
    {
        SetActiveBool();
    }





}

猜你喜欢

转载自blog.csdn.net/qq_25601345/article/details/88547899
今日推荐