2015-03-01 2 views
0

У меня есть скрипт, который перемещает символ в направлениях, зависит от того, с чем он сталкивается. Heres мой код:Символьный код не работает - Unity3D unityscript

var speed : float = 1; 
private var leftBool : boolean; 
private var rightBool : boolean; 
private var upBool : boolean; 
private var downBool : boolean; 

function Update() { 
    if(leftBool == true) { 
     gameObject.GetComponent(Rigidbody2D).velocity.x =   gameObject.GetComponent(Rigidbody2D).velocity.x - speed * Time.deltaTime; 
     rightBool = false; 
     upBool = false; 
     downBool = false; 
    } 
    if(upBool == true) { 
     gameObject.GetComponent(Rigidbody2D).velocity.y = gameObject.GetComponent(Rigidbody2D).velocity.y + speed * Time.deltaTime; 
     rightBool = false; 
     leftBool = false; 
     downBool = false; 
    } 
    if(rightBool == true) { 
     gameObject.GetComponent(Rigidbody2D).velocity.x = gameObject.GetComponent(Rigidbody2D).velocity.x + speed * Time.deltaTime; 
     rightBool = false; 
     leftBool = false; 
     downBool = false; 
    } 
    if(downBool == true) { 
     gameObject.GetComponent(Rigidbody2D).velocity.y = gameObject.GetComponent(Rigidbody2D).velocity.y - speed * Time.deltaTime; 
     rightBool = false; 
     leftBool = false; 
     upBool = false; 
    } 
} 

function Start() { 
    leftBool = true; 
} 


function OnTriggerEnter2D (other : Collider2D) { 
    if(other.GetComponent(Arrows).rotationNumber == 1) { 
     leftBool = true; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 2) { 
     upBool = true; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 3) { 
     rightBool = true; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 4) { 
     downBool = true; 
     Debug.Log("Entered"); 
    } 
} 

Это показывает «Поступило» в debug.log но характер не менять направление, когда он сталкивается. Почему это происходит? Благодарю.

+0

Imtaj оставил отличный ответ, но есть и другие проблемы с вашим кодом. (1) Вместо написания 'something == true' вы всегда должны писать только« что-то », потому что это, по сути, одно и то же. (2) Операция GetComponent может быть дорогостоящей, особенно в неэквивалентной форме, поэтому вы, вероятно, должны кэшировать жесткое тело, если вы делаете это в каждом кадре. (3) Логика, которая у вас здесь, по существу, - это [машина состояния] (http://en.wikipedia.org/wiki/Finite-state_machine), и было бы неплохо выразить ее так, как в коде, что на самом деле поможет вам предотвратить эту ошибку. –

ответ

1

Сначала при столкновении предположим с вращениемNumber == 1, leftBool остается правдой. Другие неверны в соответствии с вашим кодом в декларации и Update(). Теперь, когда вы сталкиваетесь с rotationNumber == 2, upBool возвращает true. Но, как и раньше, leftBool по-прежнему верен в Update(), и он находится на вершине порядка выполнения кода, upBool немедленно вернется к false. Итак, вы никогда не получите if (upBool == true) {} вещи (кстати, вам не нужно использовать == operator for bools, если (upBool) для true и if (! UpBool) для false). Надеюсь, что это раскроет ваше замешательство. Теперь есть много способов добиться того, чего вы хотите. Но вот что-то я изменил свои коды, чтобы вы могли понять, что происходит -

var speed : float = 1; 
private var leftBool : boolean; 
private var rightBool : boolean; 
private var upBool : boolean; 
private var downBool : boolean; 

function Start() { 
    leftBool = true; 
} 

function Update() { 
    if(leftBool) { 
     gameObject.GetComponent(Rigidbody2D).velocity.x = gameObject.GetComponent(Rigidbody2D).velocity.x - speed * Time.deltaTime; 
    } 
    if(upBool) { 
     gameObject.GetComponent(Rigidbody2D).velocity.y = gameObject.GetComponent(Rigidbody2D).velocity.y + speed * Time.deltaTime; 
    } 
    if(rightBool) { 
     gameObject.GetComponent(Rigidbody2D).velocity.x = gameObject.GetComponent(Rigidbody2D).velocity.x + speed * Time.deltaTime; 
    } 
    if(downBool) { 
     gameObject.GetComponent(Rigidbody2D).velocity.y = gameObject.GetComponent(Rigidbody2D).velocity.y - speed * Time.deltaTime; 
    } 
} 

function OnTriggerEnter2D (other : Collider2D) { 
    if(other.GetComponent(Arrows).rotationNumber == 1) { 
     leftBool = true; 
     rightBool = false; 
     upBool = false; 
     downBool = false; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 2) { 
     upBool = true; 
     rightBool = false; 
     leftBool = false; 
     downBool = false; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 3) { 
     rightBool = true; 
     upBool = false; 
     leftBool = false; 
     downBool = false; 
     Debug.Log("Entered"); 
    } 
    if(other.GetComponent(Arrows).rotationNumber == 4) { 
     downBool = true; 
     rightBool = false; 
     leftBool = false; 
     upBool = false; 
     Debug.Log("Entered"); 
    } 
} 

Надеется, что это поможет.

+0

Это вроде работало. Это изменило направление, но немного. Когда он меняет направление слева направо, он будет идти по диагонали. Я хочу, чтобы он не двигался влево и сразу двигался. Если это не работает с жестким, есть ли другой способ передвинуть персонажа? Спасибо –

+0

Если ваша игра не является основанной на физике, вы можете попробовать transform.position или transform.Translate и т. Д. –

+0

Можете ли вы привести пример использования tranform.translate? Я пробовал это раньше, но он никогда не работал. (Моя игра 2d) Спасибо. –

Смежные вопросы