unity3d 视角变化_unity 3d视角 - CSDN
精华内容
参与话题
  • unity3d 平滑切换视角

    千次阅读 2018-01-19 00:31:34
    实现从A到B的平滑视角切换(第三人称视角 和 射击视角 的切换) public class PlayerShooting : MonoBehaviour { private float CD = 0.5f; private float atTime = 0; // 将要到达的时间 Animator animator; ...

    实现从A到B的平滑视角切换(第三人称视角 和 射击视角 的切换)

    public class PlayerShooting : MonoBehaviour
    {
    
        private float CD = 0.5f;
        private float atTime = 0;       // 将要到达的时间
    
        Animator animator;
        GameObject m_camera;  // 主相机的位置角度
        GameObject s_camera;  // 枪视角相机的位置角度
        GameObject pre_came;  // 之前的相机位置角度
        GameObject gun;
    
        // Use this for initialization
        void Awake()
        {
            animator = GetComponent<Animator>();
            m_camera = GameObject.Find("Main Camera");
            pre_came = GameObject.Find("Pre Camera");
    
            GameObject root = GameObject.Find("Female");
            s_camera = root.transform.Find("Shoot Camera").gameObject;
            gun = GameObject.FindGameObjectWithTag("Gun");
        }
    
        // Update is called once per frame
        void Update()
        {
            // 按下开火键
            if (Input.GetKey(KeyCode.F) && Time.time > atTime)
            {
                atTime = Time.time + CD;
                animator.SetBool("GunIdle", !GameManager.instance.isFireMode);
                GameManager.instance.isFireMode = !GameManager.instance.isFireMode;
            }
    
            // 移动摄像机 (平滑移动的关键 Vector3.MoveTowards  Quaternion.Slerp)
            if (GameManager.instance.isFireMode)
            {
                Vector3 targetCamPos = s_camera.transform.position;
                Quaternion targetCamRot = s_camera.transform.rotation;
                //m_camera.transform.position = targetCamPos;
    
                float step = 5 * Time.deltaTime;
                m_camera.transform.position = Vector3.MoveTowards(m_camera.transform.position, targetCamPos, step);
                m_camera.transform.rotation = Quaternion.Slerp(m_camera.transform.rotation, targetCamRot, step);
            }
            else
            {
                Vector3 targetCamPos = pre_came.transform.position;
                Quaternion targetCamRot = pre_came.transform.rotation;
    
                float step = 5 * Time.deltaTime;
                m_camera.transform.position = Vector3.MoveTowards(m_camera.transform.position, targetCamPos, step);
                m_camera.transform.rotation = Quaternion.Slerp(m_camera.transform.rotation, targetCamRot, step);
            }
        }
    }
    展开全文
  • [Unity3d]第一人称和第三人称视角完美切换

    万次阅读 多人点赞 2019-10-29 14:53:33
    最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂,里面涉及到一些角度,...

    最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂,里面涉及到一些角度,还有向量等的计算,这就要求有一定的图形学的基础,我将官方的第一人称视角和第三人称视角结合了一下,但发现还是不那么容易,不仅仅只是简单的摄像机的切换和position以及rotation的赋值而已,当然这种方法适合第三人称切换至第一人称,而第一人称切换至第三人称你会发现根本方向就切换不过来,位置是对了,但方向还是原来的方向,这就让我有点苦恼,然后不得已只能硬着头皮去看官方写的控制第三人称人物运行的脚本ThirdPersonController,里面有一些英文的注解,这脚本写的还是有一定的技术含量,毕竟是官方的嘛,想要看懂还是要慢慢静下心来看的。

     

    无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家。点这里可以跳转到教程!

     

    更多精品教程:

    http://dingxiaowei.cn

    实现步骤:                                                                                                                                                                                                        

    1.导入官方的第一人称和第三人称的Person,会发现,第三人称的Main Camera是在model的外面而第一人称的Main Camera是在model的里面,这里最好统一一下,我将第三人称的那个model拉到我新建的一个空物体下(记得reset这空物体),然后将主摄像机也拖放到这个空物体下,最好确保camera和3rdPersonController平级。这里还要说一下的,将3rdPersonController也reset一下,然后设置PositionY跟相机的Y一样,我这里设置的是51大概。

     

    2.创建视角切换的脚本viewpointSwitch,挂在GUI的物体上,这个物体挂了一些关于GUI还有控制鼠标隐藏显示的脚本

    鼠标隐藏和显示:

    void Update() 
    {
    	 if (Input.GetKey(KeyCode.H))
    	// Lock the cursor inside gameview
    	 Screen.lockCursor = true;
    	// Hide mouse cursor
    	Screen.showCursor = false;
    	
    	if(Input.GetKey(KeyCode.U))
    	 // Lock the cursor inside gameview
    	Screen.lockCursor = false;
    	//Show mouse cursor
    	Screen.showCursor = true;
    }


    viewpointSwitch:

    using UnityEngine;
    using System.Collections;
    
    public class ViewpointSwitch : MonoBehaviour {
        //从场景中拖入的object
        public GameObject Obj_3rd;
        public GameObject cam_3rd;
        public GameObject gobj_3rd;
    
        public GameObject Obj_1fs;
        public GameObject cam_1fs;
        public GameObject gobj_1fs;
    
        //记录刚进入第一人称视角时候的欧拉角和离开第一视角时候的欧拉角(Y方向)
        float pre1fsAngle = 0;
        float cur1fsAngle = 0;
    
    	// Update is called once per frame
    	void Update ()
        {
            //切换至第一人称视角
            if (Input.GetKey(KeyCode.F1))
            {
                //记录一开始
                //pre1fsAngle = cam_1fs.transform.eulerAngles.y;
                pre1fsAngle = cam_3rd.transform.eulerAngles.y;  //记录的第一人称(这里取的是第三人称,其实是一样的)一开始的y方向欧拉角,这里没用上面注释掉的写法是防止重复按f1键切换然后覆盖初始值导致旋转角度差值缩小
                if (!Obj_1fs.activeSelf)
                {
                    Obj_1fs.SetActive(true);
                    GameObject.Find("Main Character Controller").transform.localPosition = GameObject.Find("3rd Person Controller").transform.localPosition;
                    GameObject.Find("Main Character Controller").transform.localRotation = GameObject.Find("3rd Person Controller").transform.localRotation;
                    Obj_3rd.SetActive(false);
                }
            }
            //切换至第三人称视角
            if (Input.GetKey(KeyCode.F2))
            {
                cur1fsAngle = cam_1fs.transform.eulerAngles.y;  //记录
                if (!Obj_3rd.activeSelf)
                {
                    Obj_3rd.SetActive(true);
                    GameObject.Find("3rd Person Controller").transform.localPosition = GameObject.Find("Main Character Controller").transform.localPosition;
                    //注意这里Mathf里面的方法是幅度,我这里就进行了一个角度转幅度的计算:幅度=角度*pi/180
                    float angle = (cur1fsAngle - pre1fsAngle) * Mathf.PI / 180;
                    gobj_3rd.GetComponent<ThirdPersonController>().v = Mathf.Cos(angle);
                    gobj_3rd.GetComponent<ThirdPersonController>().h = Mathf.Sin(angle);
                    print("旋转角度:" + (cur1fsAngle-pre1fsAngle));
                    gobj_3rd.GetComponent<ThirdPersonController>().flag = true;  //这个flag标志是让ThirdPersonController的update方法执行改变上面的v,h一次,然后第二帧的时候就执行v=Input.GetAxisRaw("Vertical")和h=Input.GetAxisRaw("Horizontal")
                    Obj_1fs.SetActive(false);
                }
            }
    	}
    }
    

    备注:
    //w(1) & s(-1)(前后运动)
    v = Input.GetAxisRaw("Vertical");

     //a(-1) & d(1)(左右运动)

     h = Input.GetAxisRaw("Horizontal");

    这里的v和h变量要解释一下,v代表前后方向,如果按下前方向w键,这里Input.GetAxisRaw("Vertical")会有一个-1~1的一个变化,如果是遥感就会有浮点数,但如果是键盘的话,一般就是0,-1,1三个状态,按下w前进方向键,v会变成1,如果按下后退键s,v就会变成-1,如果不按则是0。h就是代表水平左右轴向,a键按下h=-1,d按下h=1,不按则代表0。

    ThirdPersonController.js人物旋转的方向是始终转向一个前进的方向向量,var targetDirection = h * right + v * forward;

    这里的right和forward分表表示X轴(forward方向)和Z轴(right方向)的单位向量

    var forward = cameraTransform.TransformDirection(Vector3.forward);

    var right = Vector3(forward.z, 0, -forward.x);

     

    效果图:                                                                                                                                                                                                              

    1.刚开始启动,第三人称的模型朝向以及旋转坐标

        

    2.按一下D键,也就是右键,人物旋转,90度,朝向以及旋转坐标,以及v,h(控制旋转方向的一个系数,上文有介绍)的值

     

     

    在线展示:                                                                                                                  

    http://ueige123.oicp.net/dingxiaowei/13viewpointswitch/13viewpointswitch.html

     

     

    ==================== 迂者 丁小未 CSDN博客专栏=================

    MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

    Unity QQ群:375151422         cocos2dx QQ群:280818155

    ====================== 相互学习,共同进步 ===================

     

    转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/18281261

    欢迎关注我的微博:http://weibo.com/u/2590571922

     

     

    展开全文
  • 从2D游戏到3D游戏的进化,最重要的就是游戏视角的控制。奠定了3D游戏操作模式的1998年的神话级游戏《塞尔达传说:时之笛》中,对3D下游戏视角设计的关键即在于“镜头跟随”与“视角锁定”。本文将在unity中实现该...

    从2D游戏到3D游戏的进化,最重要的就是游戏视角的控制。奠定了3D游戏操作模式的1998年的神话级游戏《塞尔达传说:时之笛》中,对3D下游戏视角设计的关键即在于“镜头跟随”与“视角锁定”。本文将在unity中实现该效果。

    实现过程

    实现的思路非常简单:

    • 在初始化时设定摄像机和人物之间的相对位置和相对旋转角;
    • 在需要锁定时找到人物最近的单位,使人物转向该单位,并将摄像机的水平面的旋转角设置至和人物相同;
    • 如果一定范围内没有单位,则人物不需转向,摄像机仍然执行;

    这里设置了positionTarget和angleTarget两个变量,用来表示移动的目标状态,同时使用Lerp函数实现平滑运动。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraController : MonoBehaviour
    {
        public GameObject player;
        Vector3 distanceToPlayer;
        Vector3 positionTarget,angleTarget;
        LayerMask enemyLayer;
        float temp;
    
        // Start is called before the first frame update
        void Start()
        {
            distanceToPlayer = this.transform.position - player.transform.position;
            enemyLayer = LayerMask.GetMask("Enemy");
            angleTarget = this.transform.eulerAngles;
        }
    
        // Update is called once per frame
        void Update()
        { 
            CameraFollow();
            if (Input.GetKey(KeyCode.Space))
            {
                CameraAngle();
            }
            this.transform.eulerAngles = Vector3.Lerp(this.transform.eulerAngles, angleTarget, 0.3f);
            this.transform.position = Vector3.Lerp(this.transform.position, positionTarget, 0.3f);
        }
    
        void CameraFollow()
        {
            positionTarget = player.transform.position + Quaternion.AngleAxis(player.transform.rotation.eulerAngles.y, new Vector3(0, 1, 0)) * (distanceToPlayer);
        }
    
        void CameraAngle()
        {
            //找到最近的单位
            Collider[] collidersAround = Physics.OverlapSphere(player.transform.position, 400);//Overlap一系的函数在检测总数不是太大的时候会优先获取更近的碰撞器
            if (collidersAround.Length == 0)
            {
            //搜索不到目标就指向正前方
                angleTarget = new Vector3(this.transform.eulerAngles.x, player.transform.eulerAngles.y, this.transform.eulerAngles.z); 
                return;
            }
            int closestEnemy = 0;
            float closestDistance = 401;
            for (int i = 0; i < collidersAround.Length; i++)
            {
                temp = (this.transform.position - collidersAround[i].gameObject.transform.position).sqrMagnitude;
                closestEnemy = temp < closestDistance ? i : closestEnemy;
                closestDistance = temp < closestDistance ? temp : closestDistance;
            }
    		player.transform.LookAt(collidersAround[closestEnemy].gameObject.transform.position);
            positionTarget = player.transform.position + Quaternion.AngleAxis(player.transform.rotation.eulerAngles.y, new Vector3(0, 1, 0)) * (distanceToPlayer);
            angleTarget = new Vector3(this.transform.eulerAngles.x, player.transform.eulerAngles.y, this.transform.eulerAngles.z);   
        }
    
    }
    
    

    但是这样写完一运行,发现不对了:
    在这里插入图片描述
    每次转一圈到0°的时候视角会“刷”一下外翻一圈。

    原因很好理解,就是因为越过360°(0°)的时候,获取的欧拉角会产生一个突变,此时Lerp运算后的变化方向会变化:
    在这里插入图片描述
    按照图中的变化,会在某一时刻发生角度突然变小,表现出的就是镜头“天旋地转”。

    那怎么解决呢?这里要在突变时使两角度的差值减小360°,换句话说,只需要在设置angleTarget的时候保证从当前角度到目标角度的差值小于180°即可(此时一定为变化最小的过程)。
    也就是把上文中的CameraAngle函数改成:

        void CameraAngle()
        {
            Collider[] collidersAround = Physics.OverlapSphere(player.transform.position, 400);
            if (collidersAround.Length == 0)
            {
            	angleTarget = new Vector3(this.transform.eulerAngles.x, player.transform.eulerAngles.y, this.transform.eulerAngles.z); 
                return;
            }
            int closestEnemy = 0;
            float closestDistance = 401;
            for (int i = 0; i < collidersAround.Length; i++)
            {
                temp = (this.transform.position - collidersAround[i].gameObject.transform.position).sqrMagnitude;
                closestEnemy = temp < closestDistance ? i : closestEnemy;
                closestDistance = temp < closestDistance ? temp : closestDistance;
            }
            player.transform.LookAt(collidersAround[closestEnemy].gameObject.transform.position);
            positionTarget = player.transform.position + Quaternion.AngleAxis(player.transform.rotation.eulerAngles.y, new Vector3(0, 1, 0)) * (distanceToPlayer);
            angleTarget = new Vector3(this.transform.eulerAngles.x, player.transform.eulerAngles.y, this.transform.eulerAngles.z);        
            //当越过0发生突变时(不是最短变化路径)加以矫正
            if (Mathf.Abs(player.transform.eulerAngles.y - this.transform.eulerAngles.y) > 180)
            {
                angleTarget = new Vector3(this.transform.eulerAngles.x, player.transform.eulerAngles.y + (player.transform.eulerAngles.y > this.transform.eulerAngles.y ? -360 : 360), this.transform.eulerAngles.z);
            }
        }
    

    最终实现的效果如下:

    在这里插入图片描述


    本次分享的内容到这里就结束了,我写博文的目的最初是为了帮助自己掌握知识,如果这篇分享能够稍微帮助到你,那当然再好不过了。有什么问题也请各位多指正!谢谢大家的关注!

    展开全文
  • unity3d5.2.3中 调整视角

    2019-01-04 15:30:50
    按住alt键不放,然后左边的手的图标会变成一个眼睛,在Scene中移动。就会发现可以调整视角

     

    按住alt键不放,然后左边的手的图标会变成一个眼睛,在Scene中移动。就会发现可以调整视角了

    展开全文
  • Unity3D:摄像头主角视角追踪

    千次阅读 2017-03-08 10:57:33
    摄像机的平滑追踪对于游戏来说十分实用,是游戏交互中必不可少的一部分,在一些竞速游戏中视角往往需要大幅度变动。 效果: (新浪上传又挂了) FollowTarget .cs  挂到摄像机上即可 using UnityEngine; ...
  • 今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项具体内容,而是博主在经过大量的实践后所得的感悟。今天的文章从内容上可以分为2种模式、1个组件、1种模型,希望对大家学习Unity3D起到...
  • 在之前的一篇博文中描述了Unity3D应用嵌入WPF应用的具体实现方式,但仅仅是解决了最基本的技术问题,想要将其具体的应用到项目中还需要具体的细化。经过近期在项目中的实践进行了细化,现将本人最近的一些过程整理...
  • Unity官方版本都已经更新的2017.2的了,官方的案例和使用脚本还是挺给力的,而且...想要获得完整的官方案例([Standard Assets Example](https://unity3d.com/cn/get-unity/download/archive?_ga=2.42565285.10319038.
  • Unity3D常见面试题

    万次阅读 多人点赞 2017-08-11 20:20:00
    Unity3D常见面试题
  • Unity3d_镜头跟随鼠标移动

    千次阅读 2017-12-11 18:38:35
    需要将摄像头放在另个GameObject里 ...这样使得整个视角都处于正对面,而不会出现倾斜等现象using System.Collections; using System.Collections.Generic; using UnityEngine;public class CameraCon
  • unity3d能应用到什么领域

    千次阅读 2014-03-19 13:30:36
    Unity3D用来制作游戏已经是目前市场上的一个发展趋势,而且有越来越多的公司与开发者不断的加入,那么Unity3D的应用是否能涵盖到各种领域?如果使用Unity3D制作建筑景观模拟?没错,这已是一个新时代的潮流,  如果...
  • Unity3d 描边shader详解

    千次阅读 热门讨论 2013-04-18 10:41:03
    Unity官方教程里有例子,其中核心是这两句代码:   half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal)); o.Emission = _RimColor.rgb * pow (rim, _RimPower); IN.viewDir是当前视角向量...
  • Unity在游戏开发中视角移动是很重要 比如在侠盗猎车-罪恶都市中的Tab键可以切换到后方视角 在这里我将介绍两个方法 一个是快速(无过程)的切换视角 一个是有过程的切换视角 1无过程切换视角 首先我们在unity中创建...
  • Unity3D中如何让摄像机进行平滑的透视(perspective)和正视(orthographic)角度变换(就像编辑器中点击Gizmos一样的效果) How to make a smooth animation from orthographic to perspective projection with camera...
  • Unity3D面试和笔试题

    千次阅读 2016-09-17 17:34:26
    Unity3D常见面试和笔试题总结问答题
  • Unity3d编辑器的使用

    千次阅读 2019-06-24 19:24:43
    第一步:双击Unity3d,点击New 第二步:填写项目信息,注意:工程必须放在空文件夹下 第三步:点击创建 第四步:工程创建完毕 文件夹介绍: Assets:放项目所有资源的文件夹 Library:文件资源库 ...
  • 选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1、 在Unity中 使用 IronPython https://qiita.com/syutotyou/items/bd9f9a74a054934277c1 环境: windows10 unity ...
  • Unity 3D 中可以把摄像机设置为正交。正交摄像机与 Unity 3D 中普通摄像机相比没有透视效果(近大远小),所以正交相机一般可以用于 2D 游戏开发或者是 3D 游戏的 UI 开发。 在 2D 游戏开发中,有时会遇到根据...
  • Android Unity3D基础

    2013-05-02 21:36:12
    这是羽化第二篇博客,目前依旧菜鸟一只。最近在玩纷争2,回想小学打FF8的时候真是感慨万千,每当Eyes on me的旋律响起的时候,心里面就...闲话扯了很多,好了开始进入正题,这次主要是给大家认识下Unity3D,具体怎么在A
1 2 3 4 5 ... 20
收藏数 1,424
精华内容 569
关键字:

unity3d 视角变化