版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}