本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程。增加了Asset Bundle+ILRuntime热更新技术流程。
在Unity 3D模型展示专栏中自由观察物体使用的第三方脚本实现,这篇文章使用Unity为开发者提供专业的虚拟摄像机插件Cinemachine
,虚拟摄像机可以实现电影级别的分镜,推拉式镜头等,需要2017以上的版本才能使用,配合TimeLine
一起使用和Animator
可以做些项目漫游、案例展示、行业工作标准流程演示等。
下面这个就是Cinemachine
结合TimeLine
做的案例
斜切进刀场景模拟
本篇文章只涉及其中一个虚拟摄像机cinemachineFreeLook
的使用,首先需要在PackageManager中搜索并安装Cinemachine
包
在搜索框中搜索 Cinemachine进行安装即可。
安装之后,创建cinemachineFreeLook
虚拟摄像机,并命名为CMFreeLook
。
在Main Camera
下增加一个名为CinemachineBrain
组件,相当于虚拟相机的总管理。这里使用默认参数即可。
CMFreeLook
组件参数进行如下设置。来调整观察的最佳位置
调整过程是运行时不断进行修正的…,调整上中下轨道范围。能够完美的从不同角度观察物体。
重点来了,如果是观察的物体提前创建好可以进行提前设置LookAt
、Follow
以及Middle Rig
等参数,由于本项目是动态创建的观察物体,所以需要使用脚本进行设置修改MyGameManager
以上参数在此脚本中进行设置。
public class MyGameManager : MonoBehaviour
{
public GameObject parentObj;
public CinemachineFreeLook camera;
// Start is called before the first frame update
void Start()
{
var tempGB = ResMgr.GetInstance().Load<GameObject>("Prefabs/Switch");
tempGB.transform.SetParent(parentObj.transform);
tempGB.name = "Switch";
camera.LookAt = tempGB.transform;
camera.Follow = tempGB.transform;
tempGB.transform.position = new Vector3(5f, 0f, 50f);
camera.GetRig(1).LookAt = tempGB.transform;
}
}
说明:关于 camera.GetRig(1).LookAt
GetRig是个数组索引值分别对应下面参数 GetRig(1)
是对Middle Rig
进行设置。
注意:cinemachineFreeLook
默认是鼠标左键控制视角的,在此项目中用起来非常不便。所以需要使用脚本改变控制方式。
CMFreelookOnlyWhenRightMouseDown
脚本内容:鼠标右键控制视角,鼠标滚轮控制焦距。
public class CMFreelookOnlyWhenRightMouseDown : MonoBehaviour
{
private CinemachineFreeLook cinemachineFreeLook;
// Start is called before the first frame update
void Start()
{
cinemachineFreeLook = GetComponent<CinemachineFreeLook>();
CinemachineCore.GetInputAxis = GetAxisCustom;
}
public float GetAxisCustom(string axisName)
{
if (axisName == "Mouse X")
{
if (Input.GetMouseButton(1))
{
return UnityEngine.Input.GetAxis("Mouse X");
}
else
{
return 0;
}
}
else if (axisName == "Mouse Y")
{
if (Input.GetMouseButton(1))
{
return UnityEngine.Input.GetAxis("Mouse Y");
}
else
{
return 0;
}
}
return UnityEngine.Input.GetAxis(axisName);
}
// Update is called once per frame
void FixedUpdate()
{
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
if (cinemachineFreeLook.m_Lens.FieldOfView <= 62)
{
cinemachineFreeLook.m_Lens.FieldOfView += 0.5f;
}
//cinemachineFreeLook.m_Lens.OrthographicSize
}
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
if (cinemachineFreeLook.m_Lens.FieldOfView >= 4)
{
cinemachineFreeLook.m_Lens.FieldOfView -= 0.5f;
}
}
}
}
将其挂载到CMFreeLook
上。
效果展示