Грешка в Unity: Не може да се прехвърля от тип източник към тип местоназначение

В момента създавам игра в unity, където съм я направил така, че фонът и препятствията в играта постоянно се „възраждат“ и създават цикъл. Всичко работеше добре, докато не добавих втори скрипт към препятствията, за да ги накарам да се движат вертикално. След като добавих скрипта, получих грешката: „Не може да се прехвърля от тип източник към тип местоназначение“.

Това е скриптът, за да направите обектите циклични (Cs):

public class BgLooper : MonoBehaviour {

    int numBGPanels = 10;

    float cloudMax = 2.2f;
    float cloudMin = -0.2f;

    void Start() {
        GameObject[] clouds = GameObject.FindGameObjectsWithTag ("Cloud");

        foreach (GameObject cloud in clouds) {
            Vector3 pos = cloud.transform.position;
            pos.y = Random.Range(cloudMin, cloudMax);
            cloud.transform.position = pos;
        }
    }

    void OnTriggerEnter2D(Collider2D collider) {
        Debug.Log ("Triggered: " + collider.name);

        float widthOfBGobject = ((BoxCollider2D)collider).size.x;

        Vector3 pos = collider.transform.position;

        pos.x += widthOfBGobject * numBGPanels;

        if (collider.tag == "Cloud") {
            pos.y = Random.Range(cloudMin, cloudMax);
        }

        collider.transform.position = pos;
    }
}

И това е скриптът, който кара препятствията да се движат (Js):

var maxX = 6.1;
var minX = -6.1;
var maxY = 4.2;
var minY = -4.2;

var moveSpeed = 0.3;

private var tChange: float = 0; // force new direction in the first Update
private var randomX: float;
private var randomY: float;

function Update () {
    // change to random direction at random intervals
    if (Time.time >= tChange){
        randomX = Random.Range(-2.0,2.0); // with float parameters, a random float
        randomY = Random.Range(-2.0,2.0); //  between -2.0 and 2.0 is returned
        // set a random interval between 0.5 and 1.5
        tChange = Time.time + Random.Range(0.5,1.5);
    }
    transform.Translate(Vector3(randomX,randomY,0) * (moveSpeed / 15) * Time.deltaTime);
    // if object reached any border, revert the appropriate direction
    if (transform.position.x >= maxX || transform.position.x <= minX) {
        randomX = -randomX;
    }
    if (transform.position.y >= maxY || transform.position.y <= minY) {
        randomY = -randomY;
    }
    // make sure the position is inside the borders
    transform.position.x = Mathf.Clamp(transform.position.x, minX, maxX);
    transform.position.y = Mathf.Clamp(transform.position.y, minY, maxY);
}

person Crocus    schedule 02.09.2014    source източник
comment
и на кой ред възниква тази грешка? Моля, подчертайте го в кода или въпроса.   -  person LearnCocos2D    schedule 02.09.2014
comment
Не знам как да маркирам, но грешката възниква на: float widthOfBGobject = ((BoxCollider2D)collider).size.x;   -  person Crocus    schedule 02.09.2014
comment
Опитвал ли си да предадеш BoxCollider2D вместо да го кастираш?   -  person Aggressor    schedule 02.09.2014
comment
Какво искаш да кажеш, агресор?   -  person Crocus    schedule 02.09.2014


Отговори (1)


Трябва да имате достъп до свойството bounds на Collider2D вместо да използвате каста по този начин.


void OnTriggerEnter2D(Collider2D collider) {
    Debug.Log ("Triggered: " + collider.name);

    //change this line
    float widthOfBGobject =  collider.bounds.size.x;

    Vector3 pos = collider.transform.position;

    pos.x += widthOfBGobject * numBGPanels;

    if (collider.tag == "Cloud") {
        pos.y = Random.Range(cloudMin, cloudMax);
    }

    collider.transform.position = pos;
}

Така трябва да изглежда вашето OnTriggerEnter2D с промяната.

person Terrance    schedule 02.09.2014
comment
Мислите ли, че можете да бъдете малко по-конкретни? Аз съм доста нов в това и никога преди не съм работил със c#. - person Crocus; 02.09.2014
comment
Разменете своя ред с реда под коментара, който гласи промяна на този ред. Или копирайте кода изцяло. - person Terrance; 02.09.2014
comment
Когато правя това, това е грешката, която получавам: Въведете UnityEngine.Collider2D' does not contain a definition for bounds' и не може да бъде намерен метод за разширение bounds' of type UnityEngine.Collider2D' (липсва ли ви директива за използване или препратка към асемблиране? - person Crocus; 02.09.2014
comment
каква версия на Unity3d използвате? - person Terrance; 03.09.2014
comment
API казва, че е наличен. Можете ли да покажете най-новата версия на кода? - person Terrance; 04.09.2014