美文网首页
如何使用Unity开发2D游戏-弹球案例

如何使用Unity开发2D游戏-弹球案例

作者: 街头顽禽 | 来源:发表于2018-05-24 21:26 被阅读121次

第一课:案例介绍

如何改变默认2D/3D默认游戏开发模式:Edit -> Project Settings -> Editor -> Default Behaviour Mode(2D/3D)

第二课:添加背景

1.导入资源,我这里采用的是直接将资源复制到Assets文件下

2.将Sprite的Texture Type设置为Sprite(2D and UI)

3.直接将BG拖到Hierarchy面板下,添加一个名为BackGround的Layer,并选择锁定BackGround层

4.添加一个名为BackGround的sorting Layer并设置此层,将此层拖到默认层的上边

5.Layer Sorting Layer Order in Layer(值越大越先渲染)

第三课:设计Player预制体

1.将Sprites下的player拖拽到Hierarchy面板下

2.调整位置,添加Box Collider 2D组件和Rigidbody 2D组件,并调整碰撞盒子的大小,将物理组件的重力设置为0(不能掉下去)

3.给Player添加一个名为PlayerController移动的脚本组件

4.具体代码为: public KeyCode upKey;

                            public KeyCode downKey;

                            public float speed = 5;

                            private Rigidbody2D Rigidbody2D;

void Start() { 

                           Rigidbody2D = GetComponent();

}

void Update() {

                      if(Input.GetKey(upKey)){

                      Rigidbody.velocity = new Vector2(0,speed);

          }else if{

                    if(Input.GetKey(downKey)){

                    Rigidbody2D = new Vector2(0,-speed);

        }else{

                    Rigidbody2D = new Vector2(0,0);           

        }

    }

}

5.在Player的Inspector面板下指定upKey和downKey为w键和s键盘

第四课:添加围墙-UpWall

1.创建一个空物体CreatEmpty,重命名为GameManager

2.在GameManger游戏物体下创建上下左右围墙(UpWall,DownWall,LeftWall,RightWall)

3.分别添加Box Collider组件

4.添加脚本组件GameManger控制墙的生成位置

5.具体代码为:private BoxCollider upWall;

                           private BoxCollider downWall;

                           private BoxCollider leftWall;

                           private BoxCollider rightWall;

void Reset() {

                         upWall = transform.Find("UpWall").GetComponent();

                         downWall = transform.Find("DownWall").GetComponent();

                         leftWall = transform.Find("LeftWall").GetComponent();

                        rightWall = transform.Find("RightWall").GetComponent();

                        upWall.transform.position = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width/2,Screen.height)) + new                                                     Vector3(0,0.5f,0);

                         float width = Camera,main.ScreenToWorldPoint(new Vector2(Screen.width,Screen.height)).x*2;

                         upWall.size = new Vector2(width,1);

}

第五课:完善围墙的生成

1.将之前生成UpWall的围墙注释掉,快捷键Ctrl+k,Ctrl+c

2.优化代码,具体的代码是:Vector2 tempPosition = Camera.main.ScreenToWorldPoint(new Vector(Screen.width,Screen.height));

                                                    upWall.transform.position = new Vector2(0,tempPosition.y+0.5f);

                                                    upWall.size = new Vector2(tempPosition.x*2,1);

                                                  downWall.transform.position = new Vector2(0,-tempPosition.y-0.5f);

                                                  dwonWall.size = new Vector2(tempPosition.x*2,1);

                                                  leftWall.transform.position = new Vector2(-tempPosition.x-0.5f,0);

                                                  leftWall.size = new Vector2(1,tempPosition.y*2);

                                                  rightWall.transform.position = new Vector2(tempPosition.x+0.5f,0);

                                                  rigthWall.size = new Vector2(1,tempPosition.y*2);

3.运行游戏,在Scene面板中查看墙的生成

第六课:控制Player的生成

1.控制Player的位置生成

2.具体代码如下:首先要注意MainCanera的Position的的z轴为-10,

                                public Transform player1;

                                public Transform player2;

                                void ResetPlayer() {

                                Vector3 player1Position = Camera.main.ScreenToWorldPoint(new Vector3(100, Screen.height/2,0));

                                player1Position.z = 0;

                                player.position = player1Position;

                                Vector3 player2Position = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width-100,Screen.height/2,0));

                                player2Position.z = 0;

                                player2.position = player2Position;

}

3.在GameManager脚本组件下给player1和player2赋值

第七课:添加小球

1.将小球的Sprite拖拽到Hierarchy面板下Reset

2.添加Circle Collider 2D和Rigidbody 2D并设置相关属性,摩擦力为0,质量0.2,重力为0

3.在2D物理组件中将小球的z轴的旋转锁定,添加一个2D的物理材质,赋值给Rigidbody 2D的Materials

4.将2D物理材质的Friction(摩擦力)设置为0,弹力设置为最大值1

5.添加一个名为BallMove的脚本组件,给它一个初始的力和方向

6.具体代码为: private Rigidbody2D rigidbody2d;

                            int number = Random.Range(0,2); //0和1,不包含最大数2

                            void Start() { rigidbody2d = gameObeject.GetComponent();

                                             if(number == 1){

                                                          rigidbody2d.AddForce(new Vecctor2(100,0));

                                            }else{

                                                         rigidbody2d.AddForce(new Vector2(-100,0));

                                           }

                          }

7.Ctrl+s保存代码,运行游戏,发现小球类可以左右弹跳了

第八课:控制对小球的方向的影响

1.添加并设置Player的Tag标签为Player

2.在BallMove脚本中添加以下脚本:void OnCollision2D(Collision2D col){

                                                                         if(col.collider.tag == "Player") {

                                                                         Vector velocity = rigidbody2D.velocity;

                                                                          velocity.y = velocity.y/2 + col.rigidbody.velocity.y/2;

                                                                          rigidbody2d.velocity = velocity;

                                                                          }

                                                               }

3.运行游戏,小球可以受到来自Player的y方向的力了

第九课:完善小球的移动

1.在每次和player碰撞后输出当前的速度

2.我们会发现小球在x轴的速度有时会降低

2.我们会发现小球在x轴的速度有时会降低

3.为了解决这个问题,我们可以每帧检测小球的速度,一旦在-9-9之间,我们就让他回到10或-10的速度

4.在Update函数中添加以下代码:void Update() {

                                                     Vector2 velocity = rigidbody.velocity;

                                                    if(velocity.x < 9 && velocity.x>-9 && velocity.x != 0) {

                                                    if(velocity.x > 0) {

                                                    velocity.x = 10;

                                                    }else{

                                                    velocity.x = -10;

                                                    }

                                                    rigidbody.velocity = velocity;

                                          }

                            }

5.现在逐帧检测小球x方向的速度是否低于10,如果是,则变回10的速度

6.可以尝试用类似的方法尝试限制小球y方向的速度

第十课:添加计分功能

1.添加GUI Text组件显示,将锚点设置在中上位置,命名为Score1和Score2

2.改变Font Size的大小,上下左右居中,text设置为0

3.添加代码,实现加分功能,具体代码是:void OnCollisionEnter2D(Collision2D col) {

                                                                                 if(col,gameObject.name == "LeftWall" || col.gameObject.name == "RightWall") {

                                                                                 GameManager.Instance.ChangeScore(col,gameObject.name);

                                                                                 }

                                                                           }

GameManager脚本内:

                          using UnityEngine.UI; //引入UI命名空间

                          //单例模式

                          private static GameManager _instance;

                          private int score1;

                          private int score2;

                          public Text textScore1;

                          public Text textScore2;

                          public static GameManager Instance {

                          get{return _instance;}

                          }

                          void Awake() {

                          _instance = this;

                          }

                        public  void ChangeScore( string wallName) {

                        if(wallName == "LeftWall") {

                        score2++;                         

                          }else if(wallName == "RightWall") {

                        score1++;

                        }

                        textScore1.text = Score1.ToString():

                        textScore2.text = Score2.ToString();

}

4.最后到GameManager的Inspector面板内指定一下GUI Text组件

第十一课:添加音效

1.在主摄像机身上添加背景音乐,设置play on awake和Loop,volume设置为0.5

2.在player身上添加声音源组件,在player的脚本上添加一个碰撞函数OnCollisionEnter2D,设置碰撞游戏物体名字为Ball时播放音效

3.在Ball身上添加音频源组件,选择音频剪辑,设置为默认

4.在GameManager的碰撞函数中添加播放音效代码,当碰撞到UpWall或者RightWall时播放

第十二课:添加按钮重置功能

1.在Canvas下面添加一个名为ResetButton的Button按钮

2.在GameManager脚本中添加一个Reset的方法,回到Unity,添加一个按钮点击事件,选中GameManager下的Reset方法

3.分数可以直接在GameManager中重置,重置小球就要在BallMove添加一个重置的方法

4.具体代码为:

GameMnager:

                        public void Reset() {

                        score1 = 0;

                        score2 = 0;

                        textScore1.text = score1.ToString();

                        textScore2.text = score2.ToString();

                        GameObject.Find("Ball").SendMessage("BallReset");

}

BallMove:

                void GoBall() {

                int number = Random.Range(0,2);

                if(number == 1){

                rigidbody2d.AddForce(new Vector2(100,0));

                }else{

                rigidbody2d.AddForce(new Vector2(-100,0));

                }

      }

              public void BallReset() {

              transform.position = Vector2.zero;

              GoBall();

}

5.重置功能成功实现

第十三课:发布游戏

1.发布游戏到PC端和Web端

相关文章

网友评论

      本文标题:如何使用Unity开发2D游戏-弹球案例

      本文链接:https://www.haomeiwen.com/subject/uglejftx.html