Unity中让物品对象一直面向主相机(第一人称)
引言
在AR中,考虑到虚拟的对象需要跟用户做交互,一般情况下让他始终面向用户是比较直观的,而且这部分的代码可以比较独立,所以就单独拿出来作为一个内容。一个脚本可以看作是物品的一个属性。因此只要想让新建的物品一直面向用户的话,就直接挂上这个脚本的就可以。
操作
新建一个脚本,命名为“FaceToUser”,然后把下面的代码复制进去就可以。
之后把脚本挂在相应的物品上就可以。
最后是能使主相机实现角色漫游的功能才能比较好的体验到这个效果,角色漫游看另外一篇文章Unity 初入(一)
在面板上可以选择是否对方向取反
代码
备注:宿主:脚本挂的对象
/*
* @Author: Shi Chunyuan
* @LastEditors: Lance
* @Description:使宿主一直面向主相机的位置(用户第一人称视角),脚本所挂的对象称为宿主
* @Date: 2020-8-6
* @Modify:
* @QQ:261983626
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FaceToUser : MonoBehaviour
{
// public int GraspModel = 0;
// Start is called before the first frame update
Transform m_cam_main_Transform; // 定义个transform变量
public Vector3 m_Rot; // 脚本宿主的旋转角变量,最后会传递给宿主
public Vector3 m_Positon;// 宿主的位置
public Vector3 m_cam_Rot; // 主相机的旋转角
public Vector3 m_Cam_Positon; //主相机的位置
public bool reverse = false;
/// <summary>
/// 初始化的时候就使宿主面向用户
/// </summary>
void Start()
{
m_cam_main_Transform = Camera.main.transform; //获得主相机的属性
m_Cam_Positon = m_cam_main_Transform.position;//获得主相机的位置
m_Positon = this.transform.position;//获得宿主的位置
Vector3 Dire = m_Cam_Positon - m_Positon; // 求向量,由宿主指向主相机
Dire = Dire.normalized; //标准化,只取向量的方向
if (reverse)
{
Dire = -Dire;
}
m_Rot = Dire; //宿主的方向为向量的方向
this.transform.forward = m_Rot; // 宿主的方向指向主相机
}
// Update is called once per frame
/// <summary>
/// 让宿主保持面向主相机
/// </summary>
void Update()
{
// 和初始化一样
m_Cam_Positon = m_cam_main_Transform.position;
m_Positon = this.transform.position;
Vector3 Dire = m_Cam_Positon - m_Positon;
Dire = Dire.normalized;
if (reverse)
{
Dire = -Dire;
}
m_Rot = Dire;
this.transform.forward = m_Rot; // 宿主的方向指向主相机
}
}
效果图
修改记录
2020年8月6日:原始代码
2020年8月7日:增加反向判断,可以在面板上快速选择是否反向