方法一:使用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 设置 使用参考
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);
}
}