Крюковая механика и синхронизация времени. Дельта времени C # - PullRequest
0 голосов
/ 13 сентября 2018

Я занимаюсь новым проектом, в котором одна из моих основных механик - это крюк, в котором, если объект попал, он либо потянул, либо уничтожил.

Пока я просто пытаюсь заставить эту механику движения работать,Вот мой код:

public class Hook : MonoBehaviour
{ //Remember Couroutine is pretty much update()

public Transform Target;
private float Thrust; // Int for motion
public Rigidbody rb;
public float HookTravelTime = 5f; //Define float for seconds
private bool moving = false;  //Are we currently moving?
public int time; 


// Use this for initialization
void Start()
{
    Thrust = 75f;
    rb = GetComponent<Rigidbody>();
    print("working");
}

void OnCollisionEnter(Collision col)
{
    if (col.gameObject.name == "enemy")
    {
        print("xd");
        Destroy(col.gameObject);
    }
}


void ThrowHook()
{
    if (Input.GetKeyDown(KeyCode.H) && !moving)
    {
        moving = true;
        var moveIncrement = new Vector3(Thrust, 0, 0 * Time.deltaTime); // setting values? difference between var and int?

        while (time <= HookTravelTime)
        {
            time = Time.deltaTime + 1;// I want the int time to increase by 1 every "second". Cannot impicitly convert type float to iny. An explicit conversion exists.???

            // How do I put VAR MOVEINCREMENT into here? I still don't understand what a var is. Why can't I just make a void()
        }

        if (time >= HookTravelTime)
        {
            transform.position = Vector3.MoveTowards(transform.position, Target.position, Thrust); // return to empty object which is in front of player.
        }

    }
}

// Update is called once per frame
void Update()
    {
        ThrowHook();
    }
}

Проблемы заключаются в том, что я аннотировал в коде, тем не менее я их рассмотрю.

В Void ThrowHook () я пытаюсь уменьшитьИнт (время) до +1 за каждую секунду, прошедшую в игре.Я попытался синхронизировать это с Time.Delta Time, но это, однако, не работает.Я понятия не имею, что я здесь делаю.

Прямо над циклом while в ThrowHook () мне сказали создать переменную для хранения в ней информации (Var MoveIncrement).Я пытался вставить в него код постоянного движения, но понятия не имею, как его вызвать.Если возможно, не могли бы вы сказать мне, если эта строка кода неверна

Пожалуйста, пока игнорируйте Bool Moving, поскольку я снова не был последовательным, пытаясь разобраться в этой проблеме.

Надеюсь, я сделалэти проблемы проясняются, извините, если это не так, я тороплюсь заниматься регби.

TLDR: я хочу, чтобы крюк имел постоянное усилие вперед, пока «время» не прошло 5секунд пока нет.Если это так, то крюк возвращается в целевую позицию перед игроком.

Спасибо: P

1 Ответ

0 голосов
/ 13 сентября 2018

Time.deltaTime - это время в секундах, которое потребовалось для завершения последнего кадра, поэтому, если ваша игра работает на скорости 60 кадров в секунду, ее значение будет равно 1/60. Вы, вероятно, будете использовать его всегда, поскольку длительность кадров не постоянна, поэтому постарайтесь понять это очень хорошо https://docs.unity3d.com/ScriptReference/Time-deltaTime.html

Тем не менее, если вы хотите подождать 5 секунд, чтобы что-то сделать с помощью Update ():

float hookTravelTime=5f; // you can use an int if you want full seconds only, you will be able to compare float>int/float<int/ecc
float timeHookTraveling=0f; //in your case the variable named "time"(it isn't a good variable name)

bool isHookActive=false;
    void Update()
    {
//here you should check your input foor hook activation
/*
if(keyPressed...)
{
    what the hook should do on actiovation code here
    isHookActive=true;
    }
*/

//if the hook is not resting execute the code below
      if(isHookActive)
       {
//if the hook traveled for more than hookTravelTime(5 seconds in your case)
         if(timeHookTraveling>=hookTravelTime)
           {
             //your action after the 5 seconds of hook travel
             timeHookTraveling=0f;//reset the travel time for your next hook activation
             isHookActive=false;//reset this bool so your Update will not check this script until you don't activate it in your ThrowHook.
           }
//if the hook didn't travel for at least 5 seconds, increase its travel time by frame's time, thisone will be executed until you reach value 5.0f
         else//or without else, whatever
           {
             timeHookTraveling+=Time.deltaTime;//increase your travel time by last frame's time
           }
       }
    }

у вас есть проблемы, потому что вы преобразуете в int очень маленькую дробь (как я уже говорил до 1/60, если вы на 60fps), поэтому его значение всегда будет 0

Дополнительно: не проверяйте входные данные таким образом, попробуйте добавить некоторую логику в функции: if (input) затем throw (поэтому проверьте вход, а затем решите вызвать throw) Также я бы посоветовал вам не обращаться к врагу по его имени, если вы собираетесь использовать префаб, имя вашего врага будет «враг (клон)», что, если будет больше врагов, ecc? используйте слой, тег или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...