unity按路径移动,向导

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

public class FollowPathMove : MonoBehaviour
{
    public Transform[] wayPointArray;
    [SerializeField] private Transform PathA;//路径点的父物体
    [SerializeField]private Transform playerObj;//移动的物体
    private int index;
    private Vector3 _currentDirection;//当前角色的前进方向
    void Start()
    {
        if(playerObj==null)
        {
            Debug.LogError("请将移动的角 色放入参数栏");
        }
        //print(PathA.childCount);//获取子物体的数量
        //开辟空间
        wayPointArray = new Transform[PathA.childCount];
        for(int i=0;i<wayPointArray.Length;i++)
        {
            wayPointArray[i]=PathA.GetChild(i);//将路径点加入数组中
            //print($"wayPointArrayz{i} ={ wayPointArray[i].position }");//输出世界坐标
        }
       
    }
    


    //在Updata里面最好不要放太多东西
    void Update()
    {
        //Distance需要开方
       /* if (Vector3.Distance(wayPointArray[index].position,playerObj.position)<0.3f)
        {
            //检查是否到达最后一个目标点
            if (index < wayPointArray.Length - 1)
            { index++; }
            else
            {
                index = 0;
            }*/
           /* if (index++ == wayPointArray.Length - 1)
            {
                index = 0;
            }*/
       // }
        //返回距离的平方值
       // Vector3 _currentDirection = wayPointArray[index].position - playerObj.position;

        //开启协程,每隔1秒钟算10次0.11.5
        StartCoroutine(RotationDirectionByTime(1.5f));

        //角色一直前进
        playerObj.Translate(Vector3.forward * 8f * Time.deltaTime);
    }

    IEnumerator RotationDirectionByTime(float time)
    {
        while (true)
        {

            //写算法来改变角色前进的方向
            //计算角色与目标点之间的向量
           Vector3 _currentDirection = wayPointArray[index].position - playerObj.position;
            if (_currentDirection.sqrMagnitude <= 0.2f)
            {
                index += 1;
                if (index == wayPointArray.Length )
                {
                    index = 0;
                }
            }
            Debug.Log("输出数组坐标:" + index);
            //计算旋转角度(没有旋转的过程)
            // playerObj.LookAt(direction);
            //差值运算能够看到他的过程,球形差值
            //出现抖动是因为这里每一帧出来的值都不一样,所以需要用协程控制一下
            playerObj.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(_currentDirection), 0.9f);
            //计算旋转角度(没有旋转的过程)
            
            //print(_currentDirection.sqrMagnitude);
            yield return new WaitForSeconds(time);
        }
    }
}

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

public class FollowPathMove : MonoBehaviour
{
    public Transform[] wayPointArray;
    [SerializeField] private Transform PathA;//路径点的父物体
    [SerializeField] private Transform playerObj;//移动的物体
    private int index;
    private Vector3 _currentDirection;//当前角色的前进方向
    void Start()
    {
        if (playerObj == null)
        {
            Debug.LogError("请将移动的角 色放入参数栏");
        }
        //print(PathA.childCount);//获取子物体的数量
        //开辟空间
        wayPointArray = new Transform[PathA.childCount];
        for (int i = 0; i < wayPointArray.Length; i++)
        {
            wayPointArray[i] = PathA.GetChild(i);//将路径点加入数组中
            //print($"wayPointArrayz{i} ={ wayPointArray[i].position }");//输出世界坐标
        }

    }



    //在Updata里面最好不要放太多东西
    void Update()
    {
        //Distance需要开方
        /* if (Vector3.Distance(wayPointArray[index].position,playerObj.position)<0.3f)
         {
             //检查是否到达最后一个目标点
             if (index < wayPointArray.Length - 1)
             { index++; }
             else
             {
                 index = 0;
             }*/
        /* if (index++ == wayPointArray.Length - 1)
         {
             index = 0;
         }*/
        // }
        //返回距离的平方值
        // Vector3 _currentDirection = wayPointArray[index].position - playerObj.position;

        //开启协程,每隔1秒钟算10次0.11.5
        StartCoroutine(RotationDirectionByTime(1.5f));

        //角色一直前进
        playerObj.Translate(Vector3.forward * 8f * Time.deltaTime);
    }

    IEnumerator RotationDirectionByTime(float time)
    {
        while (true)
        {

            //写算法来改变角色前进的方向
            //计算角色与目标点之间的向量
            Vector3 _currentDirection = wayPointArray[index].position - playerObj.position;
            if (_currentDirection.sqrMagnitude <= 0.2f)
            {
                index += 1;
                if (index == wayPointArray.Length)
                {
                    index = 0;
                }
            }
            //Debug.Log("输出数组坐标:" + index);
            //计算旋转角度(没有旋转的过程)
            // playerObj.LookAt(direction);
            //差值运算能够看到他的过程,球形差值
            //出现抖动是因为这里每一帧出来的值都不一样,所以需要用协程控制一下
            playerObj.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(_currentDirection), 0.9f);
            //计算旋转角度(没有旋转的过程)

            //print(_currentDirection.sqrMagnitude);
            yield return new WaitForSeconds(time);
        }
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity移动物体的代码可以使用 Rigidbody2D 组件和 Transform 组件。可以通过在代码中设置 Rigidbody2D 组件的 velocity 属性来控制物体的移动。 下面是一个简单的示例: ``` using UnityEngine; public class MoveObject : MonoBehaviour { public float speed = 10.0f; private Rigidbody2D rigidbody2D; void Start() { rigidbody2D = GetComponent<Rigidbody2D>(); } void Update() { Vector2 movement = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); rigidbody2D.velocity = movement * speed; } } ``` 这段代码利用 Input.GetAxis("Horizontal") 和 Input.GetAxis("Vertical") 来获取控制物体的水平和竖直输入,然后通过将这些输入与速度相乘来控制物体的移动。 请注意,需要将该脚本添加到物体上,并且物体需要具有 Rigidbody2D 组件。 ### 回答2: Unity是一款跨平台的游戏开发引擎,可以使用C#进行编程。在Unity中,物理路径移动代码通常会涉及到刚体和碰撞体的操作。 首先,在使用物理路径移动之前,需要将要移动的对象添加刚体组件,使之具有物理属性。可以通过代码来添加刚体组件,例如: Rigidbody rb = gameObject.AddComponent<Rigidbody>(); 接下来,需要创建一个动作(Action)来实现物体的路径移动。可以使用Unity的协程(Coroutine)来实现路径移动。在协程中,可以通过设置物体的速度和力的施加来实现路径移动。 以下是一个简单的示例代码: IEnumerator MoveAlongPath(Vector3[] path, float speed) { for (int i = 0; i < path.Length; i++) { Vector3 direction = (path[i] - transform.position).normalized; float distance = Vector3.Distance(transform.position, path[i]); while (distance > 0.1f) { rb.velocity = direction * speed; yield return null; distance = Vector3.Distance(transform.position, path[i]); } rb.velocity = Vector3.zero; } } 在这段代码中,通过传入一个路径数组和移动速度,通过循环遍历路径中的每一个点,并计算出当前位置和目标点的方向和距离。然后,通过施加速度来实现物体的路径移动。在循环中,使用yield return null语句来让协程在每一帧中暂停执行,以保证平滑移动。 最后,在需要进行路径移动的地方调用MoveAlongPath方法即可实现物体的路径移动。 需要注意的是,路径移动可能会涉及到碰撞检测和碰撞体的操作,需要根据实际情况进行判断和处理。如有需要,可以在代码中添加相关逻辑来处理碰撞。 以上就是一个简单的Unity物理路径移动代码的解释,希望对你有帮助。 ### 回答3: Unity 是一款强大的游戏开发引擎,提供了许多功能强大的工具和 API,可以简化游戏开发的过程。在 Unity 中,物理路径移动是一个常见的需求,可以通过编写代码来实现。 首先,我们需要在场景中创建一个物体,例如一个立方体,它将作为我们要移动的对象。然后,我们可以编写脚本来实现物理路径移动。 在脚本中,我们可以使用 Rigidbody 组件来实现物体的物理运动。首先,我们需要在脚本的开头声明一个公共的 Rigidbody 变量,以便在 Unity 编辑器中将我们的物体与脚本关联起来。 然后,我们可以定义一个公共的 Transform 数组变量来存储我们想要沿着路径移动的一系列点。在 Unity 编辑器中,我们可以通过拖拽和放置来添加这些点。 接下来,在 Update 函数中,我们可以使用 Rigidbody 的 MovePosition 方法来实现物体的移动。我们可以使用一个索引变量来跟踪当前移动到的点,然后在每一帧更新时移动物体到下一个点。当我们到达路径的末尾时,我们可以选择是否重置索引变量,使物体重新从路径的起始点开始移动,或者停止移动。 最后,为了使物体顺利地移动沿路径,我们可以使用 Rigidbody 的 AddForce 方法来施加一个合适的力,以模拟物理运动。我们可以根据物体的质量和所需的速度来调整施加的力大小,以达到预期的效果。 综上所述,通过编写适当的代码,我们可以在 Unity 中实现物理路径移动。这样,我们可以为游戏中的物体添加更加真实的移动效果,使游戏更加生动和有趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值