拾苹果

拾苹果是一个常见并很容易通过Unity实现的游戏原型,主要利用物理引擎以及碰撞,加上一点点代码就可以实现。But,很多有趣的游戏都是在此基础上的变种,虽然你可能很难联想到,但只要你玩的一款游戏利用了重力、碰撞,你都可以通过这个原型去实现它。

在此,我不会将详细的过程和代码贴出来,想要进一步学习的同学,可以在《游戏设计、原型与开发》中找到详细的步骤,本文仅对书中的做法作进一步补充。另外,本文也不是为了教你如何去写代码,而是如何去设计一款游戏。

-----------------------------------------------------------------------正义的分割线--------------------------------------------------------

 首先,我们来思考一下拾苹果的机制(假设我们已经决定了这个主题),用篮子去接住从空中掉落的苹果,一句话就能说明我们游戏的核心。在游戏中必然需要的对象有苹果和篮子,用红色的球体和木色的方块去代替就可以了。篮子是玩家的控制对象,让玩家去符合心意的控制Z轴显然不可能,我们只需要将篮子在二维平面上移动,人也不可能在任意高度去接苹果,因此篮子只能在一条直线上运动,那我们就现在完成对篮子的控制,给篮子添加一个控制脚本Basket。

public class Basket : MonoBehaviour {

  //在检视面板控制篮子高度,你可以把它当作类似于百分比,0为底部,1为顶部
  public float Height = 0.1f;

  //将屏幕高度转变为3D空间高度,这样篮子的高度不需要根据不同的屏幕大小做修改

  private float worldHeight{
    get{
      Vector3 portPos = new Vector3 (0, Height);
      Vector3 worldPos = Camera.main.ViewportToWorldPoint (portPos);
      return worldPos.y;

    }
  }

  void Update(){
    transform.position = new Vector3 (transform.position.x, worldHeight);
  }
}

 

当然,你还需要把篮子创建出来,不仅仅是篮子,包括苹果,你都需要一个已经存在于场景中的脚本去创建这些物体。你可以在场景中放一个空物体作为游戏的控制器,然后在上面添加控制器脚本。

public class GameManager : MonoBehaviour {

  //除了在检视面板赋值,还可以将Basket预物体放在Resource文件夹下,通过Resource.Load()加载,也可以打成AssetBundle再加载,这不在本文关注点内
  public GameObject Basket;

  void Start(){
    CreateBasket ();
  }

  void CreateBasket(){
    Instantiate (Basket);
  }
}

这时运行游戏,可以发现篮子高度位置和Basket脚本的Height关联在一起,而且在任何屏幕宽高比下都是在正确的比例高度上。

Tips:1.切换屏幕大小,需要重新启动游戏;

        2.你也许想要总在某一分辨率单位的高度上,可以用ScreenToWorldPoint方法替代ViewportToWorldPoint;

  3.多把方法具体化,封装好,这有利于以后的拓展;

  4.不要在控制器类里决定篮子的位置等详细信息,以后这里可能会有很多对象,还是放在对象的脚本里更容易管理。

  5.多数情况下把这些整个游戏中只会存在一个的控制器类做成单例模式也许会更好,但为什么会存在两个相同的继承于MonoBehaviour的控制器类呢?

 

现在试着让篮子跟随鼠标移动。

void Update(){

  //在Basket脚本中的Update中添加一句就足够了。将鼠标或触屏位置转变为3D空间位置,然后将X轴坐标赋予给篮子。

  Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
  transform.position = new Vector3 (mousePos.x, worldHeight);
}

 

接下来让苹果掉落,你可以去每一帧控制苹果的位置,还可以给苹果加上Rigidbody组件,勾选Use Gravity,Unity的物理引擎会让它自由落体,这更符合实际。如果你还没有忘记中学的物理知识,你会知道物体的加速度与重力相关,你可以更改系统的重力加速度,来让苹果下落的更快或更慢来调节游戏难度,而不需要更多的代码支持。另外作为二维游戏,你也不希望苹果的位置在Z轴上发生变化,所以把它的z轴冻结起来,将Freeze Position的Z勾选起来。像创建篮子一样创建苹果,代码几乎是一样的,但是将他们统一封装起来或许也没有必要。

在GameManager中创建按照一定的频率生成苹果

InvokeRepeating("CreateApple",AppleDropStartTime,AppleDropCyc);

你会发现场景中不停创建新的苹果,总有一天,你的应用会因内存崩溃的。因此我们需要在苹果离开屏幕后,将苹果销毁掉。

在Apple脚本中:

void Update(){
  if (Camera.main.WorldToViewportPoint (transform.position).y < 0) {
    Destroy (gameObject);
  }
}

现在苹果会在离开屏幕后被消除掉,但是这种做法效率不高,我们可以使用游戏编程中最常用的手段——池。有关池的内容,会在技术分类里再去讲,这里就不拓展了。

接着让苹果从随机的位置落下,只要每次创建苹果的时候让它的的X轴位置随机就可以了。

在Apple脚本的Start()中,更改transform.position = new Vector3 (Camera.main.ViewportToWorldPoint(new Vector3(Random.Range(0,1f),0)).x, worldHeight);

最后,游戏需要有胜利和失败的条件,或为游戏制定关卡,然后就是不停的试玩游戏,为游戏添加更多的元素,调整游戏的参数使之更为平衡。

posted @ 2017-12-02 21:46  Vongolar  阅读(559)  评论(0)    收藏  举报