plane旋转 unity3d_unity plane 怎么旋转 - CSDN
  • 今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游戏中人物的走动控制。...

            今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游戏中人物的走动控制。下面就请大家跟随我的一起来见证Unity3D强大的魅力吧。首先我们创建一个项目,创建新场景,我们首先创建一个Plane并将其命名为MainMap,然后我们在项目中添加一个Resources文件夹,将事先准备好的地图文件Map0复制到这个目录下,然后我们将这个图片拖拽到MainMap上,我们将MainMap的旋转参数Rotatiion设置为90,180,0,使其与摄像机垂直,然后将摄像机的Projection投影属性设置为 orthographic正交模式,这时我们就能够在屏幕中看到经典的余杭镇场景了。如果我们需要对场景进行进一步的优化的话,可以通过调整摄像机的投影面积大小和距离来实现。参数设置可以参考这里:



           接下来,我们再次创建一个Plane将其命名为Player,这就是我们今天要出场的角色李逍遥啦,和准备地图类似,我们将李逍遥的贴图直接拖拽到Player上。刚开始角色会比较大,和画面不协调,我们可以通过调整Scale参数来缩放我们的角色,调整到合适的范围。这里我们直接使用了一张完整的地图,在实际的游戏开发中,一个场景地图可能是由很多瓦片构成的,所谓瓦片,就是指被分割成若干个可以拼接起来的图片。我们知道,仙剑奇侠传作为一款经典的单机游戏,除了剧情以外,就是那些经典、动听的音乐啦,在Unity3D中实现音乐播放是很简单的事情,我们选定MainMap,为主场景添加一个AudioSource组件,并将背景音乐拖拽到AudioSource的AudioClip属性框中,选中Loop使其循环,接下来我们点击运行,运行效果如下图:


           接下类,就是今天的重头戏啦,我们今天的主要任务是通过Unity3D的2D帧动画绘制来实现人物的动画和控制,所以接下来我们在项目目录下增加一个Script文件下,新建一个叫做Person的脚本,该脚本封装了我们对人物角色的控制和帧动画的绘制方法。首先我们来准备一组素材:





               从名称的命名上,我们就可以看出这是角色在上下左右四个方向上的连续动画图片。下面,我们在Resources目录下创建下面的目录结构,并将上面的图片分别放在对应的文件夹下,我们在脚本中会引用下面的资源:


             下面开始编写脚本:

     

    using UnityEngine;
    using System.Collections;
    
    public class Person : MonoBehaviour {
    	//定义角色对象
    	private GameObject mHero;
    	//定义人物向上动画数组
    	private Object[] UpAnim;
    	//定义人物向下动画数组
    	private Object[] DownAnim;
    	//定义人物向左动画数组
    	private Object[] LeftAnim;
    	//定义人物向右动画数组
    	private Object[] RightAnim;
    	//当前帧索引
    	private int mFrameIndex;
    	//当前时间
    	private float mTotalTime;
    	//定义每秒帧数为10
    	private float mFPS=10;
    	//定义当前人物动画
    	private Object[] NowAnim;
    	private Object[] LastAnim;
    	//定义角色行动速度
    	private float mSpeed=5;
    	//角色当前状态
    	private PersonState mState=PersonState.Stand;
    	
    	//定义角色状态枚举
    	private enum PersonState
    	{
    	   Stand,
    	   Walk
    	}
    	
    	void OnGUI()
    	{
    	   GUI.Label(new Rect(10,10,180,40),"李逍遥位置:"+mHero.transform.position.ToString());
    	}
    	
    	void Start () 
    	{
    	   //获取人物
    	   mHero=GameObject.Find("Player");
    	   //获取动画数组
    	   UpAnim=Resources.LoadAll("UpAnim");
    	   DownAnim=Resources.LoadAll("DownAnim");
    	   LeftAnim=Resources.LoadAll("LeftAnim");
    	   RightAnim=Resources.LoadAll("RightAnim");
    	   //定义默认动画
    	   NowAnim=UpAnim;
    	   LastAnim=NowAnim;
    	}
    	
    	void FixedUpdate()
    	{
    	   //向左
    	   if(Input.GetKey(KeyCode.A))
    	   {
    	      SetAnimation(LeftAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.right*Time.deltaTime*mSpeed);
    	   }
    	   //向右
    	   if(Input.GetKey(KeyCode.D))
    	   {
    	      SetAnimation(RightAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.right*Time.deltaTime*(-mSpeed));
    	   }
    	   //向上
    	   if(Input.GetKey(KeyCode.W))
    	   {
    	      SetAnimation(UpAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.forward*Time.deltaTime*(-mSpeed));
    	   }
    	   //向下
    	   if(Input.GetKey(KeyCode.S))
    	   {
    	      SetAnimation(DownAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.forward*Time.deltaTime*mSpeed);
    	      Vector3 mHeroPos=mHero.transform.position;
    	   }
    	   DrawTexture(NowAnim);
    	}
    	
    	void Update () 
    	{
    	   //松开键位时
    	   if(Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D) 
    	   || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.W))
    	   {
    	      this.mState=PersonState.Stand;
    	   }
    	}
    	
    	void DrawTexture(Object[] mAnim)
    	{
    	   //如果角色当前状态为站立,则显示帧动画中的第一帧
    	   if(mState==PersonState.Stand)
    	   {
    	     mHero.renderer.material.mainTexture=(Texture)mAnim[0];
    	   }
    	   //否则绘制帧动画
    	   else
    	   {
    	      mTotalTime+=Time.deltaTime;
    	      if(mTotalTime>=1.0/mFPS)
    	      {
    	         mFrameIndex++;
    	         mTotalTime=0;
    	         if(mFrameIndex>=mAnim.Length)
    	         {
    	           mFrameIndex=0;
    	         }
    	      }
    	        mHero.renderer.material.mainTexture=(Texture)mAnim[mFrameIndex];
    	   }
    	}
    	
    	void SetAnimation(Object[] mAnim)
    	{
    	   NowAnim=mAnim;
    	   if(!LastAnim.Equals(NowAnim))
    	   {
    	      this.mFrameIndex=0;
    	      LastAnim=NowAnim;
    	   }
    	}
    }
    

             在上面的这部分脚本中,我们在Start()方法中加载了我们预先设定好的资源,然后在FixedUpdate()方法判断用户行为,并根据用户按下的键来确定要绘制的帧动画,我们假定每秒的帧数为10,则每帧显示的时间为0.1秒,如果从上一次刷新到现在的时间超过或者等于这个时间,则表示我们需要更新帧画面了。而当帧画面的索引和该帧动画数组内元素个数相等的时候,则意味着开始循环绘制这组帧动画。我们在上面定义了一个人物状态的枚举类型,这里只是简单的定义了两种类型,即Stand和Walk类型,当用户按下控制键时此类型的值为Walk,当用户松开控制键时此类型的值为Stand,和上一篇文章不同,这里调用的是 FixedUpdate()方法,而不是Update()方法,原因是Update()f方法更新的时间我们无法控制,而FixedUpdate()方法的时间则可以通过Edit->Project Setting->time->Fixed Timestep来指定,具体的大家可以自己阅读代码,这里就不多说了,剩下的事情就是把脚本绑定到Player上,我们运行一下:



             就目前这个解决方案而言,存在以下几个问题:

             1、人物范围控制,换句话说就是如何保证人物不会从这些房屋、篱笆上直接穿过去

             2、人物向下移动时,会钻到地底下

             3、摄像机如何跟随人物实现平移

             4、小地图的实现

              5、场景地图范围控制

              针对以上问题,伴随着博主学习Unity3D的深入,我们将在后面的文章中一一为大家解决,请大家关注我的博客,谢谢!


    展开全文
  • Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX。那么如何完成最基本的物体、材质的设置、物体位移与旋转呢?下面用一个简单的Unity3D说明...

    Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX。那么如何完成最基本的物体、材质的设置、物体位移与旋转呢?下面用一个简单的Unity3D说明这个问题,如下图所示:


    在一个面板上面有一个可以控制的立方体与不可以控制的球体和立方体各2个,然后可以控制立方体的位移与旋转。概念的东西就不写了,具体步骤如下。

    一、场景设置

    1、如下图所示,在GameObject里面,选择需要的东西,在场景一拖就可以创建相应的物体了。


    除了默认自带的摄像机和光源,我们要设置3个立方体,2个球,1个地面。

    在设置的时候,还可以像画图、Flash、C#那样用CTRL+C、CTRL+V复制、粘贴物体。

    2、之后,点击任意一个物体,再右边的Inspector就可以设置相应的属性。这和C#设置控件的基本控件,和Flash设置资源的属性不就是同一个意思吗?

    不过由于在3D界面不像2D那样好控制组件的位置,基本上我们是需要在Inspector界面的Transform项,直接输入坐标控制物体的位置。

    如下图所示(在没有设置材质之前,这些东西应该都是白色的),默认情况下,Y是上下方向,XZ是平面的纵横,这就是公认的三维笛卡儿坐标系设置,没什么好说的。


    各个组件的坐标Position,旋转Rotation和缩放Scale如下图所示。Position指坐标,物体中心点所处的位置,所以如果物体要放在Plane上面,则要处于Y轴0.5的位置,Rotation指的是物体绕哪一轴旋转的角度,Scale则是单位物体的XYZ轴半径沿此轴拓宽的多少。

    理论上,刚才GameObject中所有单位的立体靠各种坐标偏移,角度偏移与形变能表示三维世界的所有东西,就像二维世界的所有东西,是由点、直线、曲线所组成。


    3、物体设置好之后,我们则要给各个物体上色,也就是给各个物体贴上材质。这里不要有windows自带颜色版的惯性思维,“颜色”也就是材质,不是说有就有,直接能在Inspector中设置的,是需要我们自己新建的,具体如下:


    以上只是设置简单的纯色材质。材质的设置在3D领域同样是一种学问,就像如何用HTML+CSS的颜色配搭弄好一个网页一样。

    这里设置材质,只是基本的入门,未来这个方面肯定可以深究一番。

    现在游戏美工缺,高收入也就是因为如此,材质可以说是2D美工的3D版。

    言归正传,如图设置黑色材质给予地板,蓝色材质给予预设为不能动的物理,红色材质设定给我们中间的主角。

    4、至此,场景终于布置完毕,如下图所示,选择各个物体(2个球体、3个立方体),【Component】->【Physics】->【Rigidbody】,将所有物体设置为刚体,用于真实的物理碰撞之后,则可以进行脚本的编写。


    二、脚本编写

    显然按钮是通过脚本创建的。

    如何新建脚本在《【Unity3D】Helloworld》(点击打开链接)说过了,这里就不再赘述了。

    给予如下的脚本给中间的红色立方体。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.SceneManagement;//重新开始游戏,切换场景SceneManager.LoadScene("Scene1");需要。
    using UnityEngine;
    
    public class script : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        //初始化变换方法。
        public Transform transform;
        void Awake()
        {
            transform = this.GetComponent<Transform>();
        }
    
        float moveSpeed = 20;//物体移动速度
    
        void OnGUI()//OnGUI用于画面绘制
        {
            //这里的rect就是指在左上角坐标(10,10)这个100x30像素的区域位置。
            if (GUI.Button(new Rect(10, 10, 100, 30), "向左旋转30度"))//GUI.Button用于创建按钮
            {
                transform.Rotate(-Vector3.up * 30);//30就是指30度
            }
            if (GUI.Button(new Rect(110, 10, 100, 30), "向右旋转30度"))
            {
                transform.Rotate(Vector3.up * 30);
            }
            if (GUI.Button(new Rect(210, 10, 100, 30), "重新开始"))
            {
                SceneManager.LoadScene("Scene1");//Application下的方法已经被标识过期
            }
            if (GUI.Button(new Rect(10, 50, 100, 30), "向上移动"))
            {
                transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
            }
            if (GUI.Button(new Rect(110, 50, 100, 30), "向下移动"))
            {
                transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);//Time.deltaTime指一帧时间,这样据说可以平滑视觉差
            }
            if (GUI.Button(new Rect(210, 50, 100, 30), "向左移动"))
            {
                transform.Translate(-Vector3.right * moveSpeed * Time.deltaTime);
            }
            if (GUI.Button(new Rect(310, 50, 100, 30), "向右移动"))
            {
                transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
            }
            GUI.Label(new Rect(10, 100, 400, 30), "模型位置" + transform.position);//transform.position可以获取模型位置
        }
    }
    

    具体请看注释。

    Unity3D里面没有向后移动和像左移动,统一用负的.forward和负的.right实现。

    Vector3直接可以使用,无须初始化,一般是指给赋予脚本的对象。

    SceneManager.LoadScene("Scene1");在Unity3D内部调试时候,灯光会因场景重置变暗,但发布成exe之后不会有这样的问题。

    展开全文
  • 今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项具体内容,而是博主在经过大量的实践后所得的感悟。今天的文章从内容上可以分为2种模式、1个组件、1种模型,希望对大家学习Unity3D起到...

            各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址blog.csdn.net/qinyuanpei。今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项具体内容,而是博主在经过大量的实践后所得的感悟。今天的文章从内容上可以分为2种模式、1个组件、1种模型,希望对大家学习Unity3D起到良好的推动作用。好了,下面我们就正式开始今天的文章吧。

     

            一、2种模式

           众所周知,角色控制有第一人称和第三人称两种情况,在RPG游戏中通常以第三人称的形式出现。而对于第三人称角色控制而言,通常有2种模式。

           第一种模式中,角色在Z轴方向向前或者向后移动、绕自身Y轴旋转。当角色旋转时,摄像机会根据角色旋转的角度旋转到对应的位置,使摄像机始终正对着角色的背面,这样玩家在控制角色的过程中,只能看到玩家的背面。当角色移动时,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。采用这种模式的代表游戏是《仙剑奇侠传四》,这种模式的优点是操作简单,依靠四个方向键就可以完成角色的控制。这种模式的缺点同样很明显,因为摄像机始终面向角色背面,所以玩家无法看到角色的正面。从这个角度上来说,这种模式不能称之为真正的3D,因为玩家的视角是锁死的。那么在Unity3D中如何实现这种模式的角色控制呢?我们只需要为Main Camera添加一个SmoothFollow脚本,这样我们就可以使摄像机始终面向玩家的背面。对于角色这部分,我们只需要完成Z轴方向上的前进与后退,Y轴方向上的旋转即可。这部分脚本我们将放在后面来讲,因为这里需要用到一个重要的组件。


           下面来介绍第二种模式,这种模式是现下网游中较为流行的模式,在这种模式下,玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。这种模式的代表作有《古剑奇谭》、《仙剑奇侠传五前传》等。这种模式的优点是玩家可以自由地对角色进行观察,是真正意义上的3D。可是它不是没有缺点啊,在控制角色的时候,玩家需要双手同时进行操作。这种模式在Unity3D中的实现同样需要SmoothFollow脚本,不过需要克服对旋转角度的追踪。此外,我们还需要一个相机控制的脚本,这样我们可以在360度地欣赏游戏中的美丽场景。同样地,脚本我们放在后面来讲。


     

           二、1个组件

           在Unity3D中有一个称为角色控制器(CharacterController)的组件,从这个名称,我们就可以知道它是一个用来控制角色的组件。虽然通过Transform的方式同样可以实现角色的控制,可是相比Transform的方式,角色控制器具备了更为优越的特性。具体地说,角色控制器允许开发者在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。按照博主的理解就是角色控制器具备Rigidbody组件的部分属性,如果使用角色控制器就可以不用用Rigidbody组件了。事实上,角色控制器可以忽略场景中重力的影响,但是受制于碰撞。这句话怎么理解呢?博主举一个例子,比如我们需要使角色受制于碰撞的影响,所以我们可以为角色添加一个刚体(Rigidbody),可是我们同时不希望当角色和场景中的静态物体碰撞时被撞飞,固然我们可以通过限制角色在碰撞过程中的角度和位置变化来实现这样的效果,可是事实上如果角色和场景中的物体发生了碰撞,其碰撞的结果通常是不受玩家控制的,尤其是角色启用重力因素后,对于碰撞结果的控制会显得更加艰难。那么角色控制器就是为了满足这样一个需求而产生的。具体地说,通过角色控制器我们可以实现这样的需求:

            1、重力控制 由于CharacterController不受场景的重力影响,所以,设计者可以自行添加重力因素。例如在CharacterController组件中有一个isGrounded的属性,该属性可以判断角色是否位于地面上。需要注意的是,CharacterController依赖于碰撞,即地面和角色都需要有碰撞体才可以,一个较为有效的方法是使用标准的碰撞体如Box、Sphere、Capsule来作为一个模型的父容器。具体地应用我们会在最后的脚本部分给出来。

             2、爬楼梯 CharacterController.stepOffset属性使得角色具备了爬楼梯的能力,它是一个以米为单位的角色控制器的台阶偏移量,表示角色在垂直方向上台阶的高度。试想我们如果使用Transform方式实现这样的效果,恐怕我们需要费一番周折了,好在CharacterController可以帮助我们轻松地实现这样的功能,让玩家在游戏世界里更为自由和充满乐趣。

             3、爬斜坡 和stepOffset属性类似,slopeLimit可以设置允许角色攀爬的最大角度。利用这一属性最为显著的实例是在起伏的地面上控制角色,如果我们使用Transform方式来移动角色,可能会出现角色从地面上穿过去这样的情况,显然CharacterController再次让我们的问题变得简单。

          关于更多CharacterController的特性大家可以自行查阅API文档,

          然而不过无可否认的是CharacterController让我们控制角色变得更为简单,这一点大家可以在具体的项目中得到较为深刻的体会。

     

          三、1种模型

           如果说角色控制器的出现让我们控制角色变得更为简单,那么下面要讲的Locomotion模型将会让我们控制动画变得更为简单,特别强调是在控制角色移动动画的时候。关于Locomotion系统,我们可以把它当做是一个预制的动画模板,它定义了角色具体的状态下应该采用什么样的动画,而这一切的载体就是Unity3DMecanim动画系统。或许我们对于Locomotion模型不甚了解,可是我们会在Unity3D官方的示例项目中找到它的身影。使用Locomotion模型需要导入相应的资源包,我们可以在Unity3D资源商店里下载一个名为Mecanim Locomotion System StartKit的资源包,这样我们就可以在项目中使用Locomotion模型了。从官方的介绍中博主得知该模型主要的用途是能够自动混合关键帧或捕捉动画的走和跑的循环并且调整腿部骨骼的运动来保证脚步能正确地落在地面上。这个模型能调整并改变动画的速率和曲线以任何速率、方向、曲率、步幅从一个简单平面到任何倾斜角度的地形。在英文中Locomotion是运动的意思,所以这是一个提供角色运动支持的东西。可是博主目前并没有发现它在适应不同地形方面的特性,所以这里我们实际上还是在说Mecamin动画系统。这里我们以该资源包里的示例项目来讲解Locomotion模型。如图,在Animator窗口中可以看到它是一个Mecanim动画:


            如果大家熟悉Mecanim的话,可以很清楚地看出来它关联了多种动画状态。或许在不同的项目中,大家设计的Mecamim动画可能会有所不同,不过它的实质是一样的。我们继续来看这个资源包为我们提供的东西,在Script文件夹下我们可以看到一个Locomotion的脚本,这个脚本是我们使用Locomotion模型的前提,打开脚本我们会发现,这是对Unity3D Mecanim API的一种封装。

    using UnityEngine;
    using System.Collections;
    
    public class Locomotion
    {
        private Animator m_Animator = null;
        
        private int m_SpeedId = 0;
        private int m_AgularSpeedId = 0;
        private int m_DirectionId = 0;
    
        public float m_SpeedDampTime = 0.1f;
        public float m_AnguarSpeedDampTime = 0.25f;
        public float m_DirectionResponseTime = 0.2f;
        
        public Locomotion(Animator animator)
        {
            m_Animator = animator;
    
            m_SpeedId = Animator.StringToHash("Speed");
            m_AgularSpeedId = Animator.StringToHash("AngularSpeed");
            m_DirectionId = Animator.StringToHash("Direction");
        }
    
        public void Do(float speed, float direction)
        {
            AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0);
    
            bool inTransition = m_Animator.IsInTransition(0);
            bool inIdle = state.IsName("Locomotion.Idle");
            bool inTurn = state.IsName("Locomotion.TurnOnSpot") || state.IsName("Locomotion.PlantNTurnLeft") || state.IsName("Locomotion.PlantNTurnRight");
            bool inWalkRun = state.IsName("Locomotion.WalkRun");
    
            float speedDampTime = inIdle ? 0 : m_SpeedDampTime;
            float angularSpeedDampTime = inWalkRun || inTransition ? m_AnguarSpeedDampTime : 0;
            float directionDampTime = inTurn || inTransition ? 1000000 : 0;
    
            float angularSpeed = direction / m_DirectionResponseTime;
            
            m_Animator.SetFloat(m_SpeedId, speed, speedDampTime, Time.deltaTime);
            m_Animator.SetFloat(m_AgularSpeedId, angularSpeed, angularSpeedDampTime, Time.deltaTime);
            m_Animator.SetFloat(m_DirectionId, direction, directionDampTime, Time.deltaTime);
        }	
    }

        如果我们需要对角色进行控制,只需要使用下面的代码:

     /// <summary>
    /// 
    /// </summary>
    
    using UnityEngine;
    using System;
    using System.Collections;
      
    [RequireComponent(typeof(Animator))]  
    
    //Name of class must be name of file as well
    
    public class LocomotionPlayer : MonoBehaviour {
    
        protected Animator animator;
    
        private float speed = 0;
        private float direction = 0;
        private Locomotion locomotion = null;
    
    	// Use this for initialization
    	void Start () 
    	{
            animator = GetComponent<Animator>();
            locomotion = new Locomotion(animator);
    	}
        
    	void Update () 
    	{
            if (animator && Camera.main)
    		{
                JoystickToEvents.Do(transform,Camera.main.transform, ref speed, ref direction);
                locomotion.Do(speed * 6, direction * 180);
    		}		
    	}
    }

           我们发现此时我们的脚本变得简单了许多,因为大量的脚本被转移到了Locomotion脚本中。而这就是博主想为大家介绍的Locomotion模型,通过该模型我们可以更容易地控制角色,不过恕博主直言,在国内如果采用这种模型来做游戏的话,可能会不太适应我们自己的游戏。因为在《仙剑奇侠传五》中最初就是因为采用类似这种的自动视角,导致游戏最初的游戏体验并不是很完美。再者像《仙剑奇侠传》、《古剑奇谭》这类中国传统风格的游戏在美学设计上更倾向于好看而不是真实,所以直接采用这样的模型会有点困难。不过还是那句话,我们不能因为某些客观的因素就停止学习啊,好了,Locomotion就先说到这里吧,下面我们来重点讲解脚本。

        下面讲述如何使用角色控制器来控制角色,我们一起来看下面的脚本:

    using UnityEngine;
    using System.Collections;
    
    public class PlayerController : MonoBehaviour {
    	
    	//移动速度
    	public float MoveSpeed=1.5F;
    	//奔跑速度
    	public float RunSpeed=4.5F;
    	//旋转速度
    	public float RotateSpeed=30;
    	//重力
    	public float Gravity=20;
    	//动画组件
    	private Animator mAnim;
    	//声音组件
    	private AudioSource mAudio;
    	//速度
    	private float mSpeed;
    	//移动方式,默认为Walk
    	public TransportType MoveType=TransportType.Walk;
    	//游戏管理器
    	private GameManager mManager;
    	//角色控制器
    	private CharacterController mController;
    	
    
    	void Start () 
    	{
    	   //获取动画组件
    	   mAnim=GetComponentInChildren<Animator>();
    	   //获取声音组件
    	   mAudio=GetComponent<AudioSource>();
    	   //获取游戏管理器
    	   mManager=GameObject.Find("GameManager").GetComponent<GameManager>();
    	   //获取角色控制器
    	   mController=GetComponent<CharacterController>();
    	}
    
    	void Update () 
    	{
    		//只有处于正常状态时玩家可以行动
    		if(mManager.Manager_State==GameState.Normal)
    		{
    	        MoveManager();
    	    }
    	}
        
    	//移动管理
    	void MoveManager()
    	{
    		//移动方向
    		Vector3 mDir=Vector3.zero;
    		if(mController.isGrounded)
    		{
    	       if(Input.GetAxis("Vertical")==1)
    	       {
    		      SetTransportType(MoveType);
    			  mDir=Vector3.forward * RunSpeed * Time.deltaTime;
    	       }
    	       if(Input.GetAxis("Vertical")==-1)
    	       {
    		      SetTransportType(MoveType);
    			  mDir=Vector3.forward * -RunSpeed * Time.deltaTime;
    	       }
    	       if(Input.GetAxis("Horizontal")==-1)
    	       {
    		      SetTransportType(MoveType);
    		      Vector3 mTarget=new Vector3(0,-RotateSpeed* Time.deltaTime,0);
    		      transform.Rotate(mTarget);
    	       }
    	       if(Input.GetAxis("Horizontal")==1)
    	       {
    		      SetTransportType(MoveType);
    		      Vector3 mTarget=new Vector3(0,RotateSpeed* Time.deltaTime,0);
    		      transform.Rotate(mTarget);
    	       }
    	       if(Input.GetAxis("Vertical")==0 && Input.GetAxis("Horizontal")==0)
    	       {
    		      mAnim.SetBool("Walk",false);
    		      mAnim.SetBool("Run",false);
    	       }
    	   }
    		//考虑重力因素
    		mDir=transform.TransformDirection(mDir);
    		float y=mDir.y-Gravity *Time.deltaTime;
    		mDir=new Vector3(mDir.x,y,mDir.z);
    		mController.Move(mDir);
    
    	   //使用Tab键切换移动方式
    	   if(Input.GetKey(KeyCode.Tab))
    	   {
    		  if(MoveType==TransportType.Walk){
    			MoveType=TransportType.Run;
    		  }else if(MoveType==TransportType.Run){
    			MoveType=TransportType.Walk;
    		  }
    	   }
    	}
    
    
        
    	//设置角色移动的方式
    	public void SetTransportType(TransportType MoveType)
    	{
    	   switch(MoveType)
    	   {
    			case TransportType.Walk:
    				MoveType=TransportType.Walk;
    				mAnim.SetBool("Walk",true);
    				mSpeed=MoveSpeed;
    				break;
    			case TransportType.Run:
    				MoveType=TransportType.Run;
    				mAnim.SetBool("Run",true);
    				mSpeed=RunSpeed;
    				break;
    	   }
    	}
    
    }
    
         以上这段脚本是博主在做的一个游戏中使用的代码,在这段脚本中你可以看到博主是如何利用CharacterController来控制角色的,即根据玩家的输入轴计算移动方向,如果玩家不在地面上(通过isGrounded属性来判断),则需要考虑重力因素,理论上角色从高处下落的时候应该是加速运动,根据物理学公式h=1/2gt^2,这里只是为了模拟重力,所以采用了简化的匀速运动,希望大家注意。这里还可以进一步扩展,比如我们所熟悉的经典射击游戏CS,玩家是可以跳跃的,那么利用角色控制器来实现这种效果该怎么做呢?很简单,这和模拟重力是一样的,即设定一个跳跃速度,如果玩家按下了空格键,则改变mDir中的y即可。这里我们使用的是第一种控制模式,即锁视角的控制模式,可能是因为博主最早接触的3D游戏是《仙剑奇侠传四》吧,所以博主更喜欢这样的控制模式。在这段脚本中有一个SetTransportType()的方法,用来切换角色移动的方式,主要是切换动画和移动速度。我知道很多朋友对不锁视角的控制模式可能更感兴趣,因为这是目前的主流,例如《新剑侠传奇》在宣传之初就以不锁视角、即时战斗作为主要的噱头,不过游戏发布后效果并没有预期的那样好,好在游戏制作方敢于承担错误,及时将游戏回炉重铸,足以看出制作方想做好游戏的诚意。不过,这种模式博主该没有研究出来,现在手上有了新模型,所以有时间的话博主会尝试这种新的模式,希望大家关注我的博客啊,博主会不定期地更新博客的。那么下面为大家分享一个从《UnityChan》找到的关于相机控制部分的脚本,可以实现对角色的自由观察。下面给出脚本:

    //CameraController.cs for UnityChan
    //Original Script is here:
    //TAK-EMI / CameraController.cs
    //https://gist.github.com/TAK-EMI/d67a13b6f73bed32075d
    //https://twitter.com/TAK_EMI
    //
    //Revised by N.Kobayashi 2014/5/15 
    //Change : To prevent rotation flips on XY plane, use Quaternion in cameraRotate()
    //Change : Add the instrustion window
    //Change : Add the operation for Mac
    //
    
    
    
    
    using UnityEngine;
    using System.Collections;
    
    namespace CameraController
    {
    	enum MouseButtonDown
    	{
    		MBD_LEFT = 0,
    		MBD_RIGHT,
    		MBD_MIDDLE,
    	};
    
    	public class CameraController : MonoBehaviour
    	{
    		[SerializeField]
    		private Vector3 focus = Vector3.zero;
    		[SerializeField]
    		private GameObject focusObj = null;
    
    		public bool showInstWindow = true;
    
    		private Vector3 oldPos;
    
    		void setupFocusObject(string name)
    		{
    			GameObject obj = this.focusObj = new GameObject(name);
    			obj.transform.position = this.focus;
    			obj.transform.LookAt(this.transform.position);
    
    			return;
    		}
    
    		void Start ()
    		{
    			if (this.focusObj == null)
    				this.setupFocusObject("CameraFocusObject");
    
    			Transform trans = this.transform;
    			transform.parent = this.focusObj.transform;
    
    			trans.LookAt(this.focus);
    
    			return;
    		}
    	
    		void Update ()
    		{
    			this.mouseEvent();
    
    			return;
    		}
    
    		//Show Instrustion Window
    		void OnGUI()
    		{
    			if(showInstWindow){
    				GUI.Box(new Rect(Screen.width -210, Screen.height - 100, 200, 90), "Camera Operations");
    				GUI.Label(new Rect(Screen.width -200, Screen.height - 80, 200, 30),"RMB / Alt+LMB: Tumble");
    				GUI.Label(new Rect(Screen.width -200, Screen.height - 60, 200, 30),"MMB / Alt+Cmd+LMB: Track");
    				GUI.Label(new Rect(Screen.width -200, Screen.height - 40, 200, 30),"Wheel / 2 Fingers Swipe: Dolly");
    			}
    
    		}
    
    		void mouseEvent()
    		{
    			float delta = Input.GetAxis("Mouse ScrollWheel");
    			if (delta != 0.0f)
    				this.mouseWheelEvent(delta);
    
    			if (Input.GetMouseButtonDown((int)MouseButtonDown.MBD_LEFT) ||
    				Input.GetMouseButtonDown((int)MouseButtonDown.MBD_MIDDLE) ||
    				Input.GetMouseButtonDown((int)MouseButtonDown.MBD_RIGHT))
    				this.oldPos = Input.mousePosition;
    
    			this.mouseDragEvent(Input.mousePosition);
    
    			return;
    		}
    
    		void mouseDragEvent(Vector3 mousePos)
    		{
    			Vector3 diff = mousePos - oldPos;
    
    			if(Input.GetMouseButton((int)MouseButtonDown.MBD_LEFT))
    			{
    				//Operation for Mac : "Left Alt + Left Command + LMB Drag" is Track
    				if(Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftCommand))
    				{
    					if (diff.magnitude > Vector3.kEpsilon)
    						this.cameraTranslate(-diff / 100.0f);
    				}
    				//Operation for Mac : "Left Alt + LMB Drag" is Tumble
    				else if (Input.GetKey(KeyCode.LeftAlt))
    				{
    					if (diff.magnitude > Vector3.kEpsilon)
    						this.cameraRotate(new Vector3(diff.y, diff.x, 0.0f));
    				}
    				//Only "LMB Drag" is no action.
    			}
    			//Track
    			else if (Input.GetMouseButton((int)MouseButtonDown.MBD_MIDDLE))
    			{
    				if (diff.magnitude > Vector3.kEpsilon)
    					this.cameraTranslate(-diff / 100.0f);
    			}
    			//Tumble
    			else if (Input.GetMouseButton((int)MouseButtonDown.MBD_RIGHT))
    			{
    				if (diff.magnitude > Vector3.kEpsilon)
    					this.cameraRotate(new Vector3(diff.y, diff.x, 0.0f));
    			}
    				
    			this.oldPos = mousePos;	
    
    			return;
    		}
    
    		//Dolly
    		public void mouseWheelEvent(float delta)
    		{
    			Vector3 focusToPosition = this.transform.position - this.focus;
    
    			Vector3 post = focusToPosition * (1.0f + delta);
    
    			if (post.magnitude > 0.01)
    				this.transform.position = this.focus + post;
    
    			return;
    		}
    
    		void cameraTranslate(Vector3 vec)
    		{
    			Transform focusTrans = this.focusObj.transform;
    
    			vec.x *= -1;
    
    			focusTrans.Translate(Vector3.right * vec.x);
    			focusTrans.Translate(Vector3.up * vec.y);
    
    			this.focus = focusTrans.position;
    
    			return;
    		}
    
    		public void cameraRotate(Vector3 eulerAngle)
    		{
    			//Use Quaternion to prevent rotation flips on XY plane
    			Quaternion q = Quaternion.identity;
     
    			Transform focusTrans = this.focusObj.transform;
    			focusTrans.localEulerAngles = focusTrans.localEulerAngles + eulerAngle;
    
    			//Change this.transform.LookAt(this.focus) to q.SetLookRotation(this.focus)
    			q.SetLookRotation (this.focus) ;
    
    			return;
    		}
    	}
    }
    
       下面是演示效果:

    1、Locomotion演示



    2、角色控制器演示(为节省容量只好牺牲质量啦.......)


    好了,感谢大家关注我的博客,今天的内容就是这样了,希望大家喜欢。


    每日箴言当我真心在追寻着我的梦想时,每一天都是缤纷的,因为我知道每一个小时都是在实现梦想的一部分。—— 保罗·科埃略





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


    展开全文
  • Unity3D旋转无效

    2014-10-10 17:14:16
    我常常把摄像机的画面输出到plane上,所以

    我常常把摄像机的画面输出到plane上,所以要把plane旋转到适合的角度。

    1. 如果先把plane的x旋转270,这时候整个画面是倒过来的,这时候如果我去调整z的旋转值,却变成调整的是y的值,很奇怪。

    2. 解决办法不要让x旋转那么大幅度,x旋转90,y旋转180就好,我在想,每个轴旋转的值是不是不需要旋转超过180就可以达到想要的位置?

    另外在x旋转90后,调整y和z的值的效果是一样的......所以最终的结果可以是90,180,0   也可以是90,0,180

    太奇怪了

    展开全文
  • 本章主要是 Unity3D 的基础快速入门篇,通过本章的学习,能让初学者们快速的掌握和 应用 Unity3D 软件。 本章导读 本章无论对于 Unity3D 初学者、或是以前从事建模工作的设计师、又或者是从事过 3D 编程的人群,...

    本章主要是 Unity3D 的基础快速入门篇,通过本章的学习,能让初学者们快速的掌握和
    应用 Unity3D 软件。
    本章导读
    本章无论对于 Unity3D 初学者、或是以前从事建模工作的设计师、又或者是从事过 3D
    编程的人群,在转向 Unity3D 的学习的时候,学习本章内容都极有必要的。通过本章节内容
    的学习,你可以迅速的掌握 Unity3D 的软件结构,各个板块具体的功能和作用以及场景制作
    流程等等。本章节可以说是全书的根基,只要你能把本章节的内容掌握熟悉,那在今后的日
    子里面开发任何的游戏可以说是事半功倍。这就像运动员们在小的时候打好了坚实的基础,
    再向今后的专业突破的时候,就感觉游刃有余,几乎不费吹灰之力就拿下任何一个项目。
    对于有一定 Unity3D 基础的人群而言,笔者也强力建议在有充足时间的情况下,耐心的
    阅读下本章节的内容。因为笔者时常在网上发现一些 Unity3D 早期的开发者,往往对一些 U
    nity3D 很基础性的功能莫不着头脑。这不能怨这些开发者的水品不够,而是有许多 Unity3D
    的功能在长期未被使用的情况下,被他们遗忘了,突然有一天需要使用的时候,就抓了狂,
    发了疯。
    另外笔者要在这里提醒一下建模设计师,可能你们在原先的行业里面已经将 3DS MA
    X、Maya 等建模软件摸索得相当熟练了,但游戏场景和影视场景还是存在很大的差异。首
    先最大的差异就在于灯效的实时性,游戏讲究的是动态灯光,追求与游戏者视觉互动;而影
    视灯光则是一种静态的逐帧灯光,所有效果都被渲染成一张张静态的连续图片,它们主要倾
    向与影迷们的观赏互动;前者比较主动,而后者相对来说比较被动。前者在使用灯效处理的
    时候受硬件的局限性大,面对的客户群体需要有所区分;后者在观赏灯效处理的时候,几乎
    不受任何计算机硬件的影响,面对的客户群体也比较广泛。

    1.1 界面入门


    如图 1-1 所示为 Unity3D 最经典 2 by 3 结构界面,上面呈现了 Unity3D 最为常用的几
    个面板,下面为各个面板的详细说明。
      Scene【场景面板】:该面板为 Unity3D 的编辑面板;你可以将你所有的模型、灯光、
    以及其他材质对象拖放到该场景中。构建游戏中所能呈现景象。
      Game【游戏面板】:与场景面板不同,该面板是用来渲染场景面板中景象的。该面
    板不能用作编辑,但却可以呈现完整的动画效果。
      Hierarchy【层次清单栏】:该面板栏主要功能是显示放在场景面板中所有的物体对
    象。
      Project【项目文件栏】:该面板栏主要功能是显示该项目文件中的所有资源列表。
    除了模型、材质、字体等,还包括该项目的各个场景文件。
      Inspector【监视面板】:该面板栏会呈现出任何对象的所固有的属性,包括三维坐
    标、旋转量、缩放大小、脚本的变量和对象等等。
      【场景调整工具】:可改变你在编辑过程中的场景视角、物体世界坐标和本地坐标
    的更换、物体法线中心的位子,以及物体在场景中的坐标位置,缩放大小等等。
      【播放、暂停、逐帧按钮】:用于运行游戏,暂停游戏和逐帧调试程序。
      【层级显示按钮】:勾选或取消该下拉框中对应层的名字,就能决定该层中所有物
    体是否在场景面板中被显示。
      【版面布局按钮】:调整该下拉框中的选项,即可改变编辑面板的布局。
      【菜单栏】:和其他软件一样,包含了软件几乎所有要用到的工具下拉菜单。
    除了 Unity3D 初始化的这些面板而外,你还可以通过“Add Tab”按钮和菜单栏中的“W
    indow”下拉菜单中,增添其他面板和删减现有面板。特别是“Window”下拉菜单中的“Li
    ghtmapping”和“Occllusion Culling”面板对游戏的后期优化尤为管用。除此而外还有用
    于制作动画文件的 Animation【动画面板】,用于观测性能指数的 profiler【分析器面板】,
    用于购买产品和发布产品的 Asset Store【资源商店】,用于控制项目版本的 Asset Server
    【资源服务器】,用于观测和调试错误的 Console【控制台面板】。
    在【菜单栏】中包含有八个菜单选项:分别是 File【文件】、Edit【编辑】、Assets【资
    源】、GameObject【游戏对象】、Component【组件】、Terrain【地形】、Window【窗口】、He
    lp【帮助】。这些是 Unity3D 中最标准的菜单选项卡,其各自又有自己的子菜单,表 1-1 中
    列出了各个菜单栏以及它们所包含的下拉菜单及其译名,仅供读者参考。

    主菜单  包含的子菜单

    File【文件】

    New Scene【新建场景】
    Open Scene【打开场景】
    Save Scene 【保存场景】
    Save Scene as…【场景另存为…】
    New Project… 【新建工程文件】
    Open Project… 【打开工程文件】
    Save Project 【保存工程文件】
    Build Settings… 【创建设置】(这里可以设置你的游戏将要以
    何种方式发布,发布的场景文件又包含那些)
    Build & Run 【创建并运行】(这里以“Build Settings”里设
    置好的方式,发布并运行游戏)
    Exit 【退出】

    Edit【编辑】

    Undo 【撤销上一步操作】
    Redo 【恢复被撤销的操作】
    Cut 【剪切】
    Copy 【拷贝】
    Paste 【粘贴】
    Duplicate 【复制】
    Delete 【删除】
    Frame Selected 【在编辑场景中最大化显示被选中的物体】
    Select All 【全选编辑面板中的所有物体】
    Preferences… 【首选参数设置】
    Play 【播放】(如果游戏已经开始播放,点此按钮代表停止播
    放)
    Pause 【暂停】
    Step 【逐帧播放游戏】
    Load selection 【载入所选】(与“Save selection”【存储所选】
    联合使用,你可以把它理解为一个临时的快捷键,帮你快速的
    找到特定的以被存储的物体对象。)
    Save selection 【存储所选】(与“Load selection”【载入所选】
    联合使用,你可以把它理解为一个临时的快捷键,帮你快速的
    找到特定的以被存储的物体对象。)
    Project Settings 【工程文件设置】(包含了该工程项目的“Inp
    ut”【热键】、“Tags”【标签管理】、“Audio”【音频设置】、“Ti
    me”【时间设置】、“Player”【播放器设置】、“Physics”【默认仿
    真物理设置】、“Quality”【播放质量参数设置】、“NetWork”【网
    络工作参数设置】、“Editor”【编辑器设置】)“Script Execution
    Order”【脚本编译顺序设置】
    Render settings 【渲染设置】(默认渲染参数设置,包括环境光,
    周围的雾化程度,环境颜色等等一系列参数的设定)
    Network emulation 【网络仿真】(由于你制作的游戏将会在不
    同的网络环境中工作,所以需要这个参数来模拟不同的网络工
    作环境)
    Graphics emulation 【图形卡仿真】(由于你制作的游戏将会在
    不同的图形卡环境中工作,所以将需要这个参数来模拟不同硬
    件条件下的游戏显示质量)
    Snap settings 【捕捉设置】(和 3Ds Max 的“栅格和捕捉设置”
    类似。)

    Assets 【资源】

    Create 【创建】(包含有“Folder”【文件夹】、“JavaScript”【Ja
    vaScript 编程脚本】、“C# Script”【C#编程脚本】、“Boo Script”
    【Boo 编程脚本】、“Shader”【着色语言】、“Prefab”【预置物体】、
    “Material”【材质】、“Animation”【动画】、“Cubemap”【立方
    体贴图】、“Lens Flare”【镜头光晕】、“Custom Font”【自定义
    字体】、“Render Texture”【渲染纹理】、“Physic Material”【物
    理材质】、“GUI Skin”【用户图形界面皮肤】)
    Show in Explor 【显示项目资源所在的文件夹】
    Open【打开选中的资源】
    Delete【删除选定资源】
    Import New Asset... 【导入新的资源】
    Import Package...【导入资源包】
    Export Package... 【导出资源包】
    Select Dependencies 【选择相关联的文件】
    Export compressed audio file... 【导出压缩的音频文件】
    Refresh 【刷新】
    Reimport 【重新导入选中的资源】
    Reimport All 【重新导入所有的资源文件】
    Sync MonoDevelop Project 【与 Mono 项目文件同步】

    GameObject【游戏项目】

    Create Empty【创建空的游戏对象】
    Create Other 【创建其他组件】(包含了“Particle System”【粒
    子系统】、“Camera”【摄像机】、“GUI Text”【图形用户界面文
    本】、“GUI Texture”【图形用户界面图片】、“3D Text”【3D 文
    字】、“Directional Light”【平行光】、“Point Light”【点光源】、
    “Spotlight”【聚光灯】、“Cube”【立方体】、“Sphere”【球】、“C
    apsule”【胶囊】、“Cylinder”【圆筒】、“Plane”【平面】、“cloth”
    【布料】、“Audio Reverb Zone”【声音回响区域】、“Ragdoll..”
    【布娃娃系统】、“Tree”【植被树系统】、“Wind Zone”【风的区
    域】)
    Center On Children 【归位到子物体中心点】
    Make Parent 【创建父集】(必须选择两个以上的物体才能使用
    该命令,最先被选中的物体为父级对象,其余的对象都为该对
    象的子集)
    Clear Parent 【取消父集】(取消被选中物体与它上一个父级之
    间的父子级关系)
    Apply Changes To Prefab 【改变影响预制物体】(如果你在场
    景中编辑的物体是从资源面板拖拽出的预制物体,默认的情况
    下,你在场景面板中对物体做出的改变不会影响原先的预制物
    体,除非你点击该按钮)
    Move To View 【移动物体到“Scene”视窗的中心点】
    Align With View 【移动物体到“Scene”视窗的中心点,并且
    与显示口正对齐,物体中心位于显示口的中心点】
    Align View to Selected 【移动“Scene”视窗与物体对齐,并
    且显示口的中心点位于物体的中心】

    Component【组件】

    Mesh 【网格】(“Mesh Filter”【网格填充】、“Text Mesh”【文
    字网格】、“Mesh Renderer”【网格渲染】、“Combine Children”
    【合并子物体】)
    Particles 【粒子系统】(能打造出非常棒的流体效果,是制作烟
    雾、激光、火焰等效果的首选。“Ellipsoid Particle Emitter”【
    椭球粒子发射器 】,“Mesh Particle Emitter”【面片粒子发射器】,
    “Particle Animator” 【粒子动画】, “World Particle Collider” 【世
    界粒子碰撞机】,“Particle Renderer”【粒子渲染器】,“Trail Re
    nderer”【蔓延渲染】)
    Physics 【物理系统】(可使物体带有对应的物理属性)
    Audio 【音频】(可创建声音源和声音的听者)
    Rendering 【渲染】
    Miscellaneous 【杂项】
    Scripts 【脚本】(Unity 内置的一些功能很强大的脚本)
    Image Effects【图形渲染效果】(仅限专业版)
    Character【角色控制器】
    Camera-Control 【摄像机控制】

    Terrain【地形】 

     Create Terrain 【创建地形】
    Import Heightmap - Raw... 【导入高度图】
    Export Heightmap - Raw... 【导出高度图】
    Set Resolution... 【设置分辨率】
    Create Lightmap... 【创建光影图】
    Mass Place Trees... 【批量种植树】
    Flatten Heightmap... 【展平高度图】
    Refresh Tree and Detail Prototypes 【刷新树及细节模型】

    Window【窗口】

    Next Window 【下个窗口】
    Previous Window 【前一个窗口】
    Layouts 【布局】
    Scene 【场景窗口】
    Game 【游戏窗口】
    Inspector 【监视窗口】(这里主要指各个对象的属性)
    Hierarchy 【层次窗口】
    Project 【项目文件窗口】
    Animation 【动画窗口】(用于创建时间动画的面板)
    Profiler 【性能探测窗口】
    Asset Store 【资源商店】
    Asset Server 【源服务器】
    Lightmapping 【灯影视图窗口】
    Occlusion Culling 【遮挡剔除窗口】
    Console 【控制台】

    Help【帮助】

    About Unity... 【关于 Unity】
    Enter serial number... 【输入序列号】
    Unity Manual 【Unity 手册】
    Reference Manual 【参考手册】
    Scripting Manual 【脚本手册】
    What’s New 【最新功能】
    Unity Forum 【Unity 论坛】
    Unity Answers 【Unity 在线答疑】
    Unity Feedback 【Unity 使用信息反馈】
    Welcome Screen 【欢迎窗口】
    Check for Updates 【查看升级】
    Release Notes 【发行说明】
    Report a bug【软件缺陷反馈】

    展开全文
  • 一、前言 今天分享一个简单的角色移动脚本,主要用到碰撞器和刚体组件,代码简单易懂,复用性、扩展性较强,跟我一起来看看吧。 二、效果图 三、代码 using UnityEngine; public class RunTest1 : MonoBehaviour ...
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 cube cylinder sphere plane quad ...
  • Unity3d:https://unity3d.com/cn 参考百度百科:https://baike.baidu.com/item/Unity3D/3064002?fromtitle=Unity&amp;fromid=10793&amp;fr=aladdin Unity3D是由Unity Technologies开发的一个让玩家轻松创建...
  • Unity3D 2018 3.0新手入门

    2020-02-01 15:58:47
    Unity3D新手入门 学习目的: 掌握Unity3D 常用的软件操作和一些基础脚本的使用 文章目录Unity3D新手入门1.1.1 Unity3D 介绍1.2 Unity3D 下载与安装2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20. 1. 1.1 Unity...
  • 大家好,今天博主继续为大家带来Unity3D游戏开发系列文章,我们接着在上一篇文章中最后留下的那几个问题来讲解Unity3D游戏开发的相关知识。在上一篇文章最后,我们留了这样几个问题:  1、人物范围控制,换句话说...
  • 在我之前的文章《Unity3D游戏开发之小地图的实现》一文中,我为大家讲解了基于OnGUI()方法绘制贴图实现小地图的方法。那么,今天呢,博主再来为大家分享一种实现小地图的方法。在正式开始今天的文章之前,我们先来...
  • 为什么说unity3d进行游戏开发等比较方便呢?因为这个引擎将我们世界常见的物理规则抽象出来,可以另外附加给任何一个场景元素。比如,要模拟自由落体运动,你并不需要去写个“加速度”的算法,而只需要给物体添加一...
  • Unity学习笔记:Unity 3D 飞机大战 1、打开unity软件后,首先新建Quad作为背景,导入飞机模型,并为其添加刚体 然后创建C#脚本,挂载到飞机上。 2、给飞机创建子弹,让子弹成为预制体,同样创建C#脚本 3、创建陨石和...
  •  Scene【场景面板】:该面板为Unity3D的编辑面板;你可以将你所有的模型、灯光、以及其他材质对象拖放到该场景中。构建游戏中所能呈现景象。  Game【游戏面板】:与场景面板不同,该面板是用来渲染场景面板中...
  • 效果展示:     开篇废话: 我现在所在的Team每周需要一个人给大家介绍一个...由于我在大学里自学过一段时间Unity3D,所以我想介绍的技术就是它,但我现在做的是应用开发,不能做个小
  • 一、目录 【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷
  • 本文通过一个在Android中展示3D模型的实例,介绍如何将Unity3d以View的形式嵌入到Android应用中。并提供Deom和代码下载。
  • Unity3D常用API

    2017-08-13 14:36:26
    Unity3D常用API总结一. MonoBehaviour类及查询API MonoBehaviour是每个脚本的基类. MonoBehaviour常用方法及调用顺序 //最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行...
  • Unity3d编辑器的使用

    2019-06-24 19:24:43
    第一步:双击Unity3d,点击New 第二步:填写项目信息,注意:工程必须放在空文件夹下 第三步:点击创建 第四步:工程创建完毕 文件夹介绍: Assets:放项目所有资源的文件夹 Library:文件资源库 ...
1 2 3 4 5 ... 20
收藏数 1,224
精华内容 489
关键字:

plane旋转 unity3d