首页 > 其他分享 >Unity知识总结系列(二):相机跟随人物的几种方式

Unity知识总结系列(二):相机跟随人物的几种方式

时间:2023-12-27 18:22:36浏览次数:33  
标签:主角 Vector3 transform 几种 相机 Unity v3 position

相机跟随人物的几种方式

1、最简单,无代码,固定距离,固定视角

2、代码控制,固定距离,固定视角,对1进行改进

3、代码控制,固定距离,固定视角,直接移动,不会旋转

4、代码控制,固定距离,固定视角,插值移动(因为Update和LateUpdate刷新率不同,会有抖动现象,不建议使用)

5、代码控制,固定距离,固定视角,平滑阻尼移动

6、代码控制,固定距离,跟随主角视角,平滑阻尼移动,看向主角

7、代码控制,固定距离,平滑的旋转相机,平滑阻尼移动,看向主角

8、代码控制,固定距离,平滑的旋转相机,平滑阻尼移动,看向主角,考虑了有物体遮挡(方法一)

///   <summary> ///  相机进行射线检测,如果检测不到主角, ///  就在起始点与结束点 ( 主角头顶的一个点 ) 之间寻找几个点, ///  直到找到可以看到主角的点 ///   </summary>   9、代码控制,固定距离,平滑的旋转相机,平滑阻尼移动,看向主角,考虑了有物体遮挡(方法二) ///   <summary> ///  从主角发射射线检测相机的位置 ///  检测不到,就把相机移动到,射线的碰撞点的前面 ///   </summary>   10、代码控制,固定距离,平滑的旋转相机,平滑阻尼移动,看向主角,有物体遮挡,结合手游中相机的旋转和复位
using  UnityEngine;
///   <summary>
///  相机进行射线检测,如果检测不到主角,
///  就在起始点与结束点之间寻找几个点,
///  直到找到可以看到主角的点
/// 在游戏中玩家可以用鼠标控制相机的旋转
///   </summary>
public   class   CameraTest2  :  MonoBehaviour
{
     public   Transform  player;     //角色位置信息
     Vector3 []  v3;         //相机自动找寻的位置点
     public   int  num;              //相机临时点的个数
     public   Vector3  start;        //相机开始时的位置
     public   Vector3  end;          //相机没有找到主角时的位置
     Vector3  tagetPostion;        //相机看向的目标点
     Vector3  ve3;                 //平滑阻尼的ref参数
     Quaternion  angel;            //相机看向目标的旋转值
     public   float  speed;          //相机移动速度
     void  Start ()
     {
         //外界赋值数组长度
        v3 =  new   Vector3 [ num ] ;
     }
     void  LateUpdate ()
     {
         //记录相机初始位置
        start = player.position + player.up * 2.0f - player.forward * 3.0f;
         //记录相机最终位置
        end = player.position + player.up * 5.0f;
         //鼠标控制相机的旋转
         if   ( Input .GetMouseButton ( 1 ) )
         {
             //记录相机的初始位置和旋转角度
             Vector3  pos = transform.position;
             Vector3  rot = transform.eulerAngles;
             //让相机绕着指定轴向旋转
            transform.RotateAround ( transform.position,  Vector3 .up,  Input .GetAxis ( "Mouse X" )  * 10 ) ;
            transform.RotateAround ( transform.position,  Vector3 .left, - Input .GetAxis ( "Mouse Y" )  * 10 ) ;
             //限制相机的绕X旋转的角度
             if   ( transform.eulerAngles.x < -60 || transform.eulerAngles.x > 60 )
             {
                transform.position = pos;
                transform.eulerAngles = rot;
             }
             return ;
         }
         //相机目标位置,开始等于初始位置
        tagetPostion = start;
        v3 [ 0 ]  = start;
        v3 [ num - 1 ]  = end;
         //动态获取相机的几个点
         for   ( int  i = 1; i < num; i++ )
         {
            v3 [ i ]  =  Vector3 .Lerp ( start, end, i / num ) ;
         }
         //判断相机在那个点可以看到主角
         for   ( int  i = 0; i < num; i++ )
         {
             if   ( Function ( v3 [ i ] ) )
             {
                tagetPostion = v3 [ i ] ;
                 break ;
             }
             if   ( i == num - 1 )
             {
                tagetPostion = end;
             }
         }
         //主角的移动和看向
        transform.position =  Vector3 .SmoothDamp ( transform.position, tagetPostion,  ref  ve3, 0 ) ;
        angel =  Quaternion .LookRotation ( player.position - tagetPostion ) ;
        transform.rotation =  Quaternion .Slerp ( transform.rotation, angel, speed ) ;
     }
     ///   <summary>
     ///  射线检测,相机是否能照到主角
     ///   </summary>
     ///   <param name=" v3 "> 计算射线发射的方向 </param>
     ///   <returns> 是否检测到 </returns>
     bool  Function ( Vector3  v3 )
     {
         RaycastHit  hit;
         if   ( Physics .Raycast ( v3, player.position - v3,  out  hit ) )
         {
             if   ( hit.collider.tag ==  "Player" )
             {
                 return   true ;
             }
         }
         return   false ;
     }
}

 


方便查阅:

资产: https://blog.csdn.net/qq_26270779/article/details/80227024

标签:主角,Vector3,transform,几种,相机,Unity,v3,position
From: https://www.cnblogs.com/porter/p/17931157.html

相关文章

  • Unity URP 风格化水
    前言笔者曾使用UE实现过一个较为完整的写实水材质系统,但是因为UE的管线是定死的,导致高光无法实现,且后来做笔试题发现关于水的交互还未实现,因此本文将实现一个完整的风格化水,考虑到水的实现部分过多,这里不再使用代码展示,而是使用ASE,原理都差不多管线设置“ShaderType”为“U......
  • unity 射线只检测某个层级
    Hithit;//参数1:射线发射的位置-参数2:射线发射的方向-参数3:射线-参数4:发射的距离-参数5:要检测的层-参数6:重写全局 Physics.queriesHitTriggers 以指定默认情况下查询(射线投射、球形投射、重叠测试等)是否命中触发器。对查询使用Ignore可忽略触发碰撞体。if(Physic......
  • 几种常用的加密方法
    publicstaticvoidmain(String[]args)throwsException{Stringmd5Str=encodeToMD532("helloword");//32位,小写Stringmd532Lower=md5Str.toLowerCase();//32位,大写Stringmd532Upper=md532Lower.toUpperCase......
  • Unity引擎2D游戏开发,有限状态机&抽象类多态
    状态机与抽象类观察如下代码:publicclassAttackFinish:StateMachineBehaviour{//OnStateEnteriscalledwhenatransitionstartsandthestatemachinestartstoevaluatethisstateoverridepublicvoidOnStateEnter(Animatoranimator,AnimatorStateIn......
  • Unity3D Shader在GPU上是如何执行的详解
    前言Unity3D是一款广泛应用于游戏开发的跨平台开发引擎,它提供了丰富的功能和工具来帮助开发者创建高质量的游戏。其中一个重要的功能就是Shader,它可以用来控制对象的渲染效果。在Unity3D中,Shader是在GPU上执行的,那么它是如何工作的呢?本文将详细解释Unity3DShader在GPU上的执行过......
  • PFA试剂瓶进口氟塑料取样瓶有哪几种口径?
    南京瑞尼克厂家生产PFA试剂瓶,目前规格齐全,现货速发。小规格30mL-大规格5L都有30mL、60mL非标准口径100mL有小口和大口250mL、300mL、500mL、1000mL有GL32和GL45两个口径选择2000mL标准GL45口径3000mL、4000mL、5000mL都是大口......
  • Zabbix 监控Dell EMC Unity 480
    Zabbix监控DellEMCUnity4801、使用EMCUnityREST-APIv3,参考https://www.zabbix.com/integrations/emc?linkId=165523208https://github.com/aklyuk/zabbix-emc-unity 2、Zabbix注意事项 unity_get_state.py放入zabbix安装目录的externalscripts文件内,并赋予执行......
  • Unity UGUI开发,0GC更新视图
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!前段时间在优化Unity游戏项目,发现在战斗场景中,UI需要更新大量内容,比如血量、伤害、各种技能效果等等,由于战斗比较激烈,一直在高频更新UI视图,通过UWA深......
  • Unity3D 如何提升游戏运行效率详解
    Unity3D是一款非常强大的游戏引擎,但是在处理复杂场景和大量资源时,游戏运行效率可能会遇到一些问题。本文将详细介绍如何提升Unity3D游戏的运行效率,包括技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术......
  • Unity3D 项目中怎样正确的使用 Lua详解
    在Unity3D游戏开发中,Lua作为一种轻量级的脚本语言,被广泛应用于游戏逻辑的编写和扩展。本文将详细介绍如何正确地在Unity3D项目中使用Lua,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬......