拾苹果

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

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

-----------------------------------------------------------------------正义的分割线--------------------------------------------------------学习

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

public class Basket : MonoBehaviour {orm

  //在检视面板控制篮子高度,你能够把它看成相似于百分比,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;游戏

    }
  }ip

  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);

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

相关文章
相关标签/搜索