unity3d视角向左看_unity 3d视角 - CSDN
  • Input.GetKey 获取键,当按键北被用户按住时...按下"Q"控制物体向左旋转; 按下”E"控制物体向右旋转;  把脚本拖给一个物体,再给相机一个SmoothFollow脚本。就可以运行效果了。 注意:如果你的工程文件中没有

    Input.GetKey 获取键,当按键北被用户按住时返回true。

    下面代码实现:

    按下"W" 控制物体向前;

    按下"A"控制物体像左;

    按下"S"控制物体向后;

    按下"D"控制物体向右;

    按下"Q"控制物体向左旋转;

    按下”E"控制物体向右旋转;

    void Update () {
            if(Input .GetKey (KeyCode.W))
            {
                  MoveForward();
            }
            if (Input.GetKey(KeyCode.A))
            {
              MoveLeft();
            }
            if(Input .GetKey (KeyCode.S ))
            {
                MoveBack();
            }
            if(Input .GetKey (KeyCode .D ))
            {
                MoveRight();
            }
            if (Input.GetKey(KeyCode.Q))
            {
                Lrotate();
            }
            if (Input.GetKey(KeyCode.E))
            {
                Rrotate();
            }
    }
        void MoveForward()
        {
            transform.Translate(Vector3.forward * Time.deltaTime * Speed);
        }
        void MoveBack()
        { 
            transform .Translate (Vector3 .forward *Time .deltaTime *-Speed) ;
        }
        void MoveLeft()
        { 
            transform .Translate (Vector3.left *Time .deltaTime *Speed );
        }
        void MoveRight()
        {
            transform.Translate(Vector3.left * Time.deltaTime * -Speed);
        }
        void Lrotate()
        {
            transform.Rotate(Vector3.up * Time.deltaTime * Speed); 
        }
        void Rrotate()
        {
            transform.Rotate(Vector3.up * Time.deltaTime * -Speed);
        }



     把脚本拖给一个物体,再给相机一个SmoothFollow脚本。就可以运行看效果了。

    注意:如果你的工程文件中没有S

    把脚本拖给需要控制的物体,运行就可以看见效果了。

    可以再给相机添加一个相机跟随效果。

    点击import Package->Scripts。导入脚本。

    再将smoothFollow拖给相机。

    运行就可以了。

    展开全文
  • [Unity3D]Unity3D游戏开发之自由视角下的角色控制

    万次阅读 热门讨论 2014-09-10 12:54:34
    各位朋友,大家好,我是秦元培,欢迎大家关注...今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由视角下的角色控制。如图是博主非常喜欢的《古剑奇谭》游戏截图,在

           各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。在上一篇文章<[Unity3D]Unity3D游戏开发之角色控制漫谈>一文中,博主与大家分享自己在角色控制方面的一些感悟。今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由视角下的角色控制。如图是博主非常喜欢的《古剑奇谭》游戏截图,在这款游戏中就使用了博主今天要讲解的自由视角,所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。好了,下面我们正式开始今天的内容吧!


         

         在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础。

         1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间。这段话怎么理解呢?我们来看下面这段脚本:

    using UnityEngine;
    using System.Collections;
    
    public class example : MonoBehaviour {
    
    	//水平速度
    	public float HorizontalSpeed = 2.0F;
    	//垂直速度
    	public float VerticalSpeed = 2.0F;
    
    	void Update() 
    	{
    		//水平方向
    		float h = HorizontalSpeed * Input.GetAxis("Mouse X");
    		//垂直方向
    		float v = VerticalSpeed * Input.GetAxis("Mouse Y");
    		//旋转
    		transform.Rotate(v, h, 0);
    	}
    }
    这段脚本呢是根据鼠标的位置来旋转物体从而实现对物体的观察,从这段脚本中我们可以看出,通过获取输入轴的办法,我们可以获得鼠标移动的方向进而实现对于物体的旋转控制。在Unity3D中我们可以通过Edit->Project Setting->Input来查看项目中的坐标轴名称:


    在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。


         2、欧拉角eulerAngles:该值是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:

    float mY = 5.0;
    
    void Update () 
    {
    	mY += Input.GetAxis("Horizontal");
    	transform.eulerAngles =new Vector3(0,mY, 0);
    }
         如果你已经理解了上面的话,那么不出意外的,这段脚本会如你所愿的,按照鼠标在水平方向上移动的方向绕Y轴旋转。通常情况下,我们不会单独设置欧拉角其中一个轴,例如eulerAngles.x = 10,因为这将导致偏移和不希望的旋转。当设置它们一个新的值时,要同时设置全部。好在我们可以通过Quaternion.Euler()方法将一个Vector3类型的值转化为一个四元数,进而通过修改Transform.Rotation来实现相同的目的。

        

         3、插值:所谓插值是指离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。我们来看下面的脚本:

    void Rotating (float horizontal, float vertical)
    	{
    		// Create a new vector of the horizontal and vertical inputs.
    		Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);
    		
    		// Create a rotation based on this new vector assuming that up is the global y axis.
    		Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
    		
    		// Create a rotation that is an increment closer to the target rotation from the player's rotation.
    		Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);
    		
    		// Change the players rotation to this new rotation.
    		rigidbody.MoveRotation(newRotation);
    	}
    
    插值的方法很简单,只要我们给出初始和结束的状态、时间就可以了,大家可以自己看API。


          好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是博主自己在做的小游戏:


    本次的主角呢,是博主非常喜欢的角色谢沧行,好了,我们回到今天的内容里吧!在第一部分,主要的是完成角色向各个方向的转身,这里博主定义四个方向(其实八个方向是一样的!),脚本如下:

    using UnityEngine;
    using System.Collections;
    
    public class NoLockiVew_Player : MonoBehaviour {
    
    	/*自由视角下的角色控制*/
    	/*作者:秦元培*/
    
    	//玩家的行走速度
    	public float WalkSpeed=1.5F;
    	//重力
    	public float Gravity=20;
    
    	//角色控制器
    	private CharacterController mController;
    	//动画组件
    	private Animation mAnim;
    	//玩家方向,默认向前
    	private DirectionType mType=DirectionType.Direction_Forward;
    
    	[HideInInspector]
    	//玩家状态,默认为Idle
    	public PlayerState State=PlayerState.Idle;
    
    	//定义玩家的状态枚举
    	public enum PlayerState
    	{
    		Idle,
    		Walk
    	}
    
    	//定义四个方向的枚举值,按照逆时针方向计算
    	protected enum DirectionType
    	{
    		Direction_Forward=90,
    		Direction_Backward=270,
    		Direction_Left=180,
    		Direction_Right=0
    	}
    	
    	void Start () 
    	{
    	   //获取角色控制器
    	   mController=GetComponent<CharacterController>();
    	   //获取动画组件
    	   mAnim=GetComponentInChildren<Animation>();
    	}
    	
    	
    	void Update () 
    	{
    		MoveManager();
    		//MouseEvent();
    	}
    
    	//玩家移动控制
    	void MoveManager()
    	{
    		//移动方向
    		Vector3 mDir=Vector3.zero;
    		if(mController.isGrounded)
    		{
    			//将角色旋转到对应的方向
    			if(Input.GetAxis("Vertical")==1)
    			{
    				SetDirection(DirectionType.Direction_Forward);
    				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
    				mAnim.CrossFade("Walk",0.25F);
    				State=PlayerState.Walk;
    			}
    			if(Input.GetAxis("Vertical")==-1)
    			{
    				SetDirection(DirectionType.Direction_Backward);
    				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
    				mAnim.CrossFade("Walk",0.25F);
    				State=PlayerState.Walk;
    			}
    			if(Input.GetAxis("Horizontal")==-1)
    			{
    				SetDirection(DirectionType.Direction_Left);
    				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
    				mAnim.CrossFade("Walk",0.25F);
    				State=PlayerState.Walk;
    			}
    			if(Input.GetAxis("Horizontal")==1)
    			{
    				SetDirection(DirectionType.Direction_Right);
    				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
    				mAnim.CrossFade("Walk",0.25F);
    				State=PlayerState.Walk;
    			}
    			//角色的Idle动画
    			if(Input.GetAxis("Vertical")==0 && Input.GetAxis("Horizontal")==0)
    			{
    				mAnim.CrossFade("Idle",0.25F);
    				State=PlayerState.Idle;
    			}
    
    		}
    		//考虑重力因素
    		mDir=transform.TransformDirection(mDir);
    		float y=mDir.y-Gravity *Time.deltaTime;
    		mDir=new Vector3(mDir.x,y,mDir.z);
    		mController.Move(mDir);
    	}
    
    	//设置角色的方向,有问题
    	void SetDirection(DirectionType mDir)
    	{
    		if(mType!=mDir)
    		{
    			transform.Rotate(Vector3.up*(mType-mDir));
    			mType=mDir;
    		}
    	}
    }
    
    这里定义四个方向,是按照逆时针方向转的,相邻的两个方向间相差90度,所以我们只需要将当前的角度和目标角度相减就可以转到目标角度的方向(其实这是以前写的代码,现在回头再看,直接用欧拉角似乎更为简单啊,呵呵)。这里主要的内容就是这样了。下面我们来看相机控制部分的代码吧,这里的代码参考了MouseOrbit脚本,主要完成了鼠标右键旋转控制,博主在此基础上增加了相机缩放的代码。提到相机缩放,其实就是根据鼠标滚轮滚动的方向和大小重新计算角色与相机的距离,与之类似地还有小地图的放缩,其实同样是通过修改距离来实现的。博主今天的一个体会是官方的代码能自己写一遍的最好自己写一遍,这样好多东西就能在这个过程中给理解了。我们一起来看脚本
    using UnityEngine;
    using System.Collections;
    
    public class NoLockView_Camera : MonoBehaviour 
    {
    	//观察目标
    	public Transform Target;
    	//观察距离
    	public float Distance = 5F;
    	//旋转速度
    	private float SpeedX=240;
    	private float SpeedY=120;
    	//角度限制
    	private float  MinLimitY = 5;
    	private float  MaxLimitY = 180;
    
    	//旋转角度
    	private float mX = 0.0F;
    	private float mY = 0.0F;
    
        //鼠标缩放距离最值
    	private float MaxDistance=10;
    	private float MinDistance=1.5F;
    	//鼠标缩放速率
    	private float ZoomSpeed=2F;
    
    	//是否启用差值
    	public bool isNeedDamping=true;
    	//速度
    	public float Damping=2.5F;
    
    	void Start () 
    	{
    		//初始化旋转角度
    		mX=transform.eulerAngles.x;
    		mY=transform.eulerAngles.y;
    	}
    	
    	void LateUpdate () 
    	{
    		//鼠标右键旋转
    		if(Target!=null && Input.GetMouseButton(1))
    		{
    		    //获取鼠标输入
    			mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
    			mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
    			//范围限制
    			mY = ClampAngle(mY,MinLimitY,MaxLimitY);
    		}
    
    		//鼠标滚轮缩放
    
    		Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
    		Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
    
    		//重新计算位置和角度
    		Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
    		Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
    
    		//设置相机的角度和位置
    		if(isNeedDamping){
    		   //球形插值
    		   transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping); 
    		   //线性插值
    		   transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping); 
    		}else{
    		   transform.rotation = mRotation;
    		   transform.position = mPosition;
    		}
    		//将玩家转到和相机对应的位置上
    		if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
    		{
    			Target.eulerAngles=new Vector3(0,mX,0);
    		}
    	}
    	
    	private float  ClampAngle (float angle,float min,float max) 
    	{
    		if (angle < -360) angle += 360;
    		if (angle >  360) angle -= 360;
    		return Mathf.Clamp (angle, min, max);
    	}
        
    
    
    
    }
    
    
    

    这里很多朋友可能对我设置一个状态很不理解吧,这其实是为了让玩家有一个自由查看角色的机会,否则当玩家按下鼠标右键的话,角色就会转向相机正对着的位置,这样玩家就看不到角色的正面了。当然,这里用到了插值,这样能使角色在转身的时候平滑一点,效果会更好。

    唉,不知不觉已经这个时候了,开学已经一周了,这学期我们只上九周课,然后就是实习、毕设、找工作一大堆事情在等着我们。可是不知道为什么博主宿舍的同学居然还能每天什么事情都不做,从早上一直看电视剧到晚上十点,虽然这件事情和博主没有什么关系吧,可是整个宿舍的人都安安静静地做着自己的事情,就有这么一个人整天声音开得很大在那里外放,这样真的好吗?以前和这个人闹过一次,因为他聚了一帮人在宿舍打麻将,我觉得吵就说了他一顿,结果就和我僵上了。说真的,博主对目前的专业真的没有什么情感,大学四年里最让博主开心的事情就是博主学会了好多自己想要学的东西,认识了几个不错的老师和朋友,仅此而已。或许我们注定要越走越远吧,因为我们根本就不是同一种人。

    前几天网上有人通过博客联系到博主,希望博主能到他哪里工作,可惜博主目前仍然有一大堆的琐事缠身,不然离开这喧嚣吵闹的宿舍,去做博主喜欢的事情,去寻找博主自己的梦想,博主相信,博主一定可以做得更好吧。人生或许就是这样,你越是在乎的可能越让你得不到,你无心插柳可能会得到一片绿荫。对于未来,不管怎么样,坦然面对就好了,博主改变不了周围的这群人,只能努力地去改变自己。好了,晚安吧!

    效果演示(2M的限制让很多展示都无可奈何)



    每日箴言:所有的悲伤,总会留下一丝欢乐的线索。所有的遗憾,总会留下一处完美的角落。我在冰封的深海,找寻希望的缺口。却在午夜惊醒时,蓦然瞥见绝美的月光。——几米


           喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
           转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/39125353


          文章更新:

          9月10日,博主在测试这个项目的时候意外地发现了一个Bug。Bug出现在如下位置:

    		//设置玩家跟随角度
    		if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
    		{
    			Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
    		}

    该方法主要的作用是当玩家同时按下方向控制键和鼠标右键,玩家可以随着鼠标旋转到对应的角度,这主要是为了满足玩家双手操作的需求,不过由于这行代码,导致玩家在向左、向右、向后三个方向上的转身失效,如果除去这行代码,则原来的方向控制没有任何问题,可是没有这行代码,玩家的操作感就会下降。后来博主想到我们对角色的旋转实际上应该是放在鼠标右键事件里的,所以博主将代码修改如下,这样就解决了这个Bug:

    using UnityEngine;
    using System.Collections;
    
    public class NoLockView_Camera : MonoBehaviour 
    {
    	//观察目标
    	public Transform Target;
    	//观察距离
    	public float Distance = 5F;
    	//旋转速度
    	private float SpeedX=240;
    	private float SpeedY=120;
    	//角度限制
    	private float  MinLimitY = 5;
    	private float  MaxLimitY = 180;
    
    	//旋转角度
    	private float mX = 0.0F;
    	private float mY = 0.0F;
    
        //鼠标缩放距离最值
    	private float MaxDistance=10;
    	private float MinDistance=1.5F;
    	//鼠标缩放速率
    	private float ZoomSpeed=2F;
    
    	//是否启用差值
    	public bool isNeedDamping=true;
    	//速度
    	public float Damping=10F;
    
    	private Quaternion mRotation;
    
    	void Start () 
    	{
    		//初始化旋转角度
    		mX=transform.eulerAngles.x;
    		mY=transform.eulerAngles.y;
    	}
    	
    	void LateUpdate () 
    	{
    		//鼠标右键旋转
    		if(Target!=null && Input.GetMouseButton(1))
    		{
    		    //获取鼠标输入
    			mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
    			mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
    			//范围限制
    			mY = ClampAngle(mY,MinLimitY,MaxLimitY);
    			//计算旋转
    			mRotation = Quaternion.Euler(mY, mX, 0);
    			//根据是否插值采取不同的角度计算方式
    			if(isNeedDamping){
    				transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping); 
    			}else{
    				transform.rotation = mRotation;
    			}
    			//处理同时按下鼠标右键和方向控制键
    			if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk){
    				Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
    			}
    		}
    
    		//鼠标滚轮缩放
    		Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
    		Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
    
    		//重新计算位置
    		Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
    
    		//设置相机的角度和位置
    		if(isNeedDamping){
    		   transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping); 
    		}else{
    		   transform.position = mPosition;
    		}
    
    	}
    
    
    	//角度限制
    	private float  ClampAngle (float angle,float min,float max) 
    	{
    		if (angle < -360) angle += 360;
    		if (angle >  360) angle -= 360;
    		return Mathf.Clamp (angle, min, max);
    	}
    }
    
    
    
    不过经过博主测试,如果不采用插值的话,似乎效果更为真实啊(为什么会和第一次测试的感觉不一样啊,囧!)




    展开全文
  • [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

     

     

    展开全文
  • unity3d fps第一人称视角移动

    万次阅读 多人点赞 2018-01-17 19:54:30
    第一次写博客,有什么不足之处请多多原谅,本章的主要讲的是fps的第一人称视角,我们要知道,第一人称视角unity3d里怎么实现,主要有两个,一个是主角和另一个是摄像机。 (如果你们认真完这个教程fps第一人称...

      第一次写博客,有什么不足之处请多多原谅,本章的主要讲的是fps的第一人称视角,我们要知道,第一人称视角在unity3d里怎么实现,主要有两个,一个是主角和另一个是摄像机

    (如果你们认真看完这个教程fps第一人称视角是完全可以学会的。不要跳行看,看完这个教程一个小时都不到。我相信有人连这个都没看直接看下面)吐舌头

    首先上图:

    Ethan这个主角是unity自带的模型,Main Camera是一个摄像机。(图片我没处理(你以为我不想啊博客没有截屏我有ps但是我已经懒得处理了)自已放大看)

    第一步:将摄像机移到主角身上作为一个子级物体(然后在Scene面板,将移动摄像机到主角面前如我上面那图)。如我上图那样子。(这时候陈独秀同学会问:上面图那么大你要我怎么找啊)陈独秀你给我过来我一巴掌你,你不会看Create面板吗?就是那个黑色箭头那个面板。对你没看错。就是黑色箭头那里。(虽然画的丑了点,但是你们看明白就行了)

    第二步:在主角身上添加一个Character Controller组件。(陈独秀:这什么鬼组件,在哪里啊),呵呵,Character Controller这个组件是角色控制器的意思。位置:在我上面图片右下角那里有一个Add Component在physics里面。

    然后可以写(复制)代码了是不是很开心。(开心个鬼看到代码就直接复制粘贴你们nb,不修改,你们复制下面的代码能运行我拜你为师)(照着下面照片的代码抄的同学注意了最后面一行还有一个})


    对没错就是上面那个那些代码。就50行不到就ok了,完成第一人称视角。(陈独秀:解析呢。都没有解析学个毛啊)

    唉陈独秀同学就是这么心急。我一行一行给你们解析清楚ok(说是这么说反正你们又不顺着网线来打我);

    ps: 别复制下面代码。

    CharacterController playerController;  //这行代码是声明一个CharacterController类;


        Vector3 direction; //声明3维向量;

        public float speed = 1;   //主角的移动速度
        public float jumpPower = 5; //主角跳的高度
        public float gravity = 7f; //重力

        public float mousespeed = 5f; //鼠标快慢

        public float minmouseY = -45f; //限制鼠标y轴(你们想一想眼睛能看到后面的吗?可以的话你nb)
        public float maxmouseY = 45f;

        float RotationY = 0f;
        float RotationX = 0f;这两个存放的是鼠标输入

        public Transform agretctCamera;  //这个必须在Create面板拖放Main Camera(也就是摄像机)这个位置里否则没有效果,这个类是存放的是摄像机位置;

    // Use this for initialization
    void Start () {

    //这个函数就不说明了,看到这里的都是基础过关了吧?
            playerController = this.GetComponent<CharacterController>(); //获取依附在这个物体上的CharacterController组件

            Screen.lockCursor = true;//鼠标隐藏(新的unity5.0版本以上好像用这个会警告,我就不用新的了反正旧的能用我去研究新的用法干嘛,我有病啊,(你以为我会告诉你我他喵的根本看不懂官方怎么解析的么呵呵))

        }

    // Update is called once per frame
    void Update () {//这个方法都要我解析,陈独秀你过来,(蠢蠢欲动的陈独秀:我什么都没说好吗,关我什么事)
            float _horizontal = Input.GetAxis("Horizontal");//将水平轴的给_horizontal
            float _vertical = Input.GetAxis("Vertical");//同上(呵呵我会告诉你我懒得打)


            if (playerController.isGrounded)

    //(陈独秀:这个playerController是什么鬼啊)呵呵陈独秀同学坐下,我先给你一巴掌先前面不是声明了playerController获取CharacterController组件吗?这么快就忘了 你很棒棒噢。CharacterController组件中有一个检测是否到地面的方法就是.isGrounded。这个在CharacterController才有的,记住了陈独秀同学。playerController.isGrounded也就是说主角在地面上。
            {
                direction = new Vector3(_horizontal,0,_vertical);//在地面上才能移动,这个是移动向量


                if (Input.GetKeyDown(KeyCode.Space))     //检测你是否按下了空格键     
                    direction.y = jumpPower;      //如果按下了空格键就三维向量中的y轴等于jumpPower(呵呵,陈独秀同学是不是又忘了jumpPower是什么了,回头看看都声明了什么)     
            }
            direction.y -= gravity * Time.deltaTime;//这个在if语句外也就是说主角的向下的重力


            playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));
    //这句就有点难理解了,我都不知道怎么解析, playerController.Move()这个是移动方法,playerController.transform.TransformDirection()这个是跟随世界坐标的意思,如果没有这个主角身体转向的时候它就是一个方向,按w的时候永远只朝着一个方向移动。唉解析什么的最烦了自已百度。


           RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;

    //存放摄像机(也就是鼠标)x轴
            RotationY -= Input.GetAxis("Mouse Y") * mousespeed;//存放摄像机(也就是鼠标)y轴


            RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);//限制鼠标上下,Mathf这个是数学函数的意思,

    Math不是数学吗?f不就是初中,高中的时候  你们最讨厌的函数么,像 f=xxx+xx+x那种;


            this.transform.eulerAngles = new Vector3(0,RotationX,0);//主角的y轴旋转(为什么有两个0,你想想主角围着x轴旋转会怎样)


            agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);//这个是摄像机上下左右。

    好了就到这了,有些自已百度吧,比如eulerAngles这个是什么意思(难道还要我解析给你们看,我又不是百科全书,想学的人我不说也会,不想学的他早就xx掉我这条博客了,反之他又看不到,)重要的是自已理解。不是复制代码,没有用的。最后保存上面代码图片自已手动打一遍吧。不会在下面留评论,别乱喷人啊,我幼小的心灵很脆弱的,最后给上源码一份。



    这个代码可以复制哦:(照着上面图片抄的同学后悔了没)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;


    public class fps1 : MonoBehaviour {
        CharacterController playerController;


        Vector3 direction;


        public float speed = 1;
        public float jumpPower = 5;
        public float gravity = 7f;


        public float mousespeed = 5f;


        public float minmouseY = -45f;
        public float maxmouseY = 45f;


        float RotationY = 0f;
        float RotationX = 0f;


        public Transform agretctCamera;


    // Use this for initialization
    void Start () {
            playerController = this.GetComponent<CharacterController>();
            Screen.lockCursor = true;
        }

    // Update is called once per frame
    void Update () {
            float _horizontal = Input.GetAxis("Horizontal");
            float _vertical = Input.GetAxis("Vertical");

            if (playerController.isGrounded)
            {
                direction = new Vector3(_horizontal,0,_vertical);
                if (Input.GetKeyDown(KeyCode.Space))           
                    direction.y = jumpPower;           
            }
            direction.y -= gravity * Time.deltaTime;
            playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));

           RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;
            RotationY -= Input.GetAxis("Mouse Y") * mousespeed;
            RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);
            this.transform.eulerAngles = new Vector3(0,RotationX,0);
            agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);
    }
       
    }


    展开全文
  • <Unity3D>上下左右 键控制人移动

    万次阅读 2016-03-08 20:14:53
    出自Unity3D开发一书, 这个脚本式只是简单的控制人物移动,不是很理想,但是可以学习 通过 上 、下、、右 按键怎么实现任务的移动 [csharp] view plaincopy using UnityEngine; ...
  •  今天呢,我们继续来探讨Unity3D角色控制的内容,自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。...
  • 所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定...
  • Unity3D中的第三人称镜头的脚本控制

    万次阅读 2014-05-30 05:08:48
    好久没有敲Blog了,谢谢大家的留言、关注、私信等支持,但是我好像已经没有办法让自己继续写以前的博客系列了,因为我发现网上关于unity3D的内容太少了,所以我无法自拔地想写U3D相关的文章!!! 第三人称视角 第...
  • 利用4种方法实现只能转向
  • usingUnityEngine;usingSystem.Collections;//摄像机跟随publicclassFollowPlayer:MonoBehaviour{privateTransformplayer;//角色privateVector3offsetPosition;//位置便宜privatebool...
  • 在之前的一篇博文中描述了Unity3D应用嵌入WPF应用的具体实现方式,但仅仅是解决了最基本的技术问题,想要将其具体的应用到项目中还需要具体的细化。经过近期在项目中的实践进行了细化,现将本人最近的一些过程整理...
  • Unity3D常见面试题

    万次阅读 多人点赞 2017-08-11 20:20:00
    Unity3D常见面试题
  • 需要物体:一个用于移动的对象,一个主摄像机,一个地面对象 摄像机的父结点为移动对象 旋转移动坐标示意图: 用于视角移动的代码: using System.Collections;...using System.Collections.... // 水平视角移动...
  • 比方进行第三人称视角控制,事实上仅仅须要进行简单的角度变换就可以。思路例如以下: 1、依照顺时针方向设定前、右、后、分别为0,1,2,3。 2、设定状态初值0,即朝向前方。 3、通过当前方向值减去前一次方向...
  • Unity3D 5 官方教程:地形引擎

    万次阅读 2016-02-28 23:22:44
    Unity3D 官方教程翻译 地形引擎
  • #pragma strict function Start () { } var MoveSpeed=5; var RotateSpeed=20; function Update () { if(this.transform.up.y>0 && this.transform.up.y ...if(Input.GetKey(KeyCode.W))
  • Unity3D射线检测控制转向

    千次阅读 2016-05-10 18:56:58
    Unity3D射线检测控制转向,使用Ray射线检测鼠标的位置信息,角色transform方向转向该位置。 //控制转向 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo;//碰撞信息,用来获取...
  • 一、前言 发现就喜欢研究这些插件,为什么...要不说Unity3D入门容易,提升难呢,因为提升全是靠苦功夫,去研究底层代码。算了,不絮叨了 二、参考文章 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 Unity3D...
  • unity3d学习(一)制作第一人称射击-玩家的视口和移动unity3d学习一制作第一人称射击-玩家的视口和移动 构建简单场景 添加脚本 总结写在前面: - 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph ...
1 2 3 4 5 ... 20
收藏数 807
精华内容 322
关键字:

unity3d视角向左看