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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DAGUNIANGZHOU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值