统一VR-如何在玩家到达最后一个航点后停止移动?

问题描述

Unity开发VR内容时, 我想创建一个脚本,该脚本在移至Waypoint路线时在最后一个Waypoint处停止, 但是我在C#编码方面具有非常基本的技能,(我尽了最大的努力,但是失败了),所以我想向您寻求帮助...

这是可以追溯到第一个Waypoint的脚本, 请问你能帮帮我吗?? 非常感谢您的帮助。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveCtrl : MonoBehavIoUr
{

    //이동방식 열거형 변수 선언
    public enum MoveType
    {
        WAY_POINT,LOOK_AT,DAYDREAM

    }

    //이동방식
    public MoveType moveType = MoveType.WAY_POINT;
    //이동속도
    public float speed = 1.0f;
    //회전속도
    public float damping = 3.0f;
    public int zero = 0;

    //모든 웨이포인트를 저장할 배열
    public Transform[] points;

    //트랜스톰 컴포넌트를 저장할 변수
    private Transform tr;
    //다음에 이동해야할 위치 인덱스 변수
    private int nextIdx = 1;

    void Start()
    {

        //트랜스폼 컴포넌트 추출후 변수 저장
        tr = GetComponent<Transform>();

        //포인트 게임오브젝트를 검색해 변수에 저장
        GameObject WayPointGroup = GameObject.Find("WayPointGroup");

        if(WayPointGroup != null)
        {

            //웨이포인트 하위에 모든 게임 오브젝트 Transfotm 컴포넌트 추출
            points = WayPointGroup.GetComponentsInChildren<Transform>();
        }
        
    }

    // Update is called once per frame
    void Update()
    {
        switch (moveType)
        {
            case MoveType.WAY_POINT:
                MoveWayPoint();
                break;

            case MoveType.LOOK_AT:
                break;

            case MoveType.DAYDREAM:
                break;

        }
        
    }

    //웨이포인트 경로로 이동하는 로직

    void MoveWayPoint()
    {
        //현재 위치에서 다음 웨이포인트로 향하는 벡터를 계산
        Vector3 direction = points[nextIdx].position - tr.position;
        //산출된 벡터의 회전 각도를 쿼터니언 타입으로 산출
        Quaternion rot = Quaternion.LookRotation(direction);
        //현재 각도에서 회전해야 할 각도까지 부드럽게 회전처리
        tr.rotation = Quaternion.Slerp(tr.rotation,rot,Time.deltaTime * damping);

        //전진 방향으로 이동처리
        tr.Translate(Vector3.forward * Time.deltaTime * speed);
    }

    void OnTriggerEnter(Collider coll)
    {
        //웨이포인트 - 포인트 게임 오브텍트 충돌여부 판단
        if (coll.CompareTag("WAY_POINT"))
        {
            //맨 마지막 웨이포인트에 도달했을 때 처음 인덱스로 변경
            nextIdx = (++nextIdx >= points.Length) ? 1 : nextIdx;
           
        }

        
      

    }

 
}

解决方法

好吧,我不确定此脚本是否是预定义的脚本。

但是问题背后的策略非常简单。

  • 创建一个始终包含最后一个航路点的变量
  • 编写逻辑以在到达下一个航路点时将其覆盖
  • 在到达最后一个航点后也将其设置为null。
  • 在设置了航路点时(航路点!= null),然后朝 航路点。

之所以这样描述,是因为有很多方法可以完成此路标系统-发挥创意。

也..

要简化代码,我将使用Vector3.moveTowards()和transform.lookAt()方法。有了这些,您就可以轻松实现目标。

Vector3.MoveTowards()以给定的时间*速度将对象从一个点移动到另一点

transform.LookAt(DestTransform)使此当前“ Transforms”正z轴查看变换的方向。如果这不适合您的需求,请尝试在以后修改变换,而不要进行复杂的旋转操作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...