Ошибка в логике скрипта, помогите

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Ошибка в логике скрипта, помогите

Сообщение havismat 01 сен 2011, 16:31

Здравствуйте, уважаемые участники, есть скрипт стрельбы, высчитывающий поправку на цель. Если цель не выбрана или угол на нее слишком большой то стреляем прямо. При выбранной цели все работает, при малых углах стреляет с учетом поправки, при больших стреляет прямо. Но до выбора цели прямо стрелять не хочет. Помогите разобраться пожалуйста.
Синтаксис:
Используется javascript
var projectile : GameObject;

var shootAngleDistance = 10.0;

var bulspeed=100;

static var target : Transform = null;

//static var target_selected=0;

var reloadTime = 0.5;

var angletarfor;

var shoot_forw = true;

private var lastShot = -10.0;



function Start()

{

shoot_forw=true;

}

function Update ()
{
//Высчитываем направление и поправку на цель.
var distance = Vector3.Distance(transform.position , target.position);// высчитываем дистанцию до объекта
var Vp = distance/100;// получаем время необходимое снаряду для преодоления дистанции
S =  Vp * rigidbody.velocity.x;// считаем какое расстояние преодолеет цель
Z = Vp * rigidbody.velocity.z;
//Угол между целью и стреляющим
var targetDir = target.position - transform.position;

var forward = transform.forward;

var angletarfor = Vector3.Angle(targetDir, forward);



//Стреляем в выбраную цель

if ((target)&&(angletarfor<15) ){

if (Input.GetKey(KeyCode.Mouse0)) {

if (Time.time > reloadTime + lastShot)

   {



var instantiatedProjectile = Instantiate (projectile, transform.position, transform.rotation);
direction = Vector3(target.transform.position.x+S, target.transform.position.y,target.transform.position.z+Z)- transform.position;
instantiatedProjectile.rigidbody.velocity = direction.normalized * 100;
lastShot = Time.time;

}}             

}

else{shoot_forw=true;}

//Если цель не выбрана или слишком большой угол до цели то стреляем прямо
if (shoot_forw==true){

if (Input.GetKey(KeyCode.Mouse0)) {

        if (Time.time>(lastShot + reloadTime)) {

                var bull_clone : GameObject;
                bull_clone = Instantiate(projectile, transform.position, transform.rotation);
                Physics.IgnoreCollision(bull_clone.collider, collider);
                bull_clone.rigidbody.AddForce(transform.forward*100, ForceMode.Impulse);
                lastShot = Time.time;



}

}

}

}
 
havismat
UNец
 
Сообщения: 31
Зарегистрирован: 03 авг 2011, 16:13

Re: Ошибка в логике скрипта, помогите

Сообщение Zaicheg 01 сен 2011, 19:17

Плохое описание проблемы.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Ошибка в логике скрипта, помогите

Сообщение havismat 01 сен 2011, 19:45

Это:
if ((target)&&(angletarfor<15) ){

Выполняется если выбрана цель и угол меньше 15. Цель устанавливается с другого скрипта.
Это:
if (shoot_forw==true){

Должно выполняться всегда кроме первого первого случая.
Проблема:
Второе условие выполняется только если target&&angletarfor>15, так не должно быть
havismat
UNец
 
Сообщения: 31
Зарегистрирован: 03 авг 2011, 16:13

Re: Ошибка в логике скрипта, помогите

Сообщение artk 01 сен 2011, 20:46

Мда. Однозначно в коллекцию говнокода. ~x(
1) Не работайте с объектами со значением null, и вообще не используете null !
2) Используйте события. (кода выбирается цель, то вызываем функцию в этом скрипте)
3) Сначала проверяем нажата ли кнопка, потом сравниваем.

Код в топку! Пишите заново. Как это вообще работало?
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Ошибка в логике скрипта, помогите

Сообщение burlak 02 сен 2011, 21:06

Синтаксис:
Используется csharp

else{shoot_forw=true;}

//Если цель не выбрана или слишком большой угол до цели то стреляем прямо
if (shoot_forw==true){

 


Да, код не фонтан. Обрати внимание на этот участок. Ну и на второй. Сама конструкция избыточна, можно обойтись простым else - а там станет понятно, что if (shoot_forw==true){ возникает при !((target)&&(angletarfor<15)) или если упростить (!target || angletarfor>15)

Это как раз противоречит тому, что ты ожидаешь от кода - надо справлять. Думаю что проблема возникает оттого, что shoot_forw сохраняется в поле класса.
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 22