unity教程_unity3d教程 - CSDN
  • Unity3D入门教程中文版

    2020-07-30 23:31:58
    适合unit3d新手入门,pdf文件,中文版,图文并解,仅供参考
  • Unity教程学习

    千次阅读 2019-04-11 10:38:52
    学习Unity有一段时间了,最近有空闲,重头学习一遍教程,做下记录,仅以此篇纪念。 教程的学习主要以操作步骤和说明为主。

    教程1.Roll-a-ball

    需求说明:通过键盘输入控制,上下左右等按钮,控制小球移动。移动小球收集物体,统计分数。

    1).创建游戏

    1.1 新建项目

    打开unity页面,选择NEW,然后输入项目名,选择保存的位置,选择3D模式。
    创建新项目图

    1.2 新建场景

    左上方菜单栏File–New Scene,点击后,会再Hierarchy窗口看到一个场景,如下。
    新场景
    在上图蓝色选中条的右边的设置按钮,点击选择‘Save Scene As’,然后选择保存的位置并输入场景名称。保存完成后可在Project窗口中看到。
    保存的场景

    1.3 新建地面与配置Material

    菜单GameObject–3D Object–Plane,将会在场景里创建一个只有一个面的平面游戏对象,并修改名称(window平台F2)为Ground。选中该plane对象,在Inspector窗口中,Transform组件的右上方,齿轮按钮,选择Reset,这将会让Ground对象的位置等参数初始化。然后将Transform的Scale参数设置 X=2 Y=1 Z=2。注:plane对象的Y参数只分正负,正数是指向向Y轴正方向的一面可见,背面不可见,负数则相反。
    下面是设置Ground的显示效果,材质Material设置。
    新建文件夹(此不是必须的),Project窗口Create–Folder创建文件夹,重命名为Materials。
    Create–Material创建材质球,重命名为MatGround。选择该材质球,在Inspector窗口,点击MainMaps下的Albedo右边的颜色按钮,配置颜色为RGBA 0 32 64 255.
    配置颜色
    接下来为Ground设置材质球。
    方法一:选中Project下的MatGround材质球,按住拖动到Hierarchy下的Ground游戏对象上,之后Ground会变成我们设置的材质。
    方法二:选中Hierarchy下的Ground,在Inspector窗口的MeshRenderer组件上,有一个参数Materials,选中,设置其的Size为1,Element0参数设置,点击右边的小圆点,在列表中选择MatGround材质球。

    1.4 新建小球与重设位置

    Hierarchy窗口Create–3D Objec–Sphere创建一个球的游戏对象,重命名为Player,并Reset初始化。小球理应让其在地面之上,所以我们要设置小球的位置,不改变球的大小(Scale)。因为scale为(1,1,1),而地面位置为(0,0,0),让小球的最小面在地面之上,所以小球应该上移scale的Y的值的一半0.5。故设置position为(0,0.5,0)。

    2).小球的移动控制

    玩家控制小球在游戏区域内移动,碰到墙壁后不会跑出去,不会飞出去,碰到收集的物体,能收集物体。可以运用unity的物理系统,将用户的输入信息转换到小球控制上。

    2.1添加rigidbody

    Hierarchy窗口选中Player游戏对象,在Inspector窗口,最下方AddComponent–Physics–Rigidbody,添加刚体组件,因为对象已经有Collider组件(SphereCollider),可以触发物理碰撞等。

    2.2添加控制脚本

    同样的操作AddCmponent–New Script在弹出的小窗口输入自定义的脚本名称PlayerCtr,选择下方的Create and Add,等新脚本创建后,新建一个文件夹Scritps,然后将PlayerCtr脚本移动到文件夹下,方便控制。
    添加新脚本

    2.3小球移动控制

    双击PlayerCtr脚本打开编辑,建议使用visualStudio打开,设置请自行上网查找。

    2.3.1输入控制

    获取用户输入信息,因为我们只需要在平面上移动,所以我们只控制前后左右,上下不做控制。

    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");
    

    Input是Unity的输入系统,关于调用的方法,可以通过visualStudio的联想和unity说明文档查找。GetAxis(string axisName)方法,参数是名称,名称可以在Unity的InputManager中查看,可从以下路径进入,菜单Edit–Project Settings–Input,会在Inspector窗口里显示InputManager设置面板。
    moveHorizontal 是水平左右输入值,正表示右,负表示左。
    moveVertical是水平前后输入值,正表示前,负表示后。

    2.3.2刚体控制

    小球移动运用unity物理系统,所以我们通过控制rigidbody,来实现控制小球移动。需要在我们的脚本PlayerCtr中获取刚体组件,对刚体组件操作,可通过查找文档来确定rigidbody调用的方法。

    2.3.2.1 获取刚体组件

    生成的脚本PlayerCtr继承至MonoBehaviour,存在Start(),Update()方法,这些方法可通过查找MonoBehaviour生命周期了解其调用,触发机制和前后顺序。
    在这里插入图片描述
    Start()为脚本调用的第一帧,只会执行一次,我们可以在Start里获取刚体组件。由于后面每一帧都要对刚体进行操作,把刚体变量声明成成员变量是最好的选择。

    private Rigidbody RigPlayer;
    

    在Start()中获取组件并赋值

    void Start ()
    {
      RigPlayer = GetComponent<Rigidbody>();
    }
    
    2.3.2.2 刚体运动控制

    每一帧都要对刚体进行控制,控制代码放在Update(),或FixedUpdate()中,其中FixedUpdate()适用于物理体系的调用,所以把刚体控制代码放在FixedUpdate()中。
    刚体的运动,是给刚体施加推力,查阅可得方法AddForce(Vector3 force, ForceMode mode = ForceMode.Force),或者public void AddForce(float x, float y, float z, ForceMode mode = ForceMode.Force)。
    采用前一个,Vector3是3维向量,因为我们用户只有输入左右前后,所以,我们改变x和z,y始终为0,即竖直方向上不给施加额外的推力(rigidbody本身可以设置是否有重力)。同样Vector3我们也可以把它独立成成员变量。

    private Vector3 VecDirec = Vector3.zero;
    
    private void FixedUpdate()
        {
            float moveHorizontal = Input.GetAxis("Horizontal");
            float moveVertical = Input.GetAxis("Vertical");
            VecDirec.x = moveHorizontal;
            VecDirec.z = moveVertical;
            RigPlayer.AddForce(VecDirec);
        }
    

    Play模式测试,会发现运行速度不行,不满足,那我们就需要调整vector3的x和z的值,通过给其一个倍数来控制,为了方便修改,这个倍数用public的成员变量来设置,这样可以在Inspector可视化修改其值。修改后如下。

    public float Speed;
    
    private void FixedUpdate()
    {
       float moveHorizontal = Input.GetAxis("Horizontal");
       float moveVertical = Input.GetAxis("Vertical");
       VecDirec.x = moveHorizontal*Speed;
       VecDirec.z = moveVertical*Speed;
       RigPlayer.AddForce(VecDirec);
    }
    

    可视化修改值
    到此,小球的移动控制已经完成。

    3).相机跟随

    场景里有个MainCamera游戏对象,其上挂着Camera组件,这是用户看到的画面效果,也就是Game中的效果,我们需要让镜头跟随小球移动。
    先调整MainCamera的位置角度,position设置为(0,10,0),旋转设置Rotation为(45,0,0)。
    处理方法一,不是合理的方法,但可以提供一个思路,把MainCamera对象拖动到Player小球对象下面,让其依附于小球。但是从Play模式下会发现问题,小球旋转,镜头跟着旋转,这样完成找不到方向。毫无体验感可言。我们的需求只是镜头跟随小球移动,但是镜头不做旋转。所以MainCamrera还是独立,给其添加一个控制脚本来实现该跟随功能。
    选中MainCamera游戏对象,AddComponent–New Script输入新脚本名称CameraCtr,将新脚本移至Scripts文件夹,打开编辑。
    初始化时先获取方向

    	/// <summary>
        /// 小球Player的Transform
        /// </summary>
        public Transform TraPlayer;
        private Vector3 offset;
    	// Use this for initialization
    	void Start () {
            offset = transform.position - TraPlayer.position;
    	}
    

    然后每一帧更新MainCamera的位置,对相机的操作,代码应该放在LateUpdate中。

    private void LateUpdate()
        {
            transform.position = TraPlayer.position + offset;
        }
    

    记得将Player小球挂载到MainCamera对象的脚本的的TraPlayer参数上(在MainCamera对象的Inspector窗口)。

    4).创建游戏区域

    需要4面墙壁来挡住小球,防止小球跑出地面区域,为了方便管理,先创建一个空游戏对象并初始化位置,重命名为Wall。
    Create–Create Empty,在Inspector中Transform进行Reset,F2重命名。
    墙壁总控制
    创建第一个墙壁,Create–3D Object–Cube,初始化位置后,设置scale为(0.5,2,20.5),这是左右墙的设置,重命名为EastwardWall。接下来再Scene视图中,选中该墙壁,选择菜单栏下的第二个按钮,将墙壁移动到合适位置,最后在微调Position为(10,0,0)。把该墙壁移到Wall对象下面。
    方向按钮
    复制墙壁对象(菜单Edit–Duplicate或者选中墙壁,快捷键ctrl+D),修改名称,移动,修改数值,最终形成合围的4面墙,统一放在Wall对象下管理。注意,前后墙壁可以通过改变Rotation的Y为90实现旋转。
    墙壁效果图
    由于该游戏中,地板和墙壁都是不会动态改变移动,旋转,拉伸的,所以可以设置为静态,以地面为例,选中Ground对象,在Inspector页面,右上方有个static勾选按钮,勾选。或者在其下拉中选择需要的静态选项。
    静态勾选

    5).收集对象

    5.1创建收集预制品

    收集对象要让用户感觉到,要与其他的做区别,怎么突出显示呢?在不考虑性能情况下,要突显出来。一是收集物设置成运动的,二是颜色区别。
    创建收集物体的游戏对象。Create–3D Object–Cube,初始化Reset,重命名为Collection。设置位置,使其悬空,高于地面。设置角度,使其倾斜(45,45,45)。
    设置成运动状态。添加一个新脚本RotationCtr,因为没有物理力的作用,所以在Update里更新旋转角度。

     private Vector3 VecRot = new Vector3(15, 30, 45);
     void Update () {
            transform.Rotate(VecRot*Time.deltaTime);
    	}
    

    为了让其平滑的运动,每一帧运动的角度要跟每一帧的时间做处理。Time.deltaTime是上一帧到这一帧的时间。
    颜色处理。收集物体要跟地面,墙壁,小球做区分,所以最好用不同颜色处理。直接复制原来的地面的材质球,新的材质球更改颜色,在给收集物添加该材质。
    收集物体
    做成预制品保存,进行复用。在Project窗口新建文件夹Prefabs,然后将Collection收集物体对象拖动到Prefabs文件夹下,这样就会形成一个收集物预制品。复制收集物,调整位置,形成一个圆。

    5.2收集物体

    小球碰到收集物后,收集物被收集,则要从镜头里消失。涉及几点,一碰撞检测,二收集物体的消失控制。

    5.2.1碰撞检测

    基于unity的物理系统,碰撞检测是通过rigidbody和collider碰撞器检测的。从之前情况看到,小球碰到收集物会被弹开,但是我们需要的是碰到收集物体后,不会影响小球原先的运动,所以在收集物的碰撞器我们需要做额外处理,让其有碰撞的基础,同时又不触发物理碰撞。
    其实这就是将碰撞器变成触发器,将BoxCollider上的IsTrigger勾选上,这样该对象就变成一个触发器,不会发生物理的碰撞反弹之类的效果。另外,地板,墙壁之类的一定时碰撞器不是触发器。
    触发器

    5.2.2收集物的消失控制

    IsTrigger勾选后,变成触发器,我们需要获取触发器被触发的情况,这个可以在小球的脚本上去控制,因为小球挂了rigidbody,小球碰到触发器,会在其下的脚本调用有关触发器的方法,下面这几个是3D 触发器触发的方法,分别是进入触发器时调用,离开触发器时调用,处在触发器中调用且只要在触发器中,会一直调用。

    	private void OnTriggerEnter(Collider other)
        {}
        private void OnTriggerExit(Collider other)
        {}
        private void OnTriggerStay(Collider other)
        {}
    

    因为我们在一接触就要让收集物体消失,所以需要Enter的方法。还需要考虑一个,如果又多种触发器,我们怎么区分时碰撞到哪一种,解决方法是,给触发器的游戏对象加上Tag标签,通过对比tag来区分。
    tag标签
    最后是消失控制,如上图,tag标签上面是游戏对象的名称还有一个勾选,勾选状态就是对象的显示控制。选中,该对象就是显示状态,不选中,就是消失,隐藏状态。
    整理一下,就是在小球脚本上对private void OnTriggerEnter(Collider other)方法里处理。其中参数other是小球接触到的触发器,通过other对比tag,方法是Component上的CompareTag(参数)参数是tag的字符串。对符合要求的other,执行消失操作。也就是调用GameObject的SetActive方法。代码如下。

    private void OnTriggerEnter(Collider other)
        {
            if(other.CompareTag("Collection"))
            {
                other.gameObject.SetActive(false);
            }
        }
    

    另外,页面上需要做一些处理,新增触发的tag,为收集物体的预制品添加tag。
    新增。任意选中一个游戏对象,点击Tag的名称,再下拉菜单中点击Add Tag。。。在tag页面中点击+,新增一个tag,输入新增的名称。
    新增Tag
    在收集物体预制品上,同样点击tag名称,下拉菜单选择刚才新增的tag,注意这个名称要跟脚本的的CompareTag的参数是一样的。

    5.2.3物理性能优化

    unity的物理系统,对动态和静态的性能消耗是又差别的。动态的物理对象是添加了Collider和rigidbody的游戏对象,静态的是添加了Collider,没有rigidbody且一直在改变(位置,选择,大小拉伸)的游戏对象。
    收集的物体对象一直在旋转,但它是静态的,性能上,静态的会将一些信息保存到缓存中,由于一直在运动,所以每一帧都要将信息重新缓存到缓存里,这会造成额外的性能开销。因为动态的,信息一直在动态更新,不会做缓存。为了减少这部分缓存性能开销,我们要把静态的设定,改成动态的。
    改成动态的,最简单的是为这些收集物体增加rigidbody,并修改rigidbody的一些设置,使其不会有物理属性,而是作为触发器存在。
    方法一:取消rigidbody的UseGravity,这样作为触发器的收集物体就不会因为重力而往下掉落,因为是触发器,会穿过地面。但是这个设置还是会收到物理力的影响。
    方法二:勾选IsKinematic,这样物体会变成动态的,不受物理力影响,但是其形状大小等改变之类的,受到脚本影响。通过脚本修改Transform或动画等控制。
    至此游戏控制基本完成,剩下分数统计之类的其余功能。

    6).分数统计胜利提示

    收集了物体后,需要对分数进行统计并显示,全部收集完成后,显示胜利。

    6.1分数统计与显示

    在Player上的PlayerCtr脚本里对收集的分数进行统计。
    声明并初始化。

    private int count = 0;
    

    收集到物体后,增加分数,最简单处理,一个收集物体增加1。

    private void OnTriggerEnter(Collider other)
        {
            if(other.CompareTag("Collection"))
            {
                other.gameObject.SetActive(false);
                ++count;
            }
        }
    

    分数显示,在Hierarchy窗口,Create–UI–Text。会创建三个对象,Canvas是存放UI的父对象,EventSystem是UI的事件系统。还有一个Text是文本UI。我们把分数放到左上角显示。
    首先颜色改为白色。
    字体颜色设置
    位置设置到左上方,并留一定边距。
    在这里插入图片描述
    将文字内容删除。然后再脚本里初始化和显示文字。在PlayerCtr显示设置共有变量。记的要将Text对象拖动到改变量上,挂载上去。

    public Text TxtCount;
    

    初始化。

    TxtCount.text = "count:" + Count.ToString();
    

    在收集到收集物体后,更新显示内容,因为代码一样,可以抽离出来,处理成独立的方法。在初始化和更新分数时调用该方法。

    public void SetCountText()
        {
            TxtCount.text = "count:" + Count.ToString();
        }
    

    6.2胜利显示

    在所有收集物体被收集完成后,显示胜利。这需要另外一个文本显示。操作类型,新建Text,设置位置,颜色大小等,脚本控制初始化和胜利显示。

    TxtWin.text = string.Empty;
    

    在收集触发方法里,更新胜利显示。

    if(Count>=12)
    {
       TxtWin.text = "You Win!";
    }
    

    功能脚本代码如下

    	private int Count = 0;
    	public Text TxtCount;
    	public Text TxtWin;
    	// Use this for initialization
    	void Start () {
            RigPlayer = GetComponent<Rigidbody>();
            SetCountText();
            TxtWin.text = string.Empty;
    
        }
        private void OnTriggerEnter(Collider other)
        {
            if(other.CompareTag("Collection"))
            {
                other.gameObject.SetActive(false);
                ++Count;
                SetCountText();
            }
        }
        public void SetCountText()
        {
            TxtCount.text = "count:" + Count.ToString();
            if(Count>=12)
            {
                TxtWin.text = "You Win!";
            }
        }
    

    注:代码编写完成,记得把对象挂载到对应变量上。

    7).打包

    菜单File–Build Setttings在页面里点击AddOpenScene或者把目标场景拖到上部的框里,下面根据需求选择平台。各个平台需要设置一些基础信息,请自行查找。

    展开全文
  • Unity3D游戏引擎最详尽基础教程

    万次阅读 2018-06-27 15:23:06
    我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是...

    我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaScript或者C#,不仅非常简单,也让各个种类的程序员都非常容易上手。再次,就是因为免费,如果你不使用Pro或者Mobile的内容的话,Unity3d就是完全免费的。还有就是对3D模型的兼容性,几乎任何3d模型都可以导入到unity中,可以说是一个很方便的特性。

     

    今天,我就来讲讲Unity3D的基础操作,这可以说是一个新手必读吧,读完之后,你一定会惊叹,原来做一个游戏这么简单。

     

    第一节 加入重力

     

    我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用的哦亲。

     

    如果创建的时候没加,你可以再后来的Asset菜单里加:

     

     

    之后,我们建立一个Cude,调整一下x和z的大小,我这里调成了25,让它变成一个地板,你也可以放一个texture上去,看起来更加真实,我这里从简,再创建一个sphere,在component中选择Physics中的RigidBody,前提是选中你的sphere物体,之后会看到这个Sphere的inpector中加入一个component叫做RigidBody,调整好Camera运行一下,你就会发现Sphere受到重力的影响自动掉落到地板上。

     

     

    之后,通过我们之前引入的Physics Materials资源包,你还可以选择这个物体的物理性质,我这里选择Bouncy(跳跳),落下之后,这个物体就会蹦来蹦去的,呵呵

     

     

     

    第二节 检测碰撞

     

    下面我们通过简单的JavaScript语句来检测碰撞,这在制作游戏中是很有用的,比如说检测到子弹和敌人的碰撞之后,可以使用我们后来要讲到destory命令消灭敌人。

     

    这次我们新建一个Terrain项目,在用Grass贴图来覆盖住它,如果你找不到贴图的话,记得在Asset菜单里找找,看看哪些资源你还没有引入进去。

     

    然后再加入一个Cube项目,我这里叫做PlayerCube,为他加上重力,之后选择bouncy性质,然后我们再新建一个Cude,调整y和z的值让他变成一堵墙,放置好,命名为Wall,别忘了给Terrain改名为Terrain,

     

    之后我们在Asset菜单中建立一个JavaScript项目,改名为CollisionDetect,双击打开,如果你使用的是Unity 3.5的话,就会打开MonoDev,这是一个新工具还是很好用的,在其中新建一个函数,别管Start和Update函数,我们待会会讲。

     

    加入以下代码:

     

    function OnCollisionEnter(theCollision : Collision){
    
     
    
    if(theCollision.gameObject.name=="Terrain"){
    
     
    
    Debug.Log("Hit terrain");
    
     
    
    }else if(theCollision.gameObject.name=="Wall"){
    
     
    
    Debug.Log("Hit the wall");
    
     
    
    }
    
     
    
    }
    

     

    如果看不懂这些代码的话,也没关系,JavaScript是最好学的编程语言,Google一下吧,保存这个JS文件,然后拖到我们的PlayerCube上。

     

    这时候我们运行,就会看到PlayerCube到处蹦,碰到Terrain的时候,控制台就会显示Hit Terrain,碰到wall的时候就会显示Hit the wall。

     

    第三节  检测用户输入

     

    下面我们来讲一下如何检测用户的键盘和鼠标的操作。

     

    就用我们上次的那个场景,这次我们给PlayerCube加上我们可以控制的动作。就是通过“wasd”或者上下左右键来控制移动。

     

    请注意,如果要使用这里使用的方法来控制移动,那么所控制的物体不能够是一个物理世界的物体,也就是说你要把RigidBody这个component删掉,如果你想要在物理世界里移动物体的话,你就需要我们在下面会讲到的力(force)。

     

    首先我们新建一个JavaScript文件,这里命名为InputDetect吧,输入下面的代码:

     

    #pragma strict
    
     
    
    var Player : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    Player = GameObject.Find("PlayerCube");
    
     
    
    if(Input.GetKey(KeyCode.W)){
    
     
    
    Debug.Log("Hit w");
    
     
    
    Player.transform.Translate(Vector3.forward * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.S)){
    
     
    
    Debug.Log("Hit s");
    
     
    
    Player.transform.Translate(Vector3.back * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.A)){
    
     
    
    Debug.Log("Hit a");
    
     
    
    Player.transform.Translate(Vector3.left * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.D)){
    
     
    
    Debug.Log("Hit d");
    
     
    
    Player.transform.Translate(Vector3.right * 2);
    
     
    
    }
    
     
    
     
    
    }
    

     

    这时,我们运行这个游戏,就可以通过“WASD”来控制PlayerCube的移动了。

     

     

    第四节 使用Prefab复制和控制物体

     

    我们可以直接把Prefab看做是个妈,她能生好多小孩,如果妈妈的DNA变了,小孩的跟着变,就是说你可以用Prefab创建物体,然后通过这个Prefab修改所有这类物体的性质,这对于批量生成的敌人或者NPC来说很有用。

     

    首先,先创建一个Prefab,我这里命名为“Mother”,之后新建一个Sphere物体,当然你也可以建一些其他的物体,之后给这个Sphere加上你想要的性质,我加入了RigidBody和Bouncy,之后将Sphere拖到Mother上,你会发现mother变蓝了,之后你就可以随意拖一些mother物体到屏幕上去,你会发现所有的Prefab创建出的物体在清单上都是蓝色的,说明他们都有共同的性质。

     

     

    当然,作用于一个Prefab上的脚本也会作用到它的子物体上去。

     

    第五节 使用Destroy命令消灭物体

     

    我们游戏中怎么能够没有敌人呢?有敌人就得能够消灭他们,这时候,我们就会使用Destroy命令了。

     

    在这里,我们使用上次Mother生出来的小球球作为敌银,一旦我们的PlayerCube碰撞到了小球的话,就是用Destroy让小球消失。

     

    新建一个JavaScript脚本,输入以下代码:

     

    #pragma strict
    
     
    
    var mother : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    
     
    
    function OnCollisionEnter(theCollision : Collision){
    
     
    
    mother = GameObject.Find("Mother");
    
     
    
    if(theCollision.gameObject.name=="Mother"){
    
     
    
    Debug.Log("Hit mother");
    
     
    
    Destroy(mother);
    
     
    
    }
    
     
    
    }
    

     

    这段代码很好懂吧,就是检验碰撞,然后销毁碰撞到的Mother物体,别忘了把Destroy的JavaScript文件拖到PlayerCube上去。运行一下,就可以看到碰撞到的物体都被消灭了。

     

     

    第六节 使用Instantiate命令创造物体

     

    我们直接在界面创造的物体都只是会在界面被初始化的时候加载,那么,如果为了节约内存或者其他什么事情,我想要在游戏过程中添加物体,那该怎么办呢?你猜对了,就是用instantiate命令。

     

    这个命令就是英文实例化的意思,下面我们给碰撞之后消失的mother物体继续初始化一些,也就是说消灭了一些,又来了一大波···

     

    为什么非要用mother呢?因为只有拥有Prefab的物体才能够使用这个命令哦亲。

     

    function Update () {
    
     
    
    var instance : GameObject = Instantiate (PreFab,transform.position,transform.rotation);
    
     
    
    }
    

     

    注意:这样的话,每次刷新一帧都会出现一个新的mother物体,你的内存也许会受不了哦,更合理的方法是按下空格键,然后出现一个新的物体,你可以自己做吗?试试看

     

    你可能已经注意到了,每一个初始化的脚本都会默认有两个函数,就是:

    Update()函数 —— 每刷新一帧都会检查并执行

    Start()函数 —— 只在场景初始化的时候执行

     

    第七节 使用Timer计时器

     

    这次,我们要让一个计时器倒数,倒数到0的时候创建一个mother物体,来看Javascript代码吧:

     

    #pragma strict
    
     
    
    var myTimer : float = 5.0;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    if (myTimer >= 0){
    
    myTimer -= Time.deltaTime;
    
    guiText.text=(""+myTimer);
    
    }
    
     
    
    if (myTimer <= 0){
    
    guiText.text = ("Done");
    
    }
    
     
    
    }
    

     

    把这个脚本拖到GUItext控件上,你会发现我们所期待的效果。

     

     

    第八节 让物体动起来

     

    其实让物体行动的技巧,我们已经会了,不是吗?

     

    如果你觉得不是的话,没有认真的看上面的文章哦,我就再给你讲一次吧。

     

    请特别注意,这种方法不适合物理世界的物体,如果向移动物理世界的物体,请看下一节:

     

    创建一个Cylinder物体,之后将下面的脚本附着在上面。

     

    #pragma strict
    
     
    
    var myObject : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    myObject.gameObject.Find("Cylinder");
    
    myObject.transform.Translate(Vector3(0,0,1));
    
     
    
    }
    

     

    第九节 使用物理世界的力

     

    这里是我们讲移动物体的重点,因为大部分的物体移动都是在物理世界完成的,而如果想要在物理世界移动东西,除了position和rotation的移动之外,就是使用“力”了,在高中学过经典物理学的人都知道,要使物体用移动,木有力是不行的,那么我们就开始吧,再新建一个什么物体,我新建了一个Capsule。

     

    之后,我会在这个物体的上方加一个力,让它用力的向下飞,触碰到地之后,通过bouncy这个性质再弹回来。新建一个JavaScript文件,就叫做Force吧,加入如下代码:

     

    #pragma strict
    
     
    
    var Power : float = 500.0;
    
     
    
    function Start () {
    
     
    
    rigidbody.AddForce(Vector3(0,Power,0));
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    

     

    运行之后,会发现capsule其实是个很有幽默感的物体。

     

     

    第十节 使用贴图和材质

     

    贴图和材质能够使你的虚拟3D世界看起来更加真实,不幸的是,需要大量在PS和AI中的设计工作,最近我一想到要打开PS就有点烦···呜呜。

     

    闲话少说,我已经做好了一个贴图,怎么使用在材质上呢?之后我们怎么才能通过材质使用到其他物体之上呢?

     

     

    就像你看到的一样,我是直接拖进去的···

     

    之后我们从新建菜单中选择Material这一项,之后选中material,将贴图拖进material的贴图选框里,之后,就可以拖动这个Material赋给任何物体了。

     

     

    第十一节 使用声效和音乐

     

    音效和音乐对于一个游戏来说是非常重要的,一个寂静无声的世界是无聊的,而且不真实,什么?你说声效和音乐是一个东西?那你就错了,声效是,比如说发射子弹的声音,什么东西爆炸的声音等等,而音乐则是背景音乐什么的,不一样的亲。

     

    对于音乐来说,往往使用立体声音乐,而对于生效来说,我们随便使用一个简单的音乐文件就可以了。

     

    想要在Unity3D中播放音乐,你需要两样东西,一个是监听器,一个是音乐源,监听器是Camera的一个组件,所以你不用担心,你唯一需要增加的就是音乐源。

     

    直接将项目中的音乐拖放到Audio Source项就可以播放,但是如果我们想要在某个特定的点上 播放音乐该怎么办呢?答案就是,写一个脚本,新建一个脚本,输入如下代码:

     

    #pragma strict
    
     
    
    var myClip : AudioClip;
    
     
    
    function Start () {
    
     
    
    AudioSource.PlayClipAtPoint(myClip,transform.position);
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    

     

    之后将这个脚本拖放到我们的物体上,最后,将音频文件拖放到AudioSource选项框中。

     

    第十二节 使用关节

     

    关节在3D游戏之中的应用非常广,主要在于物理世界的重力影响,下面我们就通过关节来制作一个钟摆。

     

    这次我们新建一个场景,松了一口气?刚才的场景是不是太乱了?你做的时候可以整理一下嘛,呵呵

     

    新建一个cube作为地面,之后一个cube放在上空作为摆垂,之后用几个capsule分别用component中的fixed joint连接起来,之后最上面的那个capsule与世界相连,使用Hinge Joint,这样的话,他会默认与世界相连,不用担心,看图

     

     

     

    第十三节 使用Axes

     

    在Edit – Project Setting – input 中可以查看各种形式的input,这些input方法在unity中被叫做Axes。

     

    我们创建一个JavaScript,叫做GetAxes,输入以下内容:

     

    #pragma strict
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    var Honriz : float = Input.GetAxis("Honrizontal");
    
     
    
    Debug.Log(Honriz);
    
     
    
    }
    

     

    在拖放脚本之后,运行这个场景,看看控制台输出了什么,你就明白了。

     

     

    第十四节 使用触发器

     

    触发器一般用于检测一个物体是否处于一个空间内,他是怎么做到的呢?

     

    首先,他创造一个大的物体,之后将他的randerer属性去掉,他就隐形了,这样,我们再把他的isCollide属性去掉,他就不会发生碰撞了,之后,我们只需要用脚本检测物体是否与这个物体碰撞就可以了。

     

    我们新建一个场景,做一个地板,再做一个底座,叠加起来,再在他们的上空做一个方块,设置rigidbody属性,将底座设置成为我们刚才说的那种隐形的状态,之后新建一个JavaScript脚本,输入代码

     

    #pragma strict
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    
     
    
    function OnTriggerEnter (myTrigger : Collider) {
    
     
    
    if(myTrigger.gameObject.name == "box"){
    
    Debug.Log("Hit");
    
    }
    
     
    
    }
    

     

    按下运行,会发现可以检测出Hit。

     

     

    第十五节 使用GUI

     

    其实我们已经学过了如何使用GUI text,不信,我们就用屏幕上的字代替我们在上面的程序中的Debug.Log现实的内容。

     

    你自己能做吗?

     

    试试看吧,一个下午写了这么多,有点累。

     

    一定要在Unity中加入一个GUI Text,运行一下,就会发现屏幕上的GUI Text会随着你设定的的内容而变化了。

    失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。
    展开全文
  • 深入浅出Unity3D——第一篇

    万人学习 2019-07-01 10:35:43
    Unity3D基础知识、游戏算法一网打尽。
  • Unity学习 — 官方中文版本教程详解

    万次阅读 2018-10-18 10:36:02
    Unity官网中文版来了一:简单介绍二:简单的顺序循环数组内元素三:截图四:功能实现结束五:支持 一:简单介绍 1,Unity推出的中文,有利于英文不太好的人去学习和记忆 2,由于版本限制,并不是所有版本都...


    一:简单介绍

    1,Unity推出的中文,有利于英文不太好的人去学习和记忆
    2,由于版本限制,并不是所有版本都可以使用


    二:版本选择下载

    去Unity官网下载最新版本Unity…https://unity3d.com/cn.
    从官网找到下载页面,点右面个人版
    在这里插入图片描述
    然后下载这个 Unity Hub版本
    在这里插入图片描述


    三:点击安装,并运行

    把刚下载的UnityHub版本安装并运行,会看到下面的页面
    在这里插入图片描述
    然后根据箭头选择到这个页面并选择你要下载的版本,红色箭头第一步,绿色为第二步
    在这里插入图片描述
    选择你要安装的版本,并把你需要的功能项勾上,最重要的是最下面语言包一定要勾选中文
    在这里插入图片描述
    下面就是等待安装完成,需要耐心等待一会,你可以去喝点小茶


    第二种实现:如果你电脑上已经安装了最新版本,不需从新下载,放个语言包,一键搞定!

    你可以自己去官网下载,也可以从我这里下载
    **中文语言下载.
    把你下载好的语言包放到你安装的Unity路径下的Data文件夹下即可
    在这里插入图片描述

    四:功能实现结束

    这是两个方法,都能实现中文版的Unity,把上面的步骤做完后,点开Unity,进入到Unity页面,你会发现还是英文版的,这是为什么呢?
    不要急,在Unity编辑器里还需要重要的一步,点击左上角Edit–选择下面的Perferences…进入到下面页面
    在这里插入图片描述
    然后选择中文语言包
    在这里插入图片描述
    有的会立刻改变过来,如果没有变,关闭Unity.从新打开就好了
    在这里插入图片描述
    本人初学,都是最基本的,善于交流,不断成长,如果你有好的实现方式多多分享噢
    如果哪里不好,请大神多多指教


    五:支持

    服务器总有一天你会需要,详细的服务器教程尽在 Jacob 博客,点点下方链接,轻松马上学会!
    阿里云Esc全解和建站方法--------------------------------------- 服务器建站

    展开全文
  • 2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。...Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...

    2018年什么游戏最火?

    不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。

     

    只会打游戏,不去研究可不行。一直在想,像王者荣耀这样火的游戏是用什么引擎和语言开发的?

    这里就不得不说到现在最主流的游戏开发引擎——Unity3D了。

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    相信做开发的人知道Unity3D,很多小伙伴也在找它的教程,今天我就分享一下Unity3D视频教程,希望能帮到大家。

    Unity3D基础视频

    http://yun.itheima.com/course/137.html?stt

    资料:http://pan.baidu.com/s/1eSDUbTo 密码:o97j

    课程介绍
    这是一套关于unity的基础课程,由传智大沙漠老师随堂录制。本套课程从C#语言开始,介绍了很多语言方面的特性,这些特性在unity开发及插件使用中都会出现。接下来是关于unity的操作,包括:模型、物理引擎、粒子系统、渲染、脚本生命周期、着色器、优化等知识点。通过学习这些内容,能够独立完成一些简单的游戏开发,并为接下来更高阶段的学习提供帮助。
    视频概况
    【第一天】
    讲解C#的基础知识,主要讲语法、面向对象两个知识点。如果你有C语言的开发基础,你会发现他们太像了,是的,语法非常相似。面向对象的三大特性:封装、继承、多态,会逐一讲解,并通过一些示例代码让你有更深入的理解。最后讲解了枚举与标志枚举的使用。
    【第二天】
    讲解常用的C#的类及函数。包括泛型、集合(List<T>与Dictionary<K,V>)、文件IO操作(主要是FileStream类)、Ado.Net(操作数据库),并以MySql数据库为例进行crud操作。
    【第三天】
    讲解C#的高级部分。包括:在函数的参数主要有3种方式传递,分别为:值传递,ref引用传递,out引用传递;关键字params实现参数的数组化;扩展方法的实现;委托与事件、lambda表达式的使用;线程的使用;最后讲解了单例、工厂、发布-订阅三种设计模式。
    【第四天】
    讲解C#的套接字Socket。以聊天室为示例,自定义传输协议,客户端能够收发信息,服务器端则负责将客户端发来的转发给其它客户端。主要讲解了Socket类的构造方法、Connet、Bind、Accept、Receive、Send等方法的使用。
    【第五天】
    讲解unity的知识点主要包括:坐标系;摄像机的投影方式;内置对象的使用;Scence面板的操作;用户接入;游戏对象的旋转、移动;预设与复制;导入模型;动态的两种方式Animation、Animator;在VS中调试。
    【第六天】
    讲解unity的知识点主要包括:光照及烘焙;第一人称与第三人称设置;地形系统;粒子系统;物理引擎中的刚体、碰撞检测、角色控制器。最终通过学习的知识点完成了打箱子、夏威夷漫游两个小示例。
    【第七天】
    讲解unity的知识点主要包括:音频的播放;预保存;资源加载;场景切换;协同调用;WWW类;寻路导航。在寻路中主要实现了自定义、水平跳、向下跳三种自定义移动方式,以及动态选择层。
    【第八天】
    讲解unity的知识点主要包括:GUI、uGUI、NGUI。重点介绍的是NGUI,通过NGUI可以制作图集、字体(结合BMFont)、交互脚本(以Button为例)、动画脚本(以宽高为例),最后完成了滚动栏、拖曳的效果。

     

    展开全文
  • 2019年Unity学习资源指南[精心整理]

    千次阅读 2019-07-14 14:02:23
    前言 进入一个领域,最直接有效的方法就是,寻找相关综述性文章,首先你需要对你入门的领域有个概括性的了解,这些包括: 1、主流的学习社区与网站。 2、该领域的知名大牛与...2019年Unity学习资源指南(本文相...
  • Unity3D 2018安装教程

    万次阅读 2019-06-15 21:42:20
    安装步骤: ...Unity2018.3.0相较2017版本的在启动时稳定了很多(2017版本启动经常会卡在loading界面) 如果启动Unity2018.3.0时一直卡在loading界面进不去,可以尝试以下两种解决办法: 1.1:将计算...
  • Unity3D官方教程爬坑

    万次阅读 2019-10-17 15:51:04
    同时会添加到处学来的的Unity技巧 ---------------------------------------------------------- 代码: 1.使游戏对象运动的N种方式 更全面的移动方式参考 1、rigidbody.addforce(Vector3 * speed) (见roll...
  • 最近在做项目的过程中遇到这样的一个需求:玩家可以在游戏过程中进行实时存档,在存档过程...首先是截取游戏画面,这个问题大家可以在《Unity教程之-Unity3d游戏开发之截屏保存精彩瞬间》这篇文章中找到答案。其次是从
  • HTC Vive Unity 教程

    万次阅读 多人点赞 2017-04-06 13:45:15
    原文:HTC Vive Tutorial for Unity 作者: Eric Van de Kerckhove 译者:kmyhy HTC Vive 是一个虚拟现实头盔,由 HTC 和 Valve 公司制造。它提供一种在虚拟世界中的浸入式体验,而不是屏幕头像。如果你是一个 ...
  • 一些值得学习的Unity教程

    万次阅读 多人点赞 2019-07-26 09:51:44
    ***********************项目源码******************************** 1. 降临 2. 沉睡缤纷乐 3.... 4.... 5.... 6....天天萌泡泡 源码都分享在群里:375151422*****************************Git开
  • Unity学习记录①: 关于教程无法正常运行的问题 可能有的同学在从UnityHub上开官方教程的时候会遇到这种情况: 直接弹出了这种界面而没有官方教程的亲切对话框 (我有问过学长,据说是版本问题,GetStarted这套教程...
  • [原创]unity教程之2048游戏01。

    千次阅读 2016-08-17 09:57:59
    不会用到任何插件(ngui)什么的,希望想入门学习的朋友,通过unity本身的功能完成制作,能进一步巩固自己的知识。由于逻辑稍显复杂,我也是参考网络上的,不是指的游戏的纯逻辑,因为涉及到对象的移动和销毁等,...
  • 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D 作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢! Unity3D有什
  • 教程将为刚接触unity的初学者讲解如何在Unity中实现3D立方体的堆叠,利用一个或多个预制件动态创建立方体进行拼接,为这些立方体赋予不同的颜色。  下载本文的示例工程,示例工程使用Unity 5.3.1f1。 ...
  • Unity教程之-Unity3d自带寻路Navmesh

    千次阅读 2017-08-01 18:49:46
    Unity教程之-Unity3d自带寻路Navmesh <p>  前面的文章《Unity教程之-Unity3d自动寻路功能介绍演示》我们学习过unity3d的自动寻路,最近收到有些朋友的反馈,关于unity3d的寻路的介绍还不是太深入,那么下面我们...
  • 我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得...
  • Unity 安装的时候,会提示安装的 组件,里面就有 教程 和 标准 工程。详见相关文章1 如果没有安装教程 ,可以 在 Unity 的 AssetStore 里面搜索 publisher:Unity Technologies, 相关文章: 1....
  • http://www.unitymanual.com/thread-6498-1-1.html
1 2 3 4 5 ... 20
收藏数 25,233
精华内容 10,093
关键字:

unity教程