游戏的屏幕是有尺寸的,意味着视野的范围就会受到限制,在开发过程中或多或少遇到这种情况,某个怪物在视野范围外但是收到技能攻击也会造成伤害或死亡,针对这种情况,就是这篇要给大家分享的重点,实现视野范围外死亡敌人的分数显示在屏幕内。
本篇使用的例子是使得场景中的物体显示在屏幕内,也可以使用UGUI物体的显示,但是换算方式上刚好相反。
如下脚本,脚本挂在分数物体上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test01 : MonoBehaviour
{
Transform cam;//相机物体
Vector3 pos;
void Start()
{
pos = transform.position;
cam = GameObject.FindWithTag("MainCamera").transform;
}
void Update()
{
Vector3 offset = pos - cam.position;//相对相机的偏移位置
Vector3 camSize = new Vector3(1.51f * (1920f / 1080f) - 0.2f, 1.51f - 0.2f, 0);//相机的宽度和高度的一半尺寸,这里假设相机的高度一半为1.51
camSize = camSize - new Vector3(0.2f, 0.2f, 0);//在坐标在屏幕外时,让自己在屏幕内离边缘一段距离0.2
//判断是在屏幕内还是屏幕外
bool isInCam = (Mathf.Abs(offset.x) < camSize.x) && (Mathf.Abs(offset.y) < camSize.y);
//如果是在屏幕内,那么坐标位置等于自己的坐标位置
//如果是在屏幕外,那么坐标位置在屏幕边缘
if (isInCam)
{
transform.position = pos;
}
else
{
float x = pos.x;
if (Mathf.Abs(offset.x) > camSize.x) x = Mathf.Sign(offset.x) * camSize.x + cam.position.x;
//x = x + -Mathf.Sign(offset.x) * 0.2f;
float y = pos.y;
if (Mathf.Abs(offset.y) > camSize.y) y = Mathf.Sign(offset.y) * camSize.y + cam.position.y;
//y = y + -Mathf.Sign(offset.y) * 0.2f;
transform.position = new Vector3(x, y, 0);
}
}
//判断是在屏幕内还是屏幕外
//如果是在屏幕内,那么坐标位置等于自己的坐标位置
//如果是在屏幕外,那么坐标位置在屏幕边缘
private void OnDrawGizmos()
{
//Gizmos.color = Color.red;
//float x = 1920f / 1080f;
//Gizmos.DrawCube(transform.position, new Vector3(1.51f * (1920f / 1080f), 1.51f, 0) * 2);
}
}