unity3d 模型走动_unity3d人物随机走动 - CSDN
精华内容
参与话题
  • 需要物体:一个用于移动的对象,一个主摄像机,一个地面对象 摄像机的父结点为移动对象 旋转移动坐标示意图: 用于视角移动的代码: using System.Collections;...using System.Collections.Generic;...

    需要物体:一个用于移动的对象,一个主摄像机,一个地面对象,且摄像机的父结点为移动对象
    旋转移动坐标示意图:
    在这里插入图片描述

    用于视角移动的代码(给摄像机的):

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraTrun : MonoBehaviour
    {
        // 水平视角移动的敏感度
        public float sensitivityHor = 3f;
        // 垂直视角移动的敏感度
        public float sensitivityVer = 3f;
        // 视角向上移动的角度范围,该值越小范围越大
        public float upVer = -40;
        // 视角向下移动的角度范围,该值越大范围越大
        public float downVer = 45;
        // 垂直旋转角度
        private float rotVer;
    
        // 旋转的方向问题
        // x 表示绕 x 轴旋转,即 前上后 的角度
        // y 表示绕 y 轴旋转,即 左前后 的角度
        // y 表示绕 y 轴旋转,即 左前后 的角度
    
        // Start is called before the first frame update
        void Start()
        {
            // 初始化当前的垂直角度
            rotVer = transform.eulerAngles.x;
        }
    
        // Update is called once per frame
        void Update()
        {
            // 获取鼠标上下的移动位置
            float mouseVer = Input.GetAxis("Mouse Y");
            // 获取鼠标左右的移动位置
            float mouseHor = Input.GetAxis("Mouse X");
            // 鼠标往上移动,视角其实是往下移,所以要想达到视角也往上移的话,就要减去它
            rotVer -= mouseVer * sensitivityVer;
            // 限定上下移动的视角范围,即垂直方向不能360度旋转
            rotVer = Mathf.Clamp(rotVer, upVer, downVer);
            // 水平移动
            float rotHor = transform.localEulerAngles.y + mouseHor * sensitivityHor;
            // 设置视角的移动值
            transform.localEulerAngles = new Vector3(rotVer, rotHor, 0);
        }
    }
    

    用于物体移动的控制器(给要移动的物体的):

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    // 表示一定需要这个控件
    [RequireComponent(typeof(CharacterController))]
    public class Move : MonoBehaviour {
        // 获取摄像机对象的位置信息,[SerializeField] 类似于 java 的构造方法的方法参数
        [SerializeField] private Transform target;
        // 跳起来的速度
        public float jumpSpeed = 15.0f;
        // 重力
        public float gravity = -9.8f;
        // 最终垂直速度
        public float endsVelocity = -10.0f;
        // 在地面时的垂直速度
        public float minFall = -1.5f;
        // 跑起来的速度
        public float runSpeed = 10;
        // 走路的速度
        public float walkSpeed = 4;
        // 垂直速度
        private float verSpeed;
    
        // 移动的速度
        private float moveSpeed;
        // 用于存储当前的角色控件
        private CharacterController character;
    
        // 在被加载时执行
        void Start() {
            // 初始化
            character = GetComponent<CharacterController>();
            verSpeed = minFall;
            moveSpeed = walkSpeed;
        }
        // 每更新一帧时执行
        void Update() {
            // 用于存储移动信息
            Vector3 movement = Vector3.zero;
            // 获取左右方向的移动信息
            float horspeed = Input.GetAxis("Horizontal");
            // 获取前后方向的移动信息
            float verspeed = Input.GetAxis("Vertical");
            // 当发生了移动才执行
            if (horspeed != 0 || verspeed != 0) {
                // 设置左右位置
                movement.x = horspeed * moveSpeed;
                // 设置前后的位置
                movement.z = verspeed * moveSpeed;
                // 设置斜着走的最大速度更水平垂直走的速度一样
                movement = Vector3.ClampMagnitude(movement, moveSpeed);
                // 将移动的信息转化为以摄像机为全局坐标的位置,即保证你向前走一定是摄像机的视角方向
                movement = target.TransformDirection(movement);
            }
            // 当按下左 shift 是跟换速度
            if (Input.GetKey(KeyCode.LeftShift)) {
                moveSpeed = runSpeed;
            } else {
                moveSpeed = walkSpeed;
            }
            // 角色控件自带的一个方法,用于检测是否在地面
            if (character.isGrounded) {
                // 按了空格键则给垂直方向施加一个速度
                if (Input.GetButtonDown("Jump")) {
                    verSpeed = jumpSpeed;
                } else {
                    verSpeed = minFall;
                }
            } else {
                // 若已经跳起来了则将垂直方向的速度递减降低,来达到一个 下上下 的一个效果
                // Time.deltaTime 表示为每秒的刷新频率的倒数,用来控制每台电脑的移动速度都是一样的
                verSpeed += gravity * 3 * Time.deltaTime;
                // 限制最大坠落速度
                if (verSpeed < endsVelocity) {
                    verSpeed = endsVelocity;
                }
            }
            // 给移动一个垂直速度
            movement.y = verSpeed;
            // 控制速度
            movement *= Time.deltaTime;
            // 角色控件自带的一个方法,若用 transform.Translate() 的话会无视碰撞器
            character.Move(movement);
        }
    }
    

    不懂请留言!
    问题询问:hellolxb@yeah.net

    展开全文
  • 今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置...

            大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

          今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置发射 一条经过该点的射线,则这条射线与大地平面的交点,就是我们的目标位置。那么确定了这个位置以后,我们需要做的就是让角色从原来的位置移动到这个位置,并在其间添加角色动画即可。对于角色移动的问题,如果复杂点的画我们可能要计算移动的方向向量,并针对起点和终点进行插值计算来实现,这里我们选择一种相对简单的办法,在Unity3D中,有一个LookAt()方法,该方法可以使物体发生旋转,使其z轴始终指向目标物体。再完成了旋转后,我们需要让物体沿着Z轴方向(forward)移动。这样就实现了鼠标点击控制人物走动这一功能。好了,下面我们来一起看今天的内容吧!

         首先创建一个场景,我们准备一个地形Terrain和平行光Direction Light,并拖入我们事先准备好的人物模型,如图:


       接下来为模型添加动画组件,并将动画的类型设置为Legacy模式,如图所示:



         我们设置默认的动画为idle,接下来,我们来编写脚本代码:

    using UnityEngine;
    using System.Collections;
    
    public class PeopleControl : MonoBehaviour {
    	 
    	//目标点坐标
    	private Vector3 mTargetPos;
    	
    	void Start () 
    	{
    	 
    	}
    	
    	void Update () 
    	{
    	  //按下鼠标右键时
    	  if(Input.GetMouseButton(1))
          {
    		 //获取屏幕坐标
    		 Vector3 mScreenPos=Input.mousePosition;
    		 //定义射线
    		 Ray mRay=Camera.main.ScreenPointToRay(mScreenPos);
    		 RaycastHit mHit;
    		 //判断射线是否击中地面
    		 if(Physics.Raycast(mRay,out mHit))
    		 {
    			if(mHit.collider.gameObject.tag=="Terrain")
    			{
    			   //获取目标坐标
    			   mTargetPos=mHit.point;
    			   //让主角面朝目标坐标并向目标移动
    			   transform.LookAt(mTargetPos);
    			   //播放奔跑动画
    			   transform.gameObject.GetComponent<Animation>().Play("run");
    		       transform.Translate(Vector3.forward * 0.5F);
    			}
    		 }
    	  }
    	  //松开鼠标右键时
    	  if(Input.GetMouseButtonUp(1))
    	  {
    	    transform.gameObject.GetComponent<Animation>().Play("idle");
    	  }
    	}
    }
    
           将脚本绑定到角色上以后,我们就能看到下面的效果啦,哈哈:)


           这就是今天的内容啦,当然我们还需要解决的问题还有如何在控制人物走动的时候避免和其它物体发生碰撞,以及后续的优化问题,这些内容我们会在后面的文章中为大家解答,谢谢大家!喜欢我请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei


    展开全文
  • 雨松MOMO Unity3D 游戏开发系列博文之Unity3D Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放,欢迎大家下载阅读,哇咔咔~~
  • Unity3D游戏开发FBX模型载入与人物行走动画的播放
  • c# unity3d 欢迎回来! 这是关于Unity 3D的三部分博客系列的第二部分。 在第一部分中,我们讨论了如何开始使用Unity 3D。 现在,继续前进,我们将讨论如何使用C#控制Unity 3D。 在对如何开始使用Unity 3D有了...

    c# unity3d

    欢迎回来! 这是关于Unity 3D的三部分博客系列的第二部分。 在第一部分中,我们讨论了如何开始使用Unity 3D。 现在,继续前进,我们将讨论如何使用C#控制Unity 3D。

    在对如何开始使用Unity 3D有了扎实的了解并刚刚创建了一个新项目之后,我们就离开了。

    默认情况下,我们的新项目已创建了四个文件夹:Assets,Library,ProjectSettings和Temp。 Unity3D创建并设置其自身为我们现在正在使用的默认,未保存的主题。不要害怕:这篇文章看起来很长,但是有很多屏幕截图确保您可以轻松地进行学习。

    现在到有趣的东西

    首先,让我们添加一个飞机游戏对象作为我们的世界地板。 这可以通过几种不同的方式完成。

    我们可以右键单击层次结构窗口并选择3D对象->平面,或者使用顶部工具栏并单击“游戏对象”->“ 3D对象”->“平面”。 这将添加一个游戏对象,该对象将具有一个10 x 10的网格平面,内部将绘制白色。 它还将具有一个网格碰撞器(默认情况下添加),它将在物理引擎以及我们添加到游戏对象的任何脚本中触发onCollision

    Unity3D.2.1

    设置场景

    让我们添加一种材料,以将飞机的颜色更改为绿色,以获得更像草的感觉。 为此,我们需要创建可分配给飞机的材料资产。 在“资源”窗口中右键单击,然后单击“创建”->“材料”。 这将添加我们可以编辑的新材料。 我们将此材料命名为“草”。

    Unity3D.2.2

    现在我们有了草料,我们将其拖动并分配到飞机上。 单击并将材质拖到分层视图上,然后将其放在“平面”对象上。 这会将其添加到飞机上。 现在,在分层视图中单击平面对象,这将在检查器内部显示该平面对象。 现在,在检查器的底部,我们将看到草对象材料。

    Unity3D.2.3

    让我们编辑该材质,使其比灰色更鲜艳,更像草。

    首先,我们将单击草料左侧的深灰色箭头,这将扩展草料并显示一堆可以更改的设置。

    现在,让我们仅更改反照率颜色。 我们通过单击反照率旁边的色板来执行此操作,这将调出调色板供我们使用。 让我们输入红色34,绿色86,蓝色34,并将alpha保留为255。这将为我们提供一个很好的深绿色,用作草。

    Unity3D.2.4

    现在,我们应该可以看到适合草丛的绿色飞机。

    Unity3D.2.5

    现在编辑字段的大小。 我们可以再次选择飞机,在检查器中,您将在顶部看到一个名为“变换”的对象。 这是渲染器用作位置,旋转和缩放的基础的对象。 为了使我们能够调整静态平面对象的大小,我们可以缩放对象。 比例尺包含3个不同的值,每个值与一个尺寸XY Z有关。我们可以将这些方向统一地视为x表示宽度,y表示高度,z表示长度。 Unity使用Y向上坐标系,并且由于我们使用的是平面,因此宽度和长度只有二维X和Z。 让我们将两个值都设置为10,使我们的飞机比以前大10倍。 这应该给我们足够的移动空间。

    Unity3D.2.6

    现在,我们对场景进行了一些更改,让我们将场景保存到Assets文件夹中,以便我们可以重复使用而不会丢失当前的工作。 为此,请转到工具栏,然后单击“文件”->“保存场景”。 让我们以Assets中的名称“ Main Scene”保存场景。

    Unity3D.2.7

    将对象添加到场景中

    现在,将一个对象添加到游戏世界中,使我们可以四处移动; 它将扮演我们的角色。 我们将使用多维数据集在游戏中表示这一点。 要添加多维数据集,请转到“层次结构”窗口,然后右键单击3D对象->多维数据集。

    Unity3D.2.8

    我们的场景应该看起来像这样,其中包含我们的立方体和平面。

    Unity3D.2.9

    注意我们的立方体在地面的一半。 这是因为立方体的原点或对象在其上进行变换的点位于中心。

    我们可以通过沿其Y轴将对象向上移动0.5(这是1x1x1立方体的一半)来补偿此偏移。 我们可以通过从“层次结构”视图中选择多维数据集对象并在“检查器”中找到“变换”对象来进行更改。 我们将需要将对象的位置更改为x = 0,y = 0.5,z = 0。

    Unity3D.2.10

    Unity3D遵循嵌套对象或目标模型的原理。 这意味着,一切都是父项或子项,其根是“游戏对象”。 这使我们可以将诸如网格和材质之类的东西嵌套到一个对象中,该对象可以执行一个动作或完成一个变换。

    最后,让我们第一次运行游戏世界。 编辑器顶部有三个按钮:“播放”,“暂停”和“步进”。 “播放”按钮将使用默认视图(场景窗口下方的游戏窗口)开始运行游戏。 游戏视图将显示在顶部。

    Unity3D.2.11

    按播放。 您应该看到的外观与之前的场景视图不同。 那是因为我们以前没有看过相机,而是看了“场景视图查找器”。

    Unity3D.2.12

    继续并取消选择播放。 编辑器将返回“场景视图”。

    现在,让我们看一下“主摄像机”游戏对象。 为此,请在“层次结构视图”中选择“主摄像机”。 这是我们在Game Viewer(游戏查看器)或我们的主查看摄像机中使用的对象。 像所有其他对象一样,它嵌套在具有默认转换的游戏对象中。

    Unity3D.2.13

    我们可以将对象嵌套到“主摄像机”对象中,也可以将摄像机嵌套到其他对象中,所以让我们这样做。 通过在“层次结构”视图内右键单击(未选择任何内容)并选择“创建空白”来创建新的游戏对象。 这将在场景中添加一个空的游戏对象(带有转换),从某种意义上讲,我们可以将其用作“文件夹”。 我们将其命名为“玩家”。

    Unity3D.2.14

    现在,单击并拖动“ Main Camera和“ Cube游戏对象到“ Player对象上,这会将两个对象嵌套在“播放器”下。 现在,“ Main Camera和“ Cube对象是“ Player对象(父对象)的子级。 这将使我们能够对Player对象执行操作并影响两个孩子。 如果我们移动播放器对象,则立方体和主摄像机将随它们一起移动,而无需我们进行额外的移动。

    Unity3D.2.15

    最后深入探讨一些代码

    让我们向我们的Player对象添加一个脚本以对其进行控制。 为此,请在“层次结构视图”中选择“播放器”对象,然后在检查器中单击“添加组件”。 在此处输入您要创建“ PlayerController”的脚本的名称,它将选择范围缩小到新脚本。 单击“新脚本”,这将弹出另一个菜单,询问脚本名称以及我们要选择的语言。

    对于此示例,我们将使名称等于PlayerController并选择C#作为语言。 点击“创建并添加”。 然后,这将在您的Player对象上添加一个嵌套脚本对象,并在Asset View中创建脚本。

    Unity3D.2.16

    让我们打开脚本。 双击资产查看器中的脚本,这将打开Visual Studio或MonoDevelop。 对于此示例,我将使用MonoDevelop进行代码和调试。

    Unity3D.2.17

    在此脚本中,Unity3d首先为您实现了一些功能。 首先,它包含两个using语句,第一个是UnityEngine ,其中包括与Unity游戏引擎和Unity Editor进行交互的所有库。 下一个是System.Collections ,它提供对Mono System Collections库的访问。 然后,添加一个类PlayerController ,它是从MonoBehaviour类派生的脚本名称,该类是UnityEngine库的一部分。

    它添加了两个默认功能: StartUpdate Start就像听起来一样,它是一个在构造对象后在应用程序启动时调用的函数。 每个基于Unity引擎主循环的Unity周期都会触发更新。

    Unity3D.2.18

    现在,让我们编写一些代码来使多维数据集执行某些操作,例如旋转。

    首先,我们需要掌握要对其执行操作的对象。 由于我们要立方体旋转而不是相机旋转,因此我们不想仅旋转Player对象。 因此,让我们编写一些代码来获取多维数据集。 为此,请在我们的State函数上方添加public GameObject cube 这将在我们的类中为我们提供一个称为多维数据集的对象。

    Unity3D.2.19

    该对象已创建,但我们尚未将其指向任何对象。 让我们回到Unity编辑器,然后在Hierarchy View中选择Player对象。 现在在检查器中,我们现在看到嵌套脚本对象中有一个Cube对象(游戏对象)。

    Unity3D.2.20

    这将允许我们将Cube对象拖到我们的游戏对象上以进行控制。 现在,我们可以选择Player对象下面的Cube对象,并将其拖到Cube上。 或者,您可以单击对象旁边的圆圈,它将在场景/资产列表中为您提供要使用的对象列表。

    Unity3D.2.21

    现在,让我们回到我们的代码。 现在,在我们的代码中,我们可以编写将其旋转45度,以便它位于立方体的某个点上。 因此,在我们的Start函数中,编写以下代码:
    cube.transform.Rotate( new Vector3(1,0,0), 45) 这段代码使用了我们的Cube对象,并作用于告诉它旋转的Transform对象。 第一个参数是vector3,它是3D空间中由三个维度表示的点:XYZ。在这里,我们说的是在第一个参数中,我们希望它仅作用于vector3的X维度。 我们要说的是,在第二个参数中,我们将X尺寸设置为45度,该角度应将其设置在边上。

    让我们回到Unity编辑器并按Play:

    Unity3D.2.22

    现在要说清楚了吗? 我们可以添加另一个旋转,但这一次只设置Y尺寸
    cube.transform.Rotate( new Vector3(0,1,0), 45) 再次让我们回到Unity编辑器并按Play。

    Unity3D.2.23 Unity3D.2.24

    糟糕,我们正在扎根。 这是因为我们只旋转了……而旋转时没有移动对象。 因此,因为原点仍然像以前一样位于中间,所以我们只有0.5的距离,这太近了。

    为了解决这个问题,让我们写一些代码将对象再移动0.50个单位。 让我们将代码添加到最后一个旋转的正下方,然后添加cube.transform.position = new Vector3(0,0.5,0) 现在,让我们再次按“播放”以查看结果。

    Unity3D.2.25 Unity3D.2.26

    似乎变化不大。 这是因为设置位置时,我们没有添加位置。 我们将位置设置为一个新的Vector3,它刚好与之前的位置相同。 现在要解决此问题,我们可以将当前位置添加到我们要转换到的位置上。 让我们添加
    + cube.transform.position到我们要设置位置的第11行的末尾。 Cube.transform.position是我们立方体原点的当前位置vector3。 完成此操作后,让我们再次播放。

    Unity3D.2.27 Unity3D.2.28

    用箭头移动它

    现在,我们对旋转和移动有了一些基础知识,让我们进行一个更像玩家的多维数据集事务,我们可以使用键盘上的箭头键来移动他。

    首先,让我们删除编写的用于旋转和移动多维数据集位置的代码。 现在让我们移动相机,使其对世界更加友好。 让我们回到MonoDevelop并从开始删除我们的多维数据集代码。 我们还要在相机上添加一些动作。

    现在我们可以像对多维数据集对象一样添加对camera对象的引用,但是Unity3D自动将其作为静态object Camera的一部分提供。 因此,让我们直接将位置变换写入该对象。 Camera.main.transform.position = new Vector3(0,5,-5); 与将当前位置添加到多维数据集不同,此处不需要这样做,因为我们想相对于玩家的绝对位置移动摄像机。 按播放。

    Unity3D.2.29

    Unity3D.2.30

    现在我们不再看到立方体。 这是为什么? 好吧,我们没有轮换。 但是要测试并查看原因,让我们在保持“播放”模式的同时回顾一下“场景查看器”。

    Unity3D.2.31

    我们看到四个对象和一个摄像机预览。 相机预览是一个很棒的工具,可以让您(在选择相机的同时)看到游戏视图的静态视图。 我们还看到有一个摄像头,一个立方体,一个定向灯和绿色平面。 如果选择“摄像机视图”,则会看到箭头和四条白线。

    这四条白线是相机看到的边界框。 您可以做的一个不错的技巧是在“层次视图”中,双击一个对象,然后在“场景视图”中将其居中。 这将使加载更容易找到。 您也可以上下滚动进行缩放。 如果在“场景视图”上按住鼠标右键并使用WSAD键,则可以根据需要在场景中飞行。

    如果缩小并摆好姿势,以使照相机红色箭头指向您,您将看到边界框不再包围我们的立方体,因此我们将无法看到它。

    Unity3D.2.33

    为了解决这个问题,让我们写一些代码将相机旋转到大约35度,这样我们就可以鸟瞰。 在摄像机位置代码之后,让我们添加一个旋转:
    Camera.main.transform.Rotate(new Vector3(1,0,0), 35); 这会将摄像机沿X轴向下旋转35度,将其指向我们的立方体。 现在让我们回到Unity Editor,然后再次按Play。

    Unity3D.2.34

    Unity3D.2.35

    这还差不多。 现在我们可以看到我们的立方体,并且更像是鸟瞰游戏。 现在让我们回到箭头的方向。 像以前一样,我们希望在每次更新时都执行此操作,因此让我们向update函数中添加一些代码。 让我们首先编写代码以检测是否按下了前进(向上)箭头键。

    if(Input.GetKey(KeyCode.UpArrow)){
    	This.transform.position = this.transform.position + new Vector3(0,0,1) * Time.deltaTime;
    }

    Unity3D.2.36

    现在,我们在按住向上箭头键的同时前进。 这是如何工作的,我们要设置this.transform位置,该位置是我们创建的父级游戏对象“ Player”的位置,我们当前位置,然后向前增加一个单位,然后乘以每个单位之间的时间帧。 我们可以通过更改相加的矢量来增加或减少它。

    让我们在工作中添加更多对象以获得一个Ref,以便在我们四处走动时可以看到。 让我们回到编辑器,确保我们没有在玩。 一旦成立,然后转到未选择任何内容的“层次结构视图”,右键单击,添加另一个多维数据集和一个球体。 可能不会在世界原点添加对象,因此让我们选择在“层次结构视图”中添加的每个对象,并将转换设置回世界原点(0,0,0)。

    Unity3D.2.38 Unity3D.2.37

    现在,让我们使用编辑器而不是代码将刚添加的静态对象移到适当的位置。 我们将通过在“层次视图”中选择一个对象,然后在“场景视图”中拖动该对象来实现。 让我们将立方体放置在-5,3,9区域附近的某个位置,以便它在摄影机的视野中,而球体在2,2,2区域中。

    Unity3D.2.39

    Unity3D.2.41

    让我们为Player Cube提供一种材料,以便我们可以看到哪个是我们的。 转到项目窗口,然后右键单击“创建材料”。 将该材质反照率设置为蓝色(0000FFFF),并将该材质拖动到Player对象内部的Cube中。

    现在按播放。 出现游戏视图后,按键盘上的向上箭头。 现在,我们应该看到立方体前进。

    图片29

    向对象添加物理

    现在让我们向这些对象中添加一些物理原理。 要添加物理,我们需要转到Unity3d编辑器并选择Sphere对象。 然后去检查员。 在检查器的底部,有一个“添加组件”按钮,单击该按钮,然后选择“物理”->“刚体”。 这会将对象添加到物理引擎。 让我们对白色多维数据集执行相同的过程,然后对父级Player游戏对象执行相同的过程。 然后,按播放。 现在我们应该看到球和立方体掉落,好像重力作用在它们上一样。

    因此,为了使它看起来真的很有趣,让我们在播放器控制器上添加更多代码,使我们可以往回走。 在“资产”窗口中,双击我们的PlayerController脚本,这将使MonoDevelop备份并允许我们添加更多代码。

    让我们添加几行新代码,以便当我们按向左或向右箭头键时, player对象将向左或向右旋转。

    if(Input.GetKey(KeyCode.LeftArrow)){
    	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, -10 * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.RightArrow)){
    	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, 10 * Time.deltaTime);
    }

    Unity3D.2.43

    让我们按Play,看看会发生什么。 这应该允许我们旋转并前后移动,但是一旦将立方体向前转动,它将不再朝着我们面对的方向。 为了解决这个问题,我们将需要更改为上面的动作编写的一些代码。

    更改

    This.transform.position = this.transform.position + new Vector3(0,0,1) * Time.deltaTime;
    
    To
    This.transform.position = this.transform.position + (this.transform.rotation * new Vector3(0,0,1)) * Time.deltaTime;

    这会将旋转乘以方向,从而得到一个新的vector3,它将成为新的前进方向。

    Unity3D.2.44

    现在按播放。 我们应该能够前进并向左和向右转。 现在,您应该能够根据我们应用的刚体物理原理,进入球体和白色立方体将它们推开。

    运动真的很慢。 让我们在代码中添加几个新的可编辑变量,这将使我们能够通过编辑器调整运动速度。 public GameObject cube上方的代码中,我们添加两个新的float并将其public GameObject cube公开。 通过公开它们,它将在Unity编辑器中添加一个字段,以允许您通过检查器对其进行编辑。

    public float forwardSpeed = 10.0f;
    public float turningSpeed = 10.0f;

    Unity3D.2.45

    现在我们有了这些控件,让我们将这些字段添加到我们的运动代码中,以代替我们的硬编码值。

    if(Input.GetKey(KeyCode.UpArrow)){
    this.transform.position = this.transform.position + (this.transform.rotation * new Vector3(0,0,forwardSpeed)) * Time.deltaTime;
    }
    if(Input.GetKey(KeyCode.LeftArrow)){
    	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, turningSpeed * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.RightArrow)){
    	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, turningSpeed * Time.deltaTime);
    }

    Unity3D.2.46

    现在,如果您没有注意到,转弯有些奇怪。 就像它在世界各地或在起点周围旋转一样。 这是因为我们使用了一个名为RotateAround的新函数,而不是之前使用的函数(即Rotate) RotateAround函数的第一个参数设置旋转对象的位置。

    我们放置了新的Vector3(0,0,0),它是世界中心/起点。 相反,让我们确定对象的原点,以便当我们转动相机时,它是通过对象的中心。 让我们将代码更改为如下所示:

    if(Input.GetKey(KeyCode.LeftArrow)){
    	this.transform.RotateAround( this.transform.position, Vector.up, turningSpeed * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.RightArrow)){
    	this.transform.RotateAround( this.transform.position, Vector.up, turningSpeed * Time.deltaTime);
    }

    Unity3D.2.47

    现在按播放,一切都应该正常了。

    第二部分总结

    oo! 现在,您应该对如何使用C#控制Unity3D有更好的了解。
    请继续关注计划于下周发布的第三部分。 本系列的第三篇也是最后一篇文章将深入探讨如何使用Unity3D将这些更改实际变成一个简单的游戏。

    翻译自: https://www.javacodegeeks.com/2016/08/controlling-unity3d-using-c-part-2.html

    c# unity3d

    展开全文
  • 在运行过程中,第一人称走动或者移动摄像机时会看到模型的表面不段的变化闪烁!希望大家多多指教……
  • Unity3D常见面试题

    万次阅读 多人点赞 2017-08-11 20:20:00
    Unity3D常见面试题

    Unity3D常见面试题

    目录

    C#问题 4

    1.在类的构造函数前加上static会报什么错?为什么? 4

    2.C# StringBuilder类型比string类型的优势是什么? 4

    3.C# 函数Func(string a, string b)Lambda表达式怎么写? 4

    4.数列1,1,2,3,5,8,13...n位数是多少?C#递归算法实现 4

    5. 请简述值类型与引用类型的区别 4

    6. 请简述ArrayListList<>的主要区别 5

    7. 请简述GC(垃圾回收)产生的原因,并描述如何避免? 5

    8. 请描述Interface与抽象类之间的不同 5

    9.下列代码在运行中会产生几个临时对象? 5

    10.下列代码在运行中会发生什么问题?如何避免? 6

    11.请简述关键字Sealed用在类声明和函数声明时的作用 6

    12.请简述privatepublicprotectedinternal的区别 6

    13.反射的实现原理? 6

    14.NetMono的关系? 6

    15.请说出4种面向对象的设计原则,并分别简述它们的含义。 7

    16. Hashtable是无序的吗? 7

    Unity问题 7

    UI 7

    1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么? 7

    2.请简述NGUIPanelAnchor的作用 7

    3.为何大家都在移动设备上寻求U3D原生GUI的替代方案 8

    4.使用原生GUI创建一个可以拖动的窗口命令是什么? 8

    5.使用Unity3d实现2d游戏,有几种方式? 8

    碰撞 8

    6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法 8

    7.MeshCollider和其他Collider的一个主要不同点? 8

    8.Unity3d中的碰撞器和触发器的区别? 8

    9.物体发生碰撞的必要条件 9

    10.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免? 9

    动画 10

    11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示. 10

    12.请描述游戏动画有哪几种,以及其原理? 10

    13.反向旋转动画的方法是什么? 10

    14.写出Animation的五个方法 11

    15.动画层(AnimationState Layers)的作用是什么? 11

    16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法? 11

    17.法线贴图 CG动画  11

    线程和协程 11

    18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? 11

    19.Unity3D的协程和C#线程之间的区别是什么? 12

    20.什么是协同程序? 12

    四元数 12

    21.四元数是什么?主要作用什么?对欧拉角的优点是什么? 12

    摄像机 12

    22.在场景中放置多个Camera并同时处于活动状态会发生什么? 12

    23.Unity摄像机有几种工作方式,分别是什么? 13

    预制物 13

    24.Prefab的作用?如何在移动环境的设备下恰当地使用它? 13

    unity 当需要频繁创建一个物体对象时,怎样减少内存 13

    Shader 13

    25.出光照计算中的diffuse的计算公式 13

    26.MeshRendermaterialshader的区别? 13

    27.alpha blend工作原理 14

    28.光照贴图 的优势是什么? 14

    29.Vertex Shader是什么,怎么计算? 14

    系统函数 14

    物理更新一般在哪个系统函数里? 14

    30.OnEnableAwakeStart运行时的发生顺序?哪些可能在同一个对象周期中反复的发生? 15

    31.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 15

    32.物理更新一般放在哪个系统函数里? 15

    33.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中? 15

    34.请简述OnBecameVisibleOnBecameInvisible的发生时机,以及这一对回调函数的意义? 15

    35.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数 15

    36.动态加载资源的方式?区别是什么? 16

    37.以下哪个函数在游戏进入新场景后会被马上调用? 16

    38.如何销毁一个UnityEngine.Object及其子类 16

    39.获取、增加、删除组件的命令分别是什么? 16

    40.Application.loadLevel命令是什么? 16

    41.调试记录到控制台的命令是什么? 16

    42.LayerMask.NameToLayer()这个方法有什么作用? 16

    43.localPositionPosition的使用区别? 17

    44.物体自身旋转使用的函数? 17

    45.物体围绕某点旋转使用的函数? 17

    46.U3D中用于记录节点空间几何信息的组件名称,及其父类名称 17

    47.写一个计时器工具,从整点开始计时,格式为:00:00:00 17

    物理引擎 18

    48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法. 18

    49.实现吊机吊物体的功能 18

    50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可) 22

    51.MaterialPhysic Material区别? 24

    52.CharacterControllerRigidbody的区别? 24

    53.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来 24

    54.什么叫做链条关节? 24

    55.什么是导航网格( NavMesh)? 24

    56.Unity3d提供了几种光源类型,分别是哪几种? 25

    Unity引擎问题 25

    57.简述Unity3D支持的作为脚本的语言的名称 25

    58.向量的点乘、叉乘以及归一化的意义? 25

    59.矩阵相乘的意义及注意点? 25

    60.为什么dynamic fontunicode环境下优于static font 25

    61.Render的作用?描述MeshRenderSkinnedMeshRender的关系与不同 26

    62.简述SkinnedMesh的实现原理 26

    63.为什么Unity3D中会发生在组件上出现数据丢失的情况? 26

    64.如何安全的在不同工程间安全地迁移asset数据?三种方法 26

    65.Lod是什么,优缺点是什么? 26

    66.两种阴影判断的方法、工作原理。 26

    67.MipMap是什么,作用? 27

    68.用代码实现第三角色控制器 27

    69.Mecanim系统中,Body Mask的作用是? 27

    70.Unity连接数据库 27

    71.如何优化内存? 27

    72.你用过哪些插件? 27

    在哪个模块下可以修改Render Path? 28

    图形图像 28

    1.什么是渲染管道? 28

    2.什么是矢量图  29

    3.什么是矩阵?矩阵运算? 29

    4.角度和弧度的转换 29

    5.矢量标量 29

     

    C#问题

    1.在类的构造函数前加上static会报什么错?为什么?

    答:在构造函数如果有public修饰的静态构造函数时会报:“静态构造函数中不允许出现访问修饰符”,如果什么修饰符都不加的话不会报错,静态构造函数一般是起初始化作用。

    2.C# StringBuilder类型比string类型的优势是什么?

    答:StringBuilde的优势在于拼接,string的优势在于对字符串做一些处理,在使用过程中看具体的需求。

    3.C# 函数Func(string a, string b)Lambda表达式怎么写?

    答:(a,b)=>{}

    4.数列1,1,2,3,5,8,13...n位数是多少?C#递归算法实现

    答:

    5. 请简述值类型与引用类型的区别

    答:区别:
        1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中  

    存放的地址。
        2.值类型存取快,引用类型存取慢。
        3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
        4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
        5.值类型继承自System.ValueType,引用类型继承自System.Object

    6. 请简述ArrayListList<>的主要区别

    答:ArrayList是非泛型列表,存储数据时把所有的数据都当成object类型存储,存在装箱问题,取出来使用的时候存在拆箱问题,装箱拆箱会使性能变差,而且存在数据安全问题,但是优点在于可以让值类型和引用类型互相转换。

    List是泛型列表,在使用的时候才去定义数据类型,泛型避免了拆箱装箱的问题,存入读取速度较快,类型也更安全。

    7. 请简述GC(垃圾回收)产生的原因,并描述如何避免?

    答:GC回收堆上的内存
        避免:1)减少new产生对象的次数
              2)使用公用的对象(静态成员)
              3如果字符串拼接多的将String换为StringBuilder

    8. 请描述Interface与抽象类之间的不同

    答:语法不同处:1.抽象类中可以有字段,接口没有。

    2.抽象类中可以有实现成员,接口只能包含抽象成员。

    3.抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。

    用法不同处:1.抽象类是概念的抽象,接口关注于行为。

               2.抽象类的子类与父类的关系是泛化关系,耦合度较高,而实现类和接口之间是实现的关系,耦合度比泛化低。

               3.一个类只能继承一个类,但是可以实现多个接口。

    9.下列代码在运行中会产生几个临时对象?

    string a = new string("abc");
    a = (a.ToUpper() + "123").Substring(0, 2);   

    答:第一行是会出错的。应该这样初始化:

    string b = new string(new char[]{'a','b','c'});

    3个临时对象

    10.下列代码在运行中会发生什么问题?如何避免?

    List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });

     foreach (int item in ls)

     {

     Console.WriteLine(item * item);

            ls.Remove(item);

     }   

    答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。

    使用foreach时候不要对内容进行修改,如果要修改可以使用for

    11.请简述关键字Sealed用在类声明和函数声明时的作用

    答:Sealed访问修饰符用于类时,该类是密封类,可防止其他类继承此类。

    在方法中使用时则可防止派生类重写此方法。

    12.请简述privatepublicprotectedinternal的区别

    答:public:对任何类和成员都公开,无限制访问
        private:仅对该类公开
        protected:对该类和其派生类公开
        internal:只能在包含该类的程序集中访问该类
        protected internalprotected + internal

    13.反射的实现原理?

    答:审查元数据并收集关于它的类型信息的能力。

    14.NetMono的关系?

    答:mono.net的一个开源跨平台工具。.net只能在windows下运行,mono可以实现跨平台,可以运行于linuxUnixMac OS等。

    15.请说出4种面向对象的设计原则,并分别简述它们的含义。 

    答:1 单一职责原则:一个类,最好只做一件事,只有一个引起它的变化

    2 开放-封闭原则:对于扩展是开放的,对于更改是封闭的 

    3) 里氏替换原则:子类必须能够替换其基类 

    4 依赖倒置原则:依赖于抽象 

    5 接口隔离原则 :使用多个小的专门的接口,而不要使用一个大的总接口。

    16. Hashtable是无序的吗?

    答:电脑没有绝对的无序,hashtable是通过哈希码让开发者感觉无序。

     

     

     

     

    Unity问题

    UI

    1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么

    答:1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。

        2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。

    2.请简述NGUIPanelAnchor的作用 

    答:Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。  

     AnchorNGUI屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。

    3.为何大家都在移动设备上寻求U3D原生GUI的替代方案

    答:1.不美观

    2.OnGUI很耗费时间

    3.使用不方便 

    4. drawcall很高

    4.使用原生GUI创建一个可以拖动的窗口命令是什么? 

    答:GUI.DragWindow()

    5.使用Unity3d实现2d游戏,有几种方式?

    答:1.使用本身的GUI

    2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z

    3.使用2d插件,如:2DToolKit

    碰撞

    6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法

    答:在两个平面上分别取一个向量,然后看是否相交

    7.MeshCollider和其他Collider的一个主要不同点?

    答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。

    8.Unity3d中的碰撞器和触发器的区别?

    答:1.碰撞器物体不能互相进入到对方内部,触发器可以

    2.触发器角色控制器可以使用,碰撞器中不能使用

    3.触发器没有物理属性了,碰撞器可以有力存在

    4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数

    9.物体发生碰撞的必要条件

    答:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

     

    CharacterController和Rigidbody的区别?

    CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

    Rigidbody就是刚体,使物体带有刚体的特征。

     

    10.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

    答:穿透(碰撞检测失败)

    避免的方法:把刚体的实时碰撞检测打开Collision Detection修改为Continuous Dynamic

     

    unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数

    主要是三个阶段:1.Collider.OnCollisionEnter 进入碰撞,
    OnCollisionEnter is called when this collider/rigidbody has begun touching 
    another rigidbody/collider.

    collider/rigidbody开始触动另一个rigidbody/colliderOnCollisionEnter被调用。
    2.Collider.OnCollisionStay 逗留碰撞,
    OnCollisionStay is called once per frame for every collider/rigidbody that is 
    touching rigidbody/collider.

    每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,

    一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。
    3.Collider.OnCollisionExit 退出碰撞,
    OnCollisionExit is called when this collider/rigidbody has stopped touching 
    another rigidbody/collider.

    当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。

     

     

    动画

    11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示.

    答:

     

    12.请描述游戏动画有哪几种,以及其原理? 

    答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 

    1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画。 

    2.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。   

    3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。

    13.反向旋转动画的方法是什么?

    答:  反转动画,将动画的速度调到-1

    14.写出Animation的五个方法  

    答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画 

    15.动画层(AnimationState Layers)的作用是什么? 

    答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画

    16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法? 

    答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。

     方法:1.MoveTo  物体移动 

    2.ColorTo:随着时间改变对象的颜色组

     3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3Transform位置  

    17.法线贴图 CG动画 

    答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏

    CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。

    线程和协程

    18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?

    答:Unity支持多线程,如果同时要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine

    注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。
    2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

    19.Unity3D的协程和C#线程之间的区别是什么?

    答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。

    20.什么是协同程序?

    答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。

    四元数

    21.四元数是什么?主要作用什么?对欧拉角的优点是什么? 

    答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部

    作用:四元数用于表示旋转
    优点:
    1)能进行增量旋转
    2)避免万向锁
    3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

    四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁

    四元数由4个数组成,旋转矩阵需要9个数

    两个四元数之间更容易插值 

    四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易 

    与旋转矩阵类似,两个四元组相乘可表示两次旋转

    摄像机

    22.在场景中放置多个Camera并同时处于活动状态会发生什么?

    答:游戏界面可以看到很多摄像机的混合

    23.Unity摄像机有几种工作方式,分别是什么?  

    答:正交和透视

    正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。

    透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机。

    预制物

    24.Prefab的作用?如何在移动环境的设备下恰当地使用它?

    答:Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。

     

    unity 当需要频繁创建一个物体对象时,怎样减少内存

    :动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等

    Shader

    25.出光照计算中的diffuse的计算公式 

    答:实际光照强度l=环境光(lambient+漫反射光(Idiffuse+镜面高光(lspecular

        环境光:lambient=环境光强度(Aintensity*环境光颜色(Acolor

        漫反射光:ldiffuse=镜面光照强度(Dintensity*镜面光颜色(Scolor*(光的反射向量(R.观察者向量(V))^镜面光指数(n

    26.MeshRendermaterialshader的区别?

    答:MeshRender是模型渲染的组件,有此组件物体才能显示出来

    Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。

    Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。

    Shader大致分为:1.表面着色器

    2.顶点和片元着色器

    3.固定功能着色器

    27.alpha blend工作原理 

    答:Alpha Blend 实现透明效果,Color = 原颜色*alpha/255+目标色*255-alpha/255

    28.光照贴图 的优势是什么?

    答:1.使用光照贴图比使用实时光源渲染要快

    2.可以降低游戏内存消耗 

    3.多个物体可以使用同一张光照贴图  

    29.Vertex Shader是什么,怎么计算? 

    答:顶点着色器:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的

    transformationlightingVertex Shader主要操作顶点。 

    Vertex Shader对输入顶点完成了从local spacehomogeneous space(齐次空间)的变换过程,homogeneous spaceprojection space的下一个space。在这其间共有world transformation, view transformationprojection transformationlighting几个过程。  

    .unity3d提供了几种光源,分别是什么

     答:4种,Directionl light ,Point Light ,Spot Light,Area Light

     

    Unity系统API

     

    物理更新一般在哪个系统函数里?

     答:FixedUpdate每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

     

     

    30.OnEnableAwakeStart运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

    答:Awake –>OnEnable->Start
        OnEnable在同一周期中可以反复地发生

    31.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。

    答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy

    32.物理更新一般放在哪个系统函数里?

    答:FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。

    33.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?

    答:LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

    34.请简述OnBecameVisibleOnBecameInvisible的发生时机,以及这一对回调函数的意义?

    答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

         renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible renderer(渲染器)在任何相机上可见时调用:OnBecameVisible  

    35.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

    答:PlayerPrefs.SetInt()

    PlayerPrefs.GetInt()

    36.动态加载资源的方式?区别是什么?

    答:1.Resources.Load();

    2.AssetBundle

    区别:

    Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。
    简单说,Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的

    37.以下哪个函数在游戏进入新场景后会被马上调用? 

    答:MonoBehaviour.OnLevelWasLoaded  

    38.如何销毁一个UnityEngine.Object及其子类对象

    答:Destory

    39.获取、增加、删除组件的命令分别是什么? 

    答:获取:GetComponent 

    增加:AddComponent 

    没有删除组件只有让组件不生效:enable

    40.Application.loadLevel命令是什么?

    答:加载关卡 

    41.调试记录到控制台的命令是什么?

    答: Debug.Log();  

    42.LayerMask.NameToLayer()这个方法有什么作用? 

    答:层索引

    43.localPositionPosition的使用区别? 

    答:localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。 

     Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。

    44.物体自身旋转使用的函数?

    答:Transform.Rotate()

    45.物体围绕某点旋转使用的函数?

    答:Transform.RotateAround()

    46.U3D中用于记录节点空间几何信息的组件名称,及其父类名称

    答:Transform 父类是 Component

    47.写一个计时器工具,从整点开始计时,格式为:00:00:00  

    答:

    int scend

    int minte

    int hour

    void Start()

    {

    scend=0

    minte=0

    hour=0

    }

    void Update()

    {

    Ifscend<60

    {

    Scend+=time.deltime;

    }

    Else

    {

    Scend-=60;

    Minte+=1;

    }

    If(minte>=60)

    {

      Minte-=60;

      Hour+=1;

    }

    }

    物理引擎

    48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.

    答:添加刚体使小鸟模拟受到重力影响。

    49.实现吊机吊物体的功能  

    1. 答:using UnityEngine;  
    2. using System.Collections;  
    3. public class QizhongjiCS : MonoBehaviour {  
    4.     private float dianX = 0;  
    5.     public GameObject hook;  
    6.     private float yuandianX;  
    7.     private Vector3 hookV;  
    8.     private int flag=0;  
    9.     private delegate void HookMove();  
    10.     private  HookMove _hookMove=null;  
    11.     private int speed=3;  
    12.     public HookZhongWu hzw;  
    13.     private int zwFlag=0;  
    14.     private GameObject zhongwu;                 //抓住的重物;  
    15.     public GameObject shengzi;  
    16.     public GameObject heng;  
    17.     // Use this for initialization  
    18.     void Start () {  
    19.         hookV = hook.transform.localPosition;  
    20.         yuandianX = hookV.x;  
    21.     }  
    22.     // Update is called once per frame  
    23.     void Update () {  
    24.         if (flag == 0) {  
    25.             if (Input.GetMouseButtonDown(0))  
    26.             {  
    27.                 dianX = Input.mousePosition.x;  
    28.             }  
    29.             else if (Input.GetMouseButton(0))  
    30.             {  
    31.                 float dx = Input.mousePosition.x - dianX;  
    32.                 if (Mathf.Abs(dx) > 0.1f)  
    33.                 {  
    34.   
    35.                     hookV.x = yuandianX + dx / 32;  
    36.                     if (hookV.x > -6 && hookV.x < 6)  
    37.                     {  
    38.                         hook.transform.localPosition = hookV;  
    39.                     }  
    40.   
    41.                 }  
    42.             }  
    43.             else if (Input.GetMouseButtonUp(0))  
    44.             {  
    45.                 //yuandianX = hookV.x;  
    46.                 flag = 1;  
    47.                 _hookMove = hookDown;  
    48.                 StartCoroutine(downZhua());  
    49.             }   
    50.         }  
    51.     }  
    52.     IEnumerator downZhua() {  
    53.         yield return new WaitForSeconds(0.01f);  
    54.         //1、向下移动, +speed  
    55.         //2、判断移动的位置 如果大于某个位置 ,返回 speed为负  
    56.         if (_hookMove != null)  
    57.         {  
    58.             _hookMove();  
    59.             yield return StartCoroutine(downZhua());  
    60.         }  
    61.         else {  
    62.             yield return null;  
    63.         }  
    64.         //3、判断移动回到原点    整个钩子向原始位置水平运动  
    65.         //4、判断钩子回到原点   停止协程  flag=0  
    66.         yield return StartCoroutine(downZhua());  
    67.     }  
    68.     void hookDown() {  
    69.         hook.transform.Translate(Vector3.down * Time.deltaTime * speed);         changeShengZi();  
    70.         if (hook.transform.localPosition.y < -2) {  
    71.             if (zwFlag == 1) {  
    72.                 zhongwu.transform.parent = null;  
    73.                 zhongwu = null;  
    74.                 zwFlag = 0;  
    75.             }  
    76.             _hookMove = hookUp;  
    77.         }  
    78.     }  
    79.     void hookUp()  
    80.     {  
    81.         hook.transform.Translate(Vector3.up * Time.deltaTime * speed);  
    82.         changeShengZi();  
    83.         if (hook.transform.localPosition.y >3.2)  
    84.         {  
    85.                 _hookMove = HMove;  
    86.         }  
    87.     }  
    88.     void HMove()  
    89.     {  
    90.         hook.transform.Translate(Vector3.left * Time.deltaTime * speed);
    91.         if (hook.transform.localPosition.x <=-4.5)  
    92.         {  
    93.             if (zwFlag == 0)  
    94.             {  
    95.                 flag = 0;  
    96.                 _hookMove = null;  
    97.             }  
    98.             else {  
    99.                 _hookMove = hookDown;  
    100.             }  
    101.         }  
    102.     }  
    103.     public void zhuaZhongWu(GameObject zhongwu) {  
    104.         _hookMove = hookUp;  
    105.         zwFlag = 1;  
    106.         this.zhongwu = zhongwu;  
    107.     }  
    108.     void changeShengZi() {  
    109.         Vector3 hookPosition = hook.transform.position;  
    110.         Vector3 hengliangP = heng.transform.position;  
    111.         float dy = hookPosition.y - hengliangP.y;  
    112.         Vector3 shengziP = shengzi.transform.position;  
    113.         shengziP.y = hengliangP.y + dy / 2;  
    114.         shengzi.transform.position = shengziP;  
    115.         //改变 绳子长度  
    116.         Vector3 shengziSclae = shengzi.transform.localScale;  
    117.         shengziSclae.y = dy/2;  
    118.         shengzi.transform.localScale = shengziSclae;  
    119.     }  
    120. }  

    HookZhongWu.cs用来判断 钩子是否和重物碰撞

    碰上的时候 将重物设置成钩子的子对象  就可以实现带着往上升的效果了

    1. public class HookZhongWu : MonoBehaviour {  
    2.     public QizhongjiCS qzj;  
    3.     void OnTriggerEnter(Collider collision)  
    4.     {//当碰撞时  
    5.         print("OnTriggertEnter+" + collision.gameObject.name);  
    6.         if (collision.gameObject.name == "zhongwu") {  
    7.             collision.gameObject.transform.parent = this.gameObject.transform;  
    8.             Vector3 v = collision.gameObject.transform.localPosition;  
    9.             v.y = -1.2f;  
    10.             collision.gameObject.transform.localPosition = v;  
    11.             qzj.zhuaZhongWu(collision.gameObject);  
    12.         }  
    13.     }  
    14. }  

     

    50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)  

    答:在场景中添加一个PlanCameraDirectional LightCube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。

    1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    void Update () {
        //鼠标滚轮的效果
      //Camera.main.fieldOfView 摄像机的视野
      //Camera.main.orthographicSize 摄像机的正交投影
      //Zoom out
       if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
        if (Camera.main.fieldOfView <= 100) 
        Camera.main.fieldOfView += 2;
       if (Camera.main.orthographicSize <= 20)
          Camera.main.orthographicSize += 0.5F; }
            //Zoom in
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
         {
          if (Camera.main.fieldOfView > 2)
            Camera.main.fieldOfView -= 2;
          if (Camera.main.orthographicSize >= 1)
             Camera.main.orthographicSize -= 0.5F;
            }}

      2.鼠标实现在场景中拖动物体:

      解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理

       主要代码如下:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    // Use this for initialization

        void Start ()

        {

            StartCoroutine(OnMouseDown());

        }

     

        IEnumerator OnMouseDown()

        {

            //将物体由世界坐标系转换为屏幕坐标系

            Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标

            //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系  

            //    //             2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离

            //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离

            Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

            while (Input.GetMouseButton(0))

            {

                //得到现在鼠标的2维坐标系位置

                Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

                //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量

                Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

                //curPosition就是物体应该的移动向量赋给transform的position属性

                transform.position = curPosition;

                yield return new WaitForFixedUpdate(); //这个很重要,循环执行

            }

        }

     

    51.MaterialPhysic Material区别?

    答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。 

    Material材质:主要是控制一个物体的颜色,质感等显示。

    52.CharacterControllerRigidbody的区别?

    答:CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

    Rigidbody就是刚体,使物体带有刚体的特征。

    53.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来

    答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。

    54.什么叫做链条关节?

    答:Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

    55.什么是导航网格( NavMesh)?  

    答: Unity内一种用于实现自动寻路的网格  

    56.Unity3d提供了几种光源类型,分别是哪几种?

    答:四种。

    平行光:Directional Light

    点光源:Point Light

    聚光灯:Spot Light

    区域光源:Area Light

    Unity引擎问题

    57.简述Unity3D支持的作为脚本的语言的名称

    答:Unity的脚本语言基于Mono.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
    Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
    JavaScript

    C#
    Boo 

    58.向量的点乘、叉乘以及归一化的意义?

    答:1)点乘计算两个向量之间的夹角,还可表示某一方向的投影
    2)叉乘得到的是法向量
    3)标准化向量:用在只关系方向,不关心大小的时候

    59.矩阵相乘的意义及注意点

    答:用于表示线性变换:旋转、缩放、投影、平移、仿射
    注意:矩阵的蠕变:误差的积累

    60.为什么dynamic fontunicode环境下优于static font

    答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
    使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

    61.Render的作用?描述MeshRenderSkinnedMeshRender的关系与不同

    答:render是渲染器,渲染器可以使物体显示在屏幕上。

    MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器

    62.简述SkinnedMesh的实现原理

    答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。 

    63.为什么Unity3D中会发生在组件上出现数据丢失的情况?

    答:组件上绑定的对象被删除了

    64.如何安全的在不同工程间安全地迁移asset数据?三种方法

    答:1Assets目录和Library目录一起迁移

    2导出包

    3unity自带的assets Server功能

    65.Lod是什么,优缺点是什么? 

    答:LODLevel of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

       优点:可根据距离动态的选择渲染不同细节的模型

    缺点:增加美工工作量,增大了游戏的容量。

    66.两种阴影判断的方法、工作原理。 

    答:自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面

    工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。

    投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。

    工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后在按视点位置对场景进行相应处理得到所要求的师徒(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。

    67.MipMap是什么,作用? 

    答:MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap  

    68.用代码实现第三角色控制器 

    答:  

    69.Mecanim系统中,Body Mask的作用是?

    答:指定身体的某一部分是否参与渲染  

    70.Unity连接数据库 

    答:需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件  

    71.如何优化内存?

    答:1.压缩自带类库

    2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy

    3.释放AssetBundle占用的资源

    4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小

    5.使用光照贴图

    6.使用多层次细节(LOD)

    7.使用着色器(Shader)

    8.使用预设(Prefab)

    72.你用过哪些插件?

    答:NGUI/DF/ITeen

    m

     

    在哪个模块下可以修改Render Path?

    a. Camera

    b. Light

    c. Render settings

    d. ProjectSetting=Player=OtherSettings

     

     

    图形图像

    1.什么是渲染管道?

    答:是指在显示器上为了显示出图像而经过的一系列必要操作。

    渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

    主要有三步:应用程序阶段,几何阶段 光栅阶段

    本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

    2.什么是矢量图 

    答:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。

    3.什么是矩阵?矩阵运算?

    答:矩阵:横轴排列的二维数据表格

    矩阵运算:

    加减 限制条件:行和列必须相同,对应相加相减得到结果

    乘法 限制条件:要求左矩阵的行和右矩阵的列必须同,行数和左矩阵相等,列数和右矩阵相等,结果的第i行第j列,是左矩阵的第i行和右矩阵的第j列逐个相乘并把结果相加,得到结果是结果 的 第i行第j

    4.角度和弧度的转换

    答:角度和弧度

    度和弧度之间的换算  1弧度 = 180度 /pi(约57.3

                           1=pi/180弧度(约0.017

    5.矢量标量

    答:矢量有方向如力速度 标量只有大小没有方向如温度

    矢量取模就是只要大小不要方向

    ^单位向量 有方向  大小为1的向量

     

    矢量的加法:是矢量的几何和,服从平行四边形规则

    矢量满足交换律,满足结合律

     

    在直角坐标系中,矢量等于骑在坐标轴上投影的矢量之和(二维矢量可以看做三维矢量的特例也就是说  三维成立,二维也成立)

     

    矢量减法:

    大小相等 方向相反 称为逆矢量

     

    任意多个矢量首尾相连接组成闭合多边形,其结果必为0

    矢量的乘法:点积(内积、标量积)、叉积(外积)结果是矢量

    点积方法 dot

     

     

     

     

    Unity面试题1.B  2. A  3. B  4. B  5. D  6. D 7.D  8.A  9.B 

     

     

     

     

     

     

     

    1.D  2.C  3.C  4.A  5.D  6.B.D  7.B  8.c  9.D  10.a

     

     

     

     

     

    ;A

     

       这三题都有了! 

     

     

     

     

     

     


    展开全文
  • Unity 3d 实现AI随机行走 通过自己的思路实现的 AI 随机行走,转向,新手上路如有写的不好的地方欢迎讨论。 效果图 下面是代码 using System.Collections; using System.Collections.Generic; using UnityEngine; ...
  • unity3d hw6 巡逻兵

    2018-06-16 19:58:43
    unity3d hw6 巡逻兵 github地址为 https://github.com/ddghost/unity3d/tree/master/unity%20hw6 这次作业是巡逻兵游戏,简单的介绍一下游戏规则,一共有九个房间,玩家开始在正中间的房间,按wasd移动,玩家的...
  • Unity3d使用鼠标点击控制人物走动无效的问题 最近在自学Unity3d,在学到使用鼠标点击控制人物走动时,按照API上面将代码写好,如下: void Update () { // _clickListener.Update(); if (Input.GetMouseButtonUp...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class Driver : MonoBehaviour { Animator anim; float speed = 5f; float rotationSpeed = 100f;... priv...
  • Unity中提供了模型动画合并的功能,也就是说我们可以把人物模型的4个部位合并到一个GameObject中。
  • 建立好地形之后,我们就需要添加一个第三...一、首先,添加一个人物模型(带动画) 这里的人物属性需要添加以下几个比较重要的组件:rigidBody刚体、nav mesh agent寻路导航组件、box collider碰撞检测组件 ...
  • 今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置...
  • 在漫游游戏中常用的功能就是人物在场景中行走,必要的功能就是鼠标点击地面人物就朝着那个方向行走,键盘方向键前后左右也能控制人物的行走和跳跃,在官方自带的第三人称视角中做了一点修改,官方自带的ThirdPerson...
  • [Unity3D]Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现 今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照...
  • Unity3D面试题整合

    千次阅读 2019-09-17 20:11:37
    最近unity3d找工作有些受挫,自己也开始补课了。 下面把这段时间看到的些面试题供出来让大家也学习下,题目只是面试官选拔人才的一部分,在研究面试题目的过程中,多检测下自己的不足,及时温习或补习下,最终学到真...
  • Unity3D将自带demofangzaiC:\Users\Public\Documents\Unity Projects\4-0_AngryBots
  • 创建一个plane设置层为Terrain因为后面要判断是否点击的是这个层准备好人物模型并且将三个脚本拖放到人物上并且将动画文件也拖放好记得看前面提醒哦 ThirdPersonCamera相当于smoothflowThirdPersonController修改...
  • unity3d 动作会产生抖动的问题

    万次阅读 2016-05-24 20:28:08
    把外部软件制作的动画文件,导入到untiy3d里面的时候,你会发现很多动画文件会一抖一抖的,特别是动画比较精细的部分,诸如腿部,手部末端。 这个问题困扰了很久,然后某天把动作文件在Animation中打开,一帧一帧的...
1 2 3 4 5 ... 14
收藏数 272
精华内容 108
关键字:

unity3d 模型走动