unity5 in action学习笔记

本文章所记载的代码来自Unity 5 实战,使用c#和Unity开发多平台程序

本文章是原创文章,记载的是一个2d游戏,来自unity5实战第五章内容,下图是游戏运行的样子,下面来说步骤

首先导入精灵,需要精灵的可以留下邮箱,我发送源代码,下面我会详细描述步骤,希望大家都可以看懂,知道过程

首先将背景图拖入scene,注意图像的transform的z轴,z轴越小那么离场景越近,在2d游戏中需要将摄像机视图设置为正交,而不是透视,因为背景图最靠外,或者说最远离场景,所以z轴最大,其次是卡片正面精灵,卡片背面精灵,然后是摄像机的z轴,摄像机的z轴最小,可以设置为-100

说完精灵的transfrom的position。下面来讲具体步骤

第一,选择Gameobject-》2dObject-》Sprite,创建一个空的Sprite,然后再SpriteRender的Image选择拾起上拖动其中一个卡片精灵到其上,这样场景就显示了一个精灵,然后在新建一个sprite,再将卡背拖动到其上,然后将卡背移到正面精灵之上,并把卡背精灵设置为正面精灵的子节点,即为将卡背移动到正面精灵之下,

第二开始编写代码,并将其附加到卡片精父灵上,

[serilizefiled] private GameObject cardback;将该脚本拖动到场景对象,在Inspector就会出现cardback值域,然后将卡片后背拖动到这个GameObject上。

public void OnMouseDown()

{

if(cardback.activeSelf)

cardback.SetActive(false);//这个函数使得当前对象不可见

}

为了让图像可以被点击,必须在Inspector添加碰撞器组件,box colider,就可以了

下面必须添加一个控制系统,控制系统同样在场景对象中,但是这个控制系统是不可见的,所以必须使用gameobject的enemy对象,因为enemy对象是一个空对象,不会在场景中具体显示,一般都为其挂载代码组件,并在场景中发挥作用,

scencecontrol的代码如下,

void Start() {
  Vector3 startPos = originalCard.transform.position;

  // create shuffled list of cards
  int[] numbers = {0, 0, 1, 1, 2, 2, 3, 3};
  numbers = ShuffleArray(numbers);//这个函数是用来打乱numbers数组的值,因为我们有八张精灵,每一个精灵都有它的id和id对应的图片,注意八个精灵对应八个索引,但是索引的值只能是[0,3],

  // place cards in a grid
  for (int i = 0; i < gridCols; i++) {
   for (int j = 0; j < gridRows; j++) {
    MemoryCard card;

    // use the original for the first grid space
    if (i == 0 && j == 0) {
     card = originalCard;//我们需要引用一个memorycard,这是一个实体,接着使用这个实体来不断拷贝剩下7个卡片组合
    } else {
     card = Instantiate(originalCard) as MemoryCard;//这个是创建其他实体
    }

    // next card in the list for each grid space
    int index = j * gridCols + i;
    int id = numbers[index];
    card.SetCard(id, images[id]);

    float posX = (offsetX * i) + startPos.x;
    float posY = -(offsetY * j) + startPos.y;
    card.transform.position = new Vector3(posX, posY, startPos.z);
   }
  }
 }

Images是一个数组,可以在Inspector控制数组个数以及其索引值的引用

这里的Original Card是引用的一个脚本类,注意不要直接将asset的脚本拖过来,而是将MemoryCard脚本拖动到卡片对象,再卡片对象拖动到Inspector的Original Card上,这时Unity会自动引用该对象的脚本,这样就可以在代码中来引用另一个对象所挂载的脚本,由此在代码中控制象。

值得一提的是,脚本中的this指的是此脚本,而this.gameObject,指的是此脚本所挂载的对象,当然,在脚本直接可以控制对象行为,关于其幕后我是新手不太了解希望可以自行理解

public void CardRevealed(MemoryCard card) {//这是两个卡片匹配的函数
  if (_firstRevealed == null) {//所以需要在类中保存两个数据,分别是第一个memorycard和第二个memorycard
   _firstRevealed = card;
  } else {
   _secondRevealed = card;
   StartCoroutine(CheckMatch());//这是一个协程函数,专门返回IEnumerator的并且有yield return的函数
  }
 }
 
 private IEnumerator CheckMatch() {

  // increment score if the cards match
  if (_firstRevealed.id == _secondRevealed.id) {//两个卡片匹配成功则将uiscore分数更新
   _score++;
   scoreLabel.text = "Score: " + _score;
  }

  // otherwise turn them back over after .5s pause
  else {
   yield return new WaitForSeconds(.5f);

   _firstRevealed.Unreveal();//将卡片重新反回至背面public void Unreveal() { cardBack.SetActive(true);}
   _secondRevealed.Unreveal();
  }
  
  _firstRevealed = null;
  _secondRevealed = null;
 }

猜你喜欢

转载自blog.csdn.net/anzijian1993/article/details/82821199