using UnityEngine;
using System.Collections;
public class Tree : MonoBehaviour {
public int Health = 5;
public Transform logs;
public Transform coconut;
public GameObject tree;
public Camera myCamera;
public int speed = 8;
void Start () {
tree = this.gameObject;
GetComponent <Rigidbody>().isKinematic = true;
myCamera = GameObject.FindObjectOfType<Camera>();
}
// Update is called once per frame
void Update () {
if(Health > 0)
{
if(Vector3.Distance(transform.position, myCamera.transform.root.transform.position) < 10f)
{
if(Input.GetKeyDown(KeyCode.R) && WeaponSwitching.check == true)
{
Ray ray = new Ray(myCamera.transform.position,myCamera.transform.forward);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,10f))
{
if(hit.collider.gameObject == gameObject)
{
--Health;
}
}
}
}
}
if(Health <= 0)
{
GetComponent <Rigidbody>().isKinematic = false;
GetComponent <Rigidbody>().AddForce(transform.forward * speed);
DestroyTree();
}
}
void DestroyTree()
{
wait ();
Destroy(tree);
Vector3 position = Vector3(Random.Range(-1.0, 1.0), 0, Random.Range(-1.0, 1.0));
Instantiate(logs, tree.transform.position + Vector3(0,0,0) + position, Quaternion.identity);
Instantiate(logs, tree.transform.position + Vector3(2,2,0) + position, Quaternion.identity);
Instantiate(logs, tree.transform.position + Vector3(5,5,0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + Vector3(0,0,0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + Vector3(2,2,0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + Vector3(5,5,0) + position, Quaternion.identity);
}
IEnumerator wait()
{
yield return new WaitForSeconds (7.0f);
}
}
显示对象无法转换为UnityEngine.Vector3。我怎样才能将对象转换为Vector3类型。错误显示在 INSTANTIATE 功能中。它是说tree.transform.position + Vector3(0,0,0)+ position是一个对象类型。我该如何解决这个错误?
答案 0 :(得分:3)
首先,如果代码中出现 1 编译时错误,则在编写更多代码之前停止并修复它。您不能仅在代码中的其他错误之上创建错误。
您的代码中存在 13 错误,但只有 2 错误会造成错误。
1 。您必须使用new
关键字来创建新向量。一个例外是当您调用static
函数或构造函数(例如Vector3.zero
,Vector3.up
等)时。
所以用Vector3(Random.Range...
new Vector3(Random.Range.....
带有tree.transform.position + Vector3(0, 0, 0)
的 和 tree.transform.position + new Vector3(0, 0, 0)
这也是为了解决其他5个错误。
2 。Vector3
将float
,float
,float
作为参数而非int
,int
int
。
在Vector3(Random.Range(-1.0, 1.0), 0, Random.Range(-1.0, 1.0))
;这一行中,您将int
传递给Vector3
而不是float
。要解决此问题,请在Random.Range
函数中的每个值后面添加 f 。 f 可让编译器知道这是float
而不是int
。如果你不这样做。将调用Random.Range int overload方法而不是float函数重载。
再次将Vector3(Random.Range(-1.0, 1.0), 0, Random.Range(-1.0, 1.0));
更改为new Vector3(Random.Range(-1.0f, 1.0f), 0, Random.Range(-1.0f, 1.0f));
。
public class Tree : MonoBehaviour
{
public int Health = 5;
public Transform logs;
public Transform coconut;
public GameObject tree;
public Camera myCamera;
public int speed = 8;
void Start()
{
tree = this.gameObject;
GetComponent<Rigidbody>().isKinematic = true;
myCamera = GameObject.FindObjectOfType<Camera>();
}
// Update is called once per frame
void Update()
{
if (Health > 0)
{
if (Vector3.Distance(transform.position, myCamera.transform.root.transform.position) < 10f)
{
if (Input.GetKeyDown(KeyCode.R) && WeaponSwitching.check == true)
{
Ray ray = new Ray(myCamera.transform.position, myCamera.transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 10f))
{
if (hit.collider.gameObject == gameObject)
{
--Health;
}
}
}
}
}
if (Health <= 0)
{
GetComponent<Rigidbody>().isKinematic = false;
GetComponent<Rigidbody>().AddForce(transform.forward * speed);
DestroyTree();
}
}
void DestroyTree()
{
wait();
Destroy(tree);
Vector3 position = new Vector3(Random.Range(-1.0f, 1.0f), 0, Random.Range(-1.0f, 1.0f));
Instantiate(logs, tree.transform.position + new Vector3(0, 0, 0) + position, Quaternion.identity);
Instantiate(logs, tree.transform.position + new Vector3(2, 2, 0) + position, Quaternion.identity);
Instantiate(logs, tree.transform.position + new Vector3(5, 5, 0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + new Vector3(0, 0, 0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + new Vector3(2, 2, 0) + position, Quaternion.identity);
Instantiate(coconut, tree.transform.position + new Vector3(5, 5, 0) + position, Quaternion.identity);
}
IEnumerator wait()
{
yield return new WaitForSeconds(7.0f);
}
}
答案 1 :(得分:2)
当你制作椰子时,这是一个简单的错字。
Instantiate(coconut, tree,transform.position + Vector3(0,0,0) + position, Quaternion.identity);
应该是
Instantiate(coconut, tree.transform.position + position, Quaternion.identity);
也不重复GetComponent,缓存引用。但我只是略过了代码。
编辑: 哦,虽然我刚刚读到这个,但是将Vector3(0,0,0)添加到某个东西是非常荒谬的 - 它就像向某个东西添加0,它什么都不做。