和Unity的死磕日记 | 第一个游戏原型:接苹果

**教材:**选的是《游戏设计、原型与开发(第一版)》Jeremy Gibson,有条件就用新版,我是因为实体书只能借到这一本。我就是吃了版本的亏……
**Unity 版本:**2022.3.34f1c1

一开始跟着书做得很顺利,直到计分器显示这个步骤。

教程里这个游戏有三大组件:苹果树、苹果、篮筐。只有苹果树是一开始就存在的:苹果是开始后2s才开始产生并下落,篮筐为了方便计数和消除(当做生命值)也是在绑定在主摄像机的ApplePicker代码里面才Instantiate的。
在这里插入图片描述

ApplePicker的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ApplePicker : MonoBehaviour
{
    public GameObject basketPrefab;
    public int numBaskets = 3;
    public float basketBottomY = -14f;
    public float basketSpacingY = 2.34f;
    public List<GameObject> basketList;
    void Start()
    {
        //数组形式生成3个篮筐
        basketList = new List<GameObject>();
        for(int i = 0; i < numBaskets; i++)
        {
            GameObject tBasketGO = Instantiate(basketPrefab) as GameObject;
            Vector3 pos = Vector3.zero;
            pos.y = basketBottomY + (basketSpacingY * i);
            tBasketGO.transform.position = pos;
            basketList.Add(tBasketGO);
      //}
    }

    public void AppleDestroyed()
    {
        //消除所有苹果
        GameObject[] tAppleArray = GameObject.FindGameObjectsWithTag("Apple");
        foreach(GameObject tGO in tAppleArray)
        {
            Destroy(tGO);
        }
        //篮筐当生命值,消除一个篮筐
        int basketIndex = basketList.Count - 1;//最后一个篮筐的序号
        GameObject tBasketGO = basketList[basketIndex];
        basketList.RemoveAt(basketIndex);//列表中删除
        Destroy(tBasketGO);//删除本体
        if(basketList.Count == 0)
        {
            SceneManager.LoadScene("_Scene_1");//重新加载
        }
    }
}

而接住苹果的碰撞则是在Basket代码中完成的。Basket代码绑定在Basket实例上。因此积分也肯定是在basket>OnCollisionEnter中进行。

Basket代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Basket : MonoBehaviour
{
    public int score;  
    void Update()
    {
    ...
     }
    //接到苹果
    void OnCollisionEnter(Collision coll)
    {
        GameObject collidedWith = coll.gameObject;
        if(collidedWith.tag == "Apple")
        {
            Destroy(collidedWith);
        }
    }
}

教材中使用的是Rendering>GUIText组件,然后再在Basket代码的start函数中:

   GameObject scoreGO = GameObject.Find("ScoreCounter");//按名称查找对象
   scoreGT = scoreGO.GetComponent<GUIText>();//获取组件
   scoreGT.text = "0";
   ...
   scoreGT.text=score.ToString();//显示

然而我在第一步:添加组件就遇到了困难:我用的2022.3.34f1c1没这个组件,只有UI>TextMeshPro。一开始的解决方案是:改变组件但代码不变。但是会在GetComponet部分出错。于是我就上b站找了一个官方的教程视频:添加链接描述

一开始进行的比较顺利,直到最后一步:在Unity Inspector中指定Text组件。
我选中Project中的Basket预设,绑定Basket代码后将Hierarchy中的"ScoreText"组件直接往里拖动,但是一直显示Type Dismatch。列表描述ScoreText是GameObject而非TextMeshPro。
就是这里,这是成功的状况
经过一系列碰壁之后,最后的解决办法是:不使用Basket预设生成,Basket现成。这时再将ScoreText拖进Hierarchy的Basket中就能正常显示了。运行游戏也可以正常更新积分。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值