**教材:**选的是《游戏设计、原型与开发(第一版)》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中就能正常显示了。运行游戏也可以正常更新积分。