[Unity]实现血条在角色头顶并随时看向摄像机

方法一:使用Vector3.ProjectOnPlane 

方法原型:Vector3.ProjectOnPlane(Vector3 投影向量,Vector3 投影平面法向量);

返回:Vector3 平面上的投影向量

Vector3.ProjectOnPlane是Vector3提供的一个静态方法,用于计算某个向量在某个平面上的投影向量

那么我们先创建一个需要投影的向量

gameObject.transform.position - Camera.main.transform.position;/*(从摄像机位置指向血条位置)*/

摄像机视野平面法向量

Camera.main.transform.forward;

完成投影:

Vector3 lookPoint = Vector3.ProjectOnPlane(gameObject.transform.position - Camera.main.transform.position, Camera.main.transform.forward);

那么返回结果应是摄像机视野平面上,摄像机位置 指向 血条位置在摄像机视野平面上的投影点的位置(我们想要的结果位置) 的一个向量

那么我们想要的结果位置就应该是:

lookPoint+Camera.main.transform.position

让血条物体动态的看向结果位置

gameObject.transform.LookAt(lookPoint+Camera.main.transform.position);

 //使用  Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量  
       Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
       this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
_ArticleBlood   是血条

方法二:使用单独的UI摄像机渲染UI层

UICamera 设置 使用参考

Unity使用UICamera的分享和经验总结 - 知乎

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class ArticleBlood : MonoBehaviour
{
    [SerializeField]
    private Transform _ArticleBlood;//血条

    [SerializeField]
    private Camera _UICamera;//UI摄像机
    [SerializeField]
    private Camera _MainCamera;//主相机
    [SerializeField]
    private Transform _targetPos;//头顶位置
    void Update()
    {
       
       //使用  Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量  
       // Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
       // this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
       
       //使用UI摄像机单独渲染UI
       // 第二行: m_Target.position为角色头顶的位置,即将血条要显示的位置转换成相机中的观看的位置,第三个方向z用于表示目标点与相机之间的距离
       // 第三行:因为血条是属于UI层级,主摄像机无法观察到,所以需要将视口坐标转化成UI摄像机能看到的世界坐标。
       if(this._MainCamera==null||this._UICamera==null||this._targetPos==null)return;
       Vector3 pos = this._MainCamera.WorldToViewportPoint(this._targetPos.transform.position);
       Vector3 uipos = this._UICamera.ViewportToWorldPoint(pos);
       this._ArticleBlood.transform.position = uipos;
    }
}

效果:

第三种方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LookAtTheCamera : MonoBehaviour
{
    [SerializeField] private GameObject _gameObject;
    private Camera _camera;
    void Start()
    {
        _camera=Camera.main;
    }
    void Update()
    {
        _gameObject.transform.rotation = Quaternion.LookRotation(_camera.transform.forward);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46472622/article/details/124585870