Unity Move 3D объект в барьере - PullRequest
       57

Unity Move 3D объект в барьере

0 голосов
/ 29 января 2019

Я использую приведенный ниже код, прикрепленный к цилиндрическому объекту с ребристым телом и столкновением.Этот объект находится в середине барьеров столкновения, которые образуют круг.Я пытаюсь заставить этот объект плавно перемещаться вперед на случайное расстояние, а после того, как он перемещается, ждать случайное время и затем двигаться снова.Если он ударяется о барьер с именем тега «стена», то поверните на некоторое расстояние от стен, чтобы он мог продолжать двигаться внутри.и продолжайте делать следующий код.

Однако объект не движется плавно, и он почти не движется.

Как я могу это исправить?Заранее спасибо за любые ссылки или помощь в этой проблеме.

public bool hit, m = false;


public float waitTime;
public float movDistance;
public float fRotation;
public float transitionSpeed = 1f;

private float lerpTime = 3f;
private float currentLerpTime = 0f;
private Vector3 startPos, endPos;

void Start()
{
    //rb = GetComponent<Rigidbody>();
    startPos = this.transform.position;
}

private void Update()
{
    if (m == false) {
        if (hit == true) {
            currentLerpTime += Time.deltaTime;
            if (currentLerpTime >= lerpTime) {
                currentLerpTime = lerpTime;
                hit = false;
            }
            float p = currentLerpTime / lerpTime;
            this.transform.position = Vector3.Lerp(startPos, endPos, p);


        }
        if (hit == false) {
            setRanges();
            m = true;
            StartCoroutine(Example());
        }
    }
}

public void setRanges()
{
    waitTime = Random.Range(4f, 10f);
    movDistance = Random.Range(2f, 10f);
    fRotation = Random.Range(1f, 270f);
    endPos = this.transform.position + Vector3.forward * movDistance;
}


IEnumerator Example()
{
    Debug.Log("Wait" + waitTime + "Seconds");
    startPos = this.transform.position;
    yield return new WaitForSeconds(waitTime);
    hit = true;
    m = false;

}
void OnCollisionEnter(Collision col)
{
    if (col.gameObject.tag == "wall")
    {

        Debug.Log(" hit wall");
        this.transform.rotation = Quaternion.Euler(0, 180, 0);
        hit = false;
    }
}

1 Ответ

0 голосов
/ 29 января 2019

Опустите некоторые тривиальные части из вашего кода

if (m == false) {
    if (hit == true) {
        //.... Move
        hit = false;
    }
    if (hit == false) {
        //.... Set new target position
        m = true;
        //.... Set m to false and hit to true after waitTime
    }
}

И вы найдете проблему в своей логике.

После того, как объект переместится на 1 кадр, вы установите для hit значение falseзатем он останавливается снова, пока не пройдет waitTime.

Я думаю, правильная логика должна заключаться в том, чтобы остановить объект после того, как он достигнет целевой позиции, поэтому:

if(hit){
    //... Move
    if(currentLerpTime == lerpTime)
         hit = false;
}
...