如何使用Unity开发另一个平台游戏。 另一个教程,第2部分

在第一篇文章( 在此处 )的续篇中,我将继续基于文章“ 2D游戏的关卡设计模式”开发平台游戏

在发布第一篇文章之后,我们明确地确定其中描述的按钮控件是完全不方便的。 因此,在游戏杆上重做了游戏中的控件。 此外,不幸的是,游戏没有在游戏市场中通过审核。 上周五,我收到通知,该项目由于收集元数据而被拒绝。 顺便说一句,我的第一个平台游戏“ Knight Kadavar”也被拒绝了,因为据称要求许可以管理呼叫和查看SMS(这是他们的机器人的愚蠢之举。该游戏不需要任何许可)。 然后Google要求我书面通知我为什么需要它。 但是,一切都以我修复了一些我发现的错误并将游戏发送到重新审核这一事实结束。 她已成功添加到Playmarket。 现在,我打算对此游戏做完全一样的事情。

因此,创建第二个场景后,图案便会自动关闭

场景


一个基于概念的关卡/世界的片段通常是一个克服的困难。

红利


对玩家有积极影响的收藏品

我们为卢卡斯实现了两种奖金:

  • 消灭怪物时会掉落的急救箱
  • 卢卡斯将能够用剑扔向敌人的箱子

要使用急救箱实施奖励,您必须使用怪物来修改预制件。 更具体地说,指出奖金将出现的位置。



然后,修改Enemy.cs脚本:

扰流板方向
/* ,        */ [SerializeField] private GameObject bonusPref; //   [SerializeField] private Transform instBonus; //     [SerializeField] private int isBonus; //    ,     /*   */ public void ifDie() { if (Damage(0) <= 0) { isBonus = Random.Range(0,3); if (isBonus == 0) { Instantiate(bonusPref, instBonus.position, instBonus.rotation); } Destroy(this.gameObject); } } 


我们调用返回类型为Damage(0)的函数,并检查Health 0是否返回,如果是,则调用随机数生成器。 如果生成器通过选择数字0停止,则我们向玩家分配奖励并消灭怪物。

接下来,我们描述您可以使用此奖金做什么。 为此,请使用组件SpriteRenderer,BoxCollider2D和Rigidbody2D创建其预制件。 另外,创建一个脚本,该脚本将负责苹果与播放器碰撞时需要执行的操作:

扰流板方向
 public void OnTriggerEnter2D(Collider2D collision) { switch (collision.gameObject.tag) { case "Player": { HeroScript.Health = 100; Destroy(this.gameObject); } break; } } 


查看预览视频

接下来,我们意识到失去剑的好处。 可以根据与第一部分相同的原理来实现,实现了对数丢失。 有趣的是,当卢卡斯捡起剑时,只需要在敌人的视野内扔剑,而卢卡斯收集原木时则不需要。 确实,以现在实现Attack \ item collection按钮的形式,它可以做到这一点。 在任何情况下,剑都被扔掉了。 为此,我们修改攻击/收集脚本代码:

扰流板方向
  /*      */ [SerializeField] private GameObject swordPref; //    [SerializeField] private Transform instSword; //     [SerializeField] private float swordSpeed; //    private float attackInBoxX, attackInBoxY; //    /*       */ // ED  EnemyDamage Collider2D[] ED = Physics2D.OverlapBoxAll(Hero.position, new Vector2(attackInBoxX, attackInBoxY), 12, lEnemy); { if (ED.Length > 0) { if (InventoryOnHero.swordCount == 0) { Debug.Log(" "); } if (InventoryOnHero.swordCount > 0) { instantiateSword(); InventoryOnHero.swordCount = InventoryOnHero.swordCount - 1; } else { for (int i = 0; i < ED.Length; i++) { ED[i].GetComponent<Enemy>().Damage(1); } } } } 


这些代码行是什么意思? 首先,我们定义一个对撞机数组,并检查落入立方体中的所有物体:

 Collider2D[] ED = Physics2D.OverlapBoxAll(Hero.position, new Vector2(attackInBoxX, attackInBoxY), lEnemy); 

注意传递的参数,它们与用于OvelapCircleAll的参数有很大不同。 关键参数-

 Vector2(attackInBoxX, attackInBoxY) 

然后满足条件,如果对撞机数组大于0,则我们检查剑的库存。 如果剑数为0,则不执行任何操作并执行该方法
 ED[i].GetComponent<Enemy>().Damage(1); 
好像是正常的打击。 如果大于0,则释放剑并将剑数减少1。

接下来,执行InstantiateSword()方法;

扰流板方向
  private void instantiateSword() { GameObject newArrow = Instantiate(swordPref) as GameObject; newArrow.transform.position = instSword.transform.position; Rigidbody2D rb = newArrow.GetComponent<Rigidbody2D>(); if (GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0) { rb.velocity = new Vector3(swordSpeed, 0, 0); } else { rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180); } } 


如果您很好地阅读了上一篇文章,您可能已经注意到,此代码类似于一段负责拍摄向日葵的代码。 在本节代码中添加了一些行,这些行负责确定Lucas的规模。 也就是说,他向左或向右看:

 (GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0) 

如果卢卡斯向左看,则

 rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180); 

剑向左飞,然后旋转180度。

查看预览视频

执行此操作后,我们自动关闭了另一个1模式:

对象


任何出现在游戏场景中并能够更改其状态的实体。 对象包括危险,敌人,加成等。

尽管很可能在更早编程第一个怪物时就实现了这种模式。

结果,目前尚未实现3种模式:

  • 无法到达的区域
  • 机械师
  • 老板

我现在对机械工很感兴趣。 因为我无法告诉自己我完全了解不同的人对此定义的理解。

此外,一个无法到达的区域 。 在本期中,我将处理一段时间的关卡设计问题。 首先,因为我想使第三级变暗。 最有可能是洞穴或地牢。 具有实现照明效果的能力。

老大 ! 它也将成为蛋糕上的樱桃。 我想使其尽可能独立并且具有改变外观的能力。

文章的第一部分
所有游戏对象均来自https://opengameart.org/ ,即:



随时在Habré上或给我写评论,地址为worldofonehero@gmail.com。

谢谢您的阅读,祝您好运。

Source: https://habr.com/ru/post/zh-CN460561/


All Articles