Unity C#坦克游戏脚本transform.LookAt使用报错(无法隐式转换Transform到int)求助
兄弟,我看了你的代码和报错信息,问题根源很明确——你混淆了**数组索引(int类型)和Transform组件(Transform类型)**的区别,而且代码里还有些变量没理清导致类型不匹配报错。
先给你拆解下报错原因:error CS0029: Cannot implicitly convert type 'UnityEngine.Transform' to 'int' 意思是你试图把一个Transform类型的值赋值给int类型的变量,这两种类型根本不兼容,就像你想把苹果放进橘子筐里肯定不行。再看你的代码,你定义了private int randomSpot;(用来存数组下标),后来又加了public Transform random;(用来存目标Transform),但你可能在某个地方不小心把random(Transform)赋值给了randomSpot(int),或者一开始错误地写了transform.LookAt(randomSpot)——这肯定不行,因为transform.LookAt()需要的是Transform或者Vector3类型的参数,你传一个int类型的索引过去,Unity肯定懵了。
下面给你两种清晰的修正方案,选一种用就行:
方案一:用int索引管理目标点(更贴合你最初的变量命名)
这种方案保留randomSpot作为数组索引,所有操作都通过索引去取对应的Transform:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TankScopeScript : MonoBehaviour { public float speed; private float waitTime; public float startWaitTime; public Transform[] moveSpots; // 只保留int类型的索引变量,删掉多余的Transform random private int randomSpot; void Start() { // 初始化随机索引,范围是0到moveSpots数组的长度 randomSpot = Random.Range(0, moveSpots.Length); // 一开始就看向第一个目标点 transform.LookAt(moveSpots[randomSpot]); } void Update() { // 移动到当前索引对应的目标点位置 transform.position = Vector3.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime); // 检查是否到达目标点 if (Vector3.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f) { if (waitTime <= 0) { // 生成新的随机索引 randomSpot = Random.Range(0, moveSpots.Length); // 重置等待时间 waitTime = startWaitTime; // 看向新的目标点——这里要传Transform类型的moveSpots[randomSpot],不是int的randomSpot! transform.LookAt(moveSpots[randomSpot]); } else { waitTime -= Time.deltaTime; } } } }
方案二:直接用Transform变量管理目标点(你后来尝试的方式)
这种方案删掉int类型的randomSpot,直接用Transform变量存目标点,避免索引和组件混淆:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TankScopeScript : MonoBehaviour { public float speed; private float waitTime; public float startWaitTime; public Transform[] moveSpots; // 只保留Transform类型的目标变量,删掉多余的int randomSpot private Transform targetSpot; void Start() { // 初始化随机目标点,直接从数组里取Transform targetSpot = moveSpots[Random.Range(0, moveSpots.Length)]; transform.LookAt(targetSpot); } void Update() { // 移动到目标点位置 transform.position = Vector3.MoveTowards(transform.position, targetSpot.position, speed * Time.deltaTime); // 检查是否到达目标点 if (Vector3.Distance(transform.position, targetSpot.position) < 0.2f) { if (waitTime <= 0) { // 重新取随机目标点 targetSpot = moveSpots[Random.Range(0, moveSpots.Length)]; waitTime = startWaitTime; // 直接传targetSpot给LookAt,类型完全匹配 transform.LookAt(targetSpot); } else { waitTime -= Time.deltaTime; } } } }
简单说就是:transform.LookAt()不能直接传数组索引(int),必须传这个索引对应的Transform(比如moveSpots[randomSpot]),或者直接传已经存好的Transform变量。你之前的错误就是把索引和组件本身搞混了,现在把变量类型理清楚就没问题啦!
备注:内容来源于stack exchange,提问作者Magnus Karlsen

