Unity3D游戏开发之使用Unity3D开发2D游戏(二)(2DTookit插件亲测)

转载,本文出处:点击打开连接 ide

你们好,今天博主继续为你们带来Unity3D游戏开发系列文章,咱们接着在上一篇文章中最后留下的那几个问题来说解Unity3D游戏开发的相关知识。在上一篇文章最后,咱们留了这样几个问题:布局

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

         二、人物向下移动时,会钻到地底下测试

         三、摄像机如何跟随人物实现平移动画

         四、小地图的实现this

         五、场景地图范围控制spa

         

        一、人物范围控制.net

        对于这个问题,目前的解决方案是在地图上采集地图上的建筑物的坐标,而后判断人物的坐标和建筑物坐标的关系,博主我的感受难度很大,由于咱们的图是放在Plane上的,获取地图上建筑物的坐标显得十分困难。插件

        二、人物向下移动时,钻到地底下设计

        这个问题产生的缘由是咱们角色的贴图和地图的贴图放在了同一个平面上,咱们知道,摄像机在空间内投影的时候,存在一个Z方向上的景深问题,咱们全部的绘制都要在不超过这个景深的前提下进行,不过我彷佛并无在设置面板中找到这个选项,后来尝试了一种方法,就是调整角色所在的Plane的Z方向坐标,具体调节你们能够本身尝试。

       三、摄像机随人物的平移

       对于这个问题咱们能够在角色的位置发生变化的时候,让地图向相反的方向产生一个平移,这样角色的运动感就有了,代码以下:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到个人代码片
  1. if(Input.GetKey(KeyCode.A))  
  2. {  
  3.    mCamera.transform.Translate(Vector3.right*Time.deltaTime*(-mSpeed));  
  4. }  
  5. //向右  
  6. if(Input.GetKey(KeyCode.D))  
  7. {  
  8.    mCamera.transform.Translate(Vector3.right*Time.deltaTime*(mSpeed));  
  9. }  
  10. //向上  
  11. if(Input.GetKey(KeyCode.W))  
  12. {  
  13.    mCamera.transform.Translate(Vector3.up*Time.deltaTime*(mSpeed));  
  14. }  
  15. //向下  
  16. if(Input.GetKey(KeyCode.S))  
  17. {  
  18.    mCamera.transform.Translate(Vector3.up*Time.deltaTime*(-mSpeed));  
  19. }  
       注意将地图平移的速度设置得小一点,这样人物移动的时候才会显得真实。

       四、小地图的实现

       对于3D游戏而言,咱们能够另外设置一个摄像机从上方进行投影,对于2D游戏,博主的思路是在大地图里获取角色人物的位置,而后根据大地图与小地图的缩放比例,从新计算角色人物在小地图上对应的坐标,而后在该点处完成绘制便可,不过,博主并无实现这一功能,由于在对大地图的宽度和高度计算上,目前依然存在问题。

      五、地图边界的判断

      经过GameObject.Find()方法获取地图所在的Plane,进而能够获取当前游戏界面的宽度、高度,不过在测试的过程当中,博主发现这样方法得到的高度、宽度与实际状况相去甚远,因此但愿若是有知道怎么解决这个问题的朋友,可以告诉我啊。

       

       到目前为止,不管是经过GUI绘制的方式仍是经过旋转坐标轴的方法来实现2D游戏的开发,咱们发现经过这种方式制做2D游戏的效率实在不敢恭维,怎么办呢?下面隆重请出Unity3D王牌插件——2DTookit,博主郑重推荐:2DTookit是目前为止在Unity3D领域制做最好的2D插件,下面就请你们跟随我一块儿来学习使用2DTookit来制做2D游戏吧!

       一、导入2DToolKit的资源包

       二、首先咱们在Project视图下建立一个文件夹Textures,在这里咱们存放一些用于制做2D游戏画面的素材


      三、接下来咱们建立一个文件夹TextureCollection用于存放咱们的精灵集合。

      四、在此文件夹上右键单击建立一个Sprite Collection


      五、将生成的文件更名,这一步是必须的,这里咱们更名为SpriteTextureCollection。

      六、选择文件,在右侧的属性面板单击Onen Editor按钮,打开设计器。咱们将项目目录中的素材文件拖入到下面这个窗口的左侧,完成素材的添加后点击Commit进行提交。



    七、在场景布局界面,咱们建立一个Sprite,此时属性窗格中的Collection即为咱们第五步中建立好的精灵集合文件,咱们能够再下面的Sprite属性中选择当前精灵要显示的文件。


       八、重复第7步,咱们最终能够作出来这样一个场景效果:



     这样咱们就完成了精灵的添加,下面咱们来建立一个动画精灵,首先准备若干张连续的动画文件,咱们这里按照动画的类型,将它们放在不一样的文件夹里,以便于管理。


        

       接下来咱们将这些图片添加到精灵集合中,不要告诉我你不知道怎么添加啊?和上面的方法是同样的。好了,下面咱们来建立一个动画精灵的集合文件,咱们添加一个目录:AnimationCollections,右键单击建立Sprite Animation


       相似地,右侧属性窗格有个Open Editor按钮,单击它打开下面的界面:


        如今咱们在左侧建立若干个片断,这里每个片断就是一组动画,咱们能够在右侧经过Inset按钮向里面添加动画,这里咱们建立了三个动画,待会咱们会用到。最后点击Commit提交!

        如今在布局界面建立动画精灵:


       和普通精灵相似,咱们能够在右侧属性窗格选择对应的动画集合,为角色指定一个动画.

       最后给出脚本:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到个人代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class PlayerScript : MonoBehaviour {  
  5.       
  6.     //定义一个动画精灵对象  
  7.     private tk2dSpriteAnimator mSprite;  
  8.     //定义角色状态枚举  
  9.     private enum PlayerState  
  10.     {  
  11.        Stand,  
  12.        Walk,  
  13.        Hit,  
  14.        Jump  
  15.     }  
  16.     //初始化角色状态为站立状态  
  17.     private PlayerState mState=PlayerState.Stand;  
  18.       
  19.     void Start ()   
  20.     {  
  21.        //获取动画精灵  
  22.        mSprite=this.GetComponent<tk2dSpriteAnimator>();  
  23.        //禁用自动播放  
  24.        mSprite.playAutomatically=false;  
  25.     }  
  26.       
  27.   
  28.     void Update ()   
  29.     {  
  30.        if(Input.GetKey(KeyCode.D))  
  31.        {  
  32.           mSprite.Play("WalkClip");  
  33.           transform.Translate(Vector3.right * Time.deltaTime);  
  34.           mSprite.playAutomatically=true;  
  35.           mState=PlayerState.Walk;  
  36.        }  
  37.        if(Input.GetKey(KeyCode.Space))  
  38.        {  
  39.           if(mState!=PlayerState.Jump)  
  40.           {  
  41.              mSprite.rigidbody.AddForce(0,200,0);  
  42.              mState=PlayerState.Jump;  
  43.           }  
  44.        }  
  45.        if(Input.GetKey(KeyCode.J))  
  46.        {  
  47.           mSprite.Play("HitClip");  
  48.           mSprite.playAutomatically=true;  
  49.           mState=PlayerState.Hit;  
  50.        }  
  51.        if(Input.GetKeyUp(KeyCode.Space) || Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp(KeyCode.J))  
  52.        {  
  53.           mSprite.Stop();  
  54.           mSprite.Play("StandClip");  
  55.           mSprite.playAutomatically=true;  
  56.           mState=PlayerState.Stand;  
  57.        }  
  58.     }  
  59. }