繁体   English   中英

将字符从 A 点平滑移动到 B 点统一

[英]Move Character from point A to B smoothly unity

所以,嘿伙计们,我是 unity 的新手。 我有一个小疑问。 我有一个玩家,他是一个放置在彼此之上的 3 stackcube 中的 topcube 的孩子。 一旦用户点击这些立方体,它们就会有一个移动的目标位置。 就像想象在我的世界里有 3 个点。 点 A 的位置坐标为(0,0,1),点 B 为(0,0,2),点 C 为(0,0,3)并且 3 个堆栈立方体位于(0,0,0)上将玩家作为孩子连接到该 3stackcube 中的 topcube。 所有这些点(A,B,C)都有一个名为 targetpoint 的脚本,其中有一个变量 bool isFilled(默认为 false),当其中一个立方体到达其目标位置时,该脚本变为真。 进一步即时检查每当立方体到达其目标位置时使 isFilled 为真,并检查是否有附加的孩子,如果是,则获取孩子的动画师并触发跳跃动画。 跳跃动画是一个就地动画。 所以我想以编程方式将我的角色 +1 朝他所面对的方向移动(如果他面向 z 移动 + 1 在 z 中,如果 x 像这样在 x 中移动 +1)当他所连接的立方体到达其目标位置时,同时也播放跳跃动画。 我做了一个代码。 它似乎没有工作。 很抱歉有很大的段落。 我对编码和提出疑问完全陌生。 任何帮助都会有所帮助,谢谢。

 [SerializeField] public List<targetpoint> waypoints;
    [SerializeField] float moveSpeed = 2f;
    [SerializeField] AudioClip[] surferSounds;
    [SerializeField] GameObject particleToPlay;
    int waypointIndex = 0;
    float t;

    //Cached Reference
    AudioSource audioSource;

    //State
    public bool move = false;

    void Start()
    {
        transform.position = this.transform.position;
        t = 0f;

    }

    void FixedUpdate()
    {
        if (move == true)
        {
            MoveTarget();
        }
    }

    void MoveTarget()
    {

        //Time.timeScale = 0.1f;
        if (waypointIndex <= waypoints.Count - 1)
        {
            var targetPosition = waypoints[waypointIndex].transform.position;
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);

            if (transform.position == targetPosition)
            {

                //Debug.Log(t);
                if (waypoints[waypointIndex].isFilled == false)
                {
                    waypoints[waypointIndex].isFilled = true;
                    AudioClip clip = surferSounds[UnityEngine.Random.Range(0, surferSounds.Length)];
                    var storeToDestroy = Instantiate(particleToPlay, targetPosition, Quaternion.identity);
                    Destroy(storeToDestroy , 5f);
                    audioSource.PlayOneShot(clip);
                    move = false;
                }
                else if(waypoints[waypointIndex].isFilled == true)
                {
                    waypointIndex++;
                    targetPosition = waypoints[waypointIndex].transform.position;
                    transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
                }
                if (this.gameObject.transform.childCount > 0)
                {
                    var storeChild = gameObject.transform.GetChild(1).gameObject;
                    StartCoroutine(GravityAndJump(storeChild,storeChild.transform.position+1*transform.forward,1f));
                }
                else
                {
                    return;
                }
            }
        }
    }
    IEnumerator GravityAndJump(GameObject child, Vector3 newPosition , float time)
    {

        var elapsedTime = 0f;
        var startingPosition = child.transform.position;
        while(elapsedTime < time)
        {
            child.GetComponent<Animator>().SetTrigger("shouldJump?");
            child.transform.position = Vector3.Lerp(startingPosition, newPosition, (elapsedTime / time));
            elapsedTime += Time.deltaTime;
            yield return null;
        }


        //storeChild.GetComponent<Animator>().SetFloat("JumpSpeed", 1f);
        //yield return new WaitForSeconds(1f);
        //gameObject.GetComponentInChildren<Rigidbody>().useGravity = true;
    }
}

所以我想以编程方式将我的角色 +1 移向他所面对的方向(如果他面向 z 移动 + 1 在 z 中,如果 x 像这样在 x 中移动 +1)

您可以使用transform.forward获取 GameObject 的前向方向,您可以使用它来计算 GameObject 前面的目标位置。

在变换前一定距离设置目标位置

targetPosition = transform.position + (transform.forward * distance);

以一定速度向目标位置移动。

transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * followSpeed);

确定到达 targetPosition

在确定变换是否已到达目标目的地时,您应该测量距离而不是比较向量是否相同。

所以替换这个:

if (transform.position == targetPosition){}

像这样:

if(Vector3.Distance(transform.position, targetPosition) < .001f){
  transform.position = targetPosition;
}

除非您将两个向量严格设置为相同的值,否则由于浮点数的工作方式,它们很可能永远不会被视为相等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM