我们要实现的就是按下鼠标右键,实现武器视角切换,包括相机位置以及相机视角距离的改变。
当按下鼠标右键:
在Hierarchy视口的Weapom_01下新建两个空物体
分别为DufalutPoint和BulletStartPoint,(之前设置了不用再设置)
设置好DufalutPoint和BulletStartPoint的位置
在Ryun_WeaponController脚本中新建:
public Camera maincamera;//新建一个Camera类型的变量,命名为maincamera
public Camera weaponcamera;//新建一个名为weaponcamera的Camera类型的变量
public Vector3 Weaponcameradefaultpoint;//新建一个Weaponcameradefaultpoint(默认相机位置)的三维向量
public Vector3 Weaponcameracenterpoint;//新建一个Weaponcameracenterpoint(移动到中央的相机位置)的三维向量
public float defaultView = 60;//初始视角为60
public float centerView = 30;//拉近视角为30
public float viewlerpratio = 0.2f;//设置这个切换过程的 view lerp ratio = 0.2f
void Start()
{
maincamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
weaponcamera = GameObject.FindGameObjectWithTag("weaponcamera").GetComponent<Camera>();//并在Start方法里写入如下代码,让maincamera、weaponcamera获取对应标签下的相机的Camera组件
}
//继续新建如下代码:
IEnumerator Viewcenter()//实现向中央位置过渡
{
while(weaponcamera.transform.localPosition != Weaponcameracenterpoint)
{
weaponcamera.transform.localPosition = Vector3.Lerp(weaponcamera.transform.localPosition, Weaponcameracenterpoint, viewlerpratio);
weaponcamera.fieldOfView = Mathf.Lerp(weaponcamera.fieldOfView, centerView, viewlerpratio);
maincamera.fieldOfView = Mathf.Lerp(maincamera.fieldOfView, centerView, viewlerpratio);
}
yield return null;
}
IEnumerator Viewdefault()//实现向默认位置过渡
{
while(weaponcamera.transform.localPosition != Weaponcameradefaultpoint)
{
weaponcamera.transform.localPosition = Vector3.Lerp(weaponcamera.transform.localPosition, Weaponcameradefaultpoint , viewlerpratio);
weaponcamera.fieldOfView = Mathf.Lerp(weaponcamera.fieldOfView, defaultView, viewlerpratio);
maincamera.fieldOfView = Mathf.Lerp(maincamera.fieldOfView, defaultView, viewlerpratio);
}
yield return null;
}
private void Viewchange()
{
if (Input.GetMouseButtonDown(1))//当按下鼠标右键
{
StopCoroutine("Viewdefault");//停止上一帧的协程Viewdefault的执行
StartCoroutine("Viewcenter");//调用协程Viewcenter函数
}
if (Input.GetMouseButtonUp(1))//当松开鼠标右键
{
StopCoroutine("Viewcenter");//停止上一帧的协程Viewcenter的执行
StartCoroutine("Viewdefault");/调用协程Viewdefault函数
}
}
//我们要在Update函数里调用该函数,故将其写入进去:
void Update()
{
OpenFire();
Viewchange();
Ray ray = new Ray(bulletstartpoint.position,-bulletstartpoint.forward);//数据类型为Ray类型,射线是一条无限的线,从起源(Ray.origin)开始,朝某方向移动(Ray.direction).
Debug.DrawRay(ray.origin,ray.direction*1000,Color.red );
}
上面有个bulletstartpoint.forward(此为Transform.Forward形式),我们多考虑一些内容:
关于Transform.Forward和Vector3.Forward的正确使用方法
(33条消息) Transform.Forward和Vector3.Forward的正确使用方法_linuxheik的专栏-CSDN博客_transform.forward
注意:当我们播放动画的时候,发现武器并没有跟随相机视角的转换而转换,原来子弹是在maincamera里渲染出来的,我们现在要让子弹由WeaponCamera渲染出来,打开子弹预制体,将Layer改成Weapon即可。
但是这里还有一个细节,那就是射线和准心并未保持一致,我们接下来要做的就是改变子弹发射的初始位置和相机的中心点保持一致,这样渲染出来的结果才准确。
具体做法:<调整枪口和相机的相对位置>
先将整个Player给Unpack一下;
将Weapon_Root放在主相机的下面;
调整好相机视角后,设置Weapon_Root的Y坐标位置和Weapon_01下的bulletstartpoint的Y坐标位置互为相反数。设置主相机的位置坐标为Y坐标为0,那么可以保证相机中心和子弹发射中心以及关联的射线到准心的中心是一致的。
解释:
先不管深度,看xy平面:
MainCamera设置为(0,0,0),Weapon_Root的Y坐标位置和bulletstartpoint的Y坐标位置互为相反数,x坐标都为0,射线是从bulletstartpoint.position发出的,显然能保证中心是一致的
主要逻辑:
IEnumerator Viewcenter()//实现向中央位置过渡
IEnumerator Viewdefault()//实现向默认位置过渡
private void Viewchange()
{
if (Input.GetMouseButtonDown(1))//当按下鼠标右键
{
StopCoroutine("Viewdefault");//停止上一帧的协程Viewdefault的执行
StartCoroutine("Viewcenter");//调用协程Viewcenter函数
}
if (Input.GetMouseButtonUp(1))//当松开鼠标右键
{
StopCoroutine("Viewcenter");//停止上一帧的协程Viewcenter的执行
StartCoroutine("Viewdefault");/调用协程Viewdefault函数
}
}