错误CS1503:参数“#2”无法将“object”表达式转换为“UnityEngine.Vector3”类型

时间:2016-05-04 16:37:08

标签: c# unity3d game-engine unity5

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是一个对象类型。我该如何解决这个错误?

2 个答案:

答案 0 :(得分:3)

首先,如果代码中出现 1 编译时错误,则在编写更多代码之前停止并修复它。您不能仅在代码中的其他错误之上创建错误。

您的代码中存在 13 错误,但只有 2 错误会造成错误。

1 。您必须使用new关键字来创建向量。一个例外是当您调用static函数或构造函数(例如Vector3.zeroVector3.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 Vector3floatfloatfloat作为参数而非intint 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,它什么都不做。