游戏的屏幕是有尺寸的,意味着视野的范围就会受到限制,在开发过程中或多或少遇到这种情况,某个怪物在视野范围外但是收到技能攻击也会造成伤害或死亡,针对这种情况,就是这篇要给大家分享的重点,实现视野范围外死亡敌人的分数显示在屏幕内。

 

本篇使用的例子是使得场景中的物体显示在屏幕内,也可以使用UGUI物体的显示,但是换算方式上刚好相反。

Unity实现视野范围外死亡敌人的分数显示在屏幕内之美_Unity

如下脚本,脚本挂在分数物体上:

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);
    }
}