1.预制体-profob

unity中一个很重要的概念(个人认为)在开发当中当我们需要创建多个相同的对象时,或者说他们的属性,所包含的组件的类型是相似的。我们就可以用预制体来实现。比如游戏中的npc,贪吃蛇中随机生成的食物对象。比如下面这段代码

int index=Random.Range(0,foodSprites.Length);
GameObject food = Instantiate(foodprofab);
 food.GetComponent<Image>().sprite = foodSprites[index];
 food.transform.SetParent(foodholder,false);

foodprofab是一个预制体,看名字我可以知道是关于食物的预制体。预制体创建出来后就是一个对象,它的Image属性中的sprite属性(就是图片)通过foodSprites[index]来设置。实现每次生成图标的随机性就是靠上面的Random.Range(0,foodSprites.Length);

2.获取公共的函数或者属性。

比方说我控制蛇移动的逻辑写在Snake_move这个脚本中,但我foodMaker也想调用他我们可以采取以下方法。在Snake_move中声明

private static snake_move  _instance;
     public static snake_move Instance
     {
         get
         {
             return _instance;
         }
     }     void Awake()
     {
         _instance = this;
     }

这样在其他地方就可以用snake_move.Instance.move()来获取了。

3.物理系统和刚体以及触发器

unity当中有自带的物理系统,Rigidbody 2D

unity 编辑器 创建预制体 unity怎么创建不了预制体_游戏引擎

因为是2d所以后面是2D,我们可以看到里面有一个Gravity Scale这是重力,这是系统自带的。会给一个向下的重力,像一些跳跃类的游戏需要这样的重力设置。我们做一个平面游戏像是贪吃蛇,推箱子这种一般把它变成0就好了。

碰撞是一个重中之重的概念,物体的交互,由触发引申而来的判定都离不开碰撞。所以我们要添加刚体组件,在unity中物体的碰撞实则是和刚体碰撞产生的。

刚体组件是什么呢 this

unity 编辑器 创建预制体 unity怎么创建不了预制体_unity_02

刚体的碰撞是有默认的逻辑的,也就说我我们什么都不设置。在场景当中两个刚体相撞时也会和现实中相撞带来的一样。它们的位移将会发生变化。看到那个is Trigger了嘛。这就是触发器,勾选了以后我们可以在设置碰撞触发的逻辑(不是所有都要物理的碰撞来的),比如和npc的交互,我们不就是碰到npc后触发了聊天或者购买物品的逻辑吗。我们下面看一个实例

private void OnTriggerEnter2D(Collider2D collision)
  {
      if (collision.gameObject.CompareTag("food"))
          {
          Debug.Log("触发器触发了1次");
          
          Destroy(collision.gameObject);
          mainui.Instance.updateUI();         Grow();
          food_maker.Instance.Makefood();
          Debug.Log("识别出来撞到啦,这是吃掉后的生成");
      }
      else if(collision.gameObject.CompareTag("body"))
      {
          Die();
          Debug.Log("撞到自己身体了");
      }

首先处理这些触发器的事件都是在rivate void OnTriggerEnter2D(Collider2D collision)这个函数中实现的。一个场景中有很多个触发器还有很多个判断。我们怎么知道什么时候该判断哪个触发事件呢。

collision.gameObject.CompareTag("food")我们可以用这个tag来进行识别,

unity 编辑器 创建预制体 unity怎么创建不了预制体_触发器_03

我们看到每个对象都可以设置它的tag,我们也就用这个来实现。

 Destroy(collision.gameObject);像这样,我们直接可以通过刚体找到他的物体,然后对物体进行操作。