武器视口切换效果

文章描述了在Unity3D中如何通过鼠标右键切换武器视角,涉及创建空物体、调整相机位置、使用Lerp方法平滑过渡视角,以及处理射线和子弹发射点的同步。同时,提到了Transform.Forward的正确使用,并解决武器在视角转换时的同步问题。
摘要由CSDN通过智能技术生成

我们要实现的就是按下鼠标右键,实现武器视角切换,包括相机位置以及相机视角距离的改变。

当按下鼠标右键:

在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即可。

但是这里还有一个细节,那就是射线和准心并未保持一致,我们接下来要做的就是改变子弹发射的初始位置和相机的中心点保持一致,这样渲染出来的结果才准确。

具体做法:<调整枪口和相机的相对位置>

  1. 先将整个Player给Unpack一下;

  1. 将Weapon_Root放在主相机的下面

  1. 调整好相机视角后,设置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函数
   }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嘿君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值