unity3d 物体自动移动_unity3d如何实现子物体跟父物体同时移动时的子物体移动 - CSDN
  • Unity3D 物体移动方式总结

    千次阅读 2016-07-22 14:57:41
     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转...

    1. 简介

        在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

    2. 通过Transform组件移动物体

        Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。


    2.1 Transform.Translate

           该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。

           public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;

    2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards

          Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

    2.3 Vector3.SmoothDamp

          该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

    2.4 Transform.position

           有时重新赋值position能更快实现我们的目标。

    3. 通过Rigidbody组件移动物体

        Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

        注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

    3.1 Rigidbody.velocity

         设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

    3.2 Rigidbody.AddForce

          给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

    3.3 Rigidbody.MovePosition

          刚体受到物理约束的情况下,移动到指定点。

    4. 通过CharacterController组件移动物体

         CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

    4.1 CharacterController.SimpleMove

         用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

    4.2 CharacterController.Move

         模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。


    5
    展开全文
  • 转载于玉雪逐梅的博客... 在Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下: 一、transform.Translate() function Translate (translation : Vector3, relativeTo : Spa


    转载于玉雪逐梅的博客http://blog.csdn.net/renkai0406/article/details/63800248

    在Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下:

    一、transform.Translate()

    function Translate (translation : Vector3relativeTo : Space = Space.Self) : void

    沿着Translation的方向移动|translation|的距离,其结果将应用到relativeTo坐标系中。如果relativeTo为空(即调用方法Translate(translation:Vector3))或者为Space.Self,则移动结果会应用到自身所在的坐标系中。举个例子:

    function Update() {

    //导弹相对于战斗机以ShootSpeed 的速度向前运动,Vector3.forward在此时表示导弹的正前方

    transform.Translate(Vector3.forward * ShootSpeed * Time.deltaTime, Fighter.transform);

    }

    再举个例子:

    在场景中有一个红球和一个蓝球,红球沿着世界坐标系的z轴正方向匀速运动,蓝球沿着红球坐标系的z轴正向以和红球同样的速度匀速运动。

    红球运动脚本RedMove.cs:

    using UnityEngine;
    using System.Collections;

    public class RedMove : MonoBehaviour {

        public int MoveSpeed = 10;

    // Update is called once per frame
    void FixedUpdate () {
            transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime, Space.World);
    }
    }

    蓝球运动脚本BlueMove.cs:

    using UnityEngine;
    using System.Collections;

    public class BlueMove : MonoBehaviour {

        public GameObject RedBall;
        public int MoveSpeed = 10;

    // Update is called once per frame
    void FixedUpdate () {
            transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime, RedBall.transform);
    }
    }

    1、我们先让红球的坐标系各轴方向与世界坐标系的各轴方向相同,则红球与蓝球在运动过程中是相对静止的:


    2、接着我们将红球绕y轴顺时针旋转90度(即使红球的Transform.Rotation.y = 90),此时红球坐标系的z轴正向和世界坐标系的x轴正向重合,此时运动效果如下:


    二、指定速度velocity

    这种方法只能适用于刚体,因为velocity是刚体特有的属性。代码如下:

    void Start () {
            gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * MoveSpeed;
    }

    三、使用rigbody.MovePosition()

    public voidMovePosition(Vector3position);

    让物体移动到新的位置position。

    示例:

    void FixedUpdate() {

            //让物体向前运动Time.deltaTime距离
            rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
        }

    四、Vector3.MoveTowards()

    static function MoveTowards(current: Vector3, target: Vector3, maxDistanceDelta: float): Vector3;

    该方法一般以以下形式使用:

    using UnityEngine;
    using System.Collections;
    public class YellowMove : MonoBehaviour {
        public int MoveSpeed = 10;
        Vector3 target;

     void Start () {
            target = new Vector3(20, transform.position.y, 20);
     }
     
     void Update () {
            transform.position = Vector3.MoveTowards(transform.position, target, MoveSpeed * Time.deltaTime);
     }

    五、使用lerp()

    1、使用Mathf.Lerp()函数

    static functionLerp (from : float, to : float,t : float) : float

    调用该函数会返回from与to之间的插值(from + to) * t,t在0~1之间。

    使用方法如下:

    using UnityEngine;
    using System.Collections;
    public class YellowMove : MonoBehaviour {
        public float MoveSpeed = 0.1f;
        Vector3 Target = new Vector3(20, 20, 20);
        
         void Update () {
            gameObject.transform.localPosition = new Vector3(
                Mathf.Lerp(transform.position.x, Target.x, MoveSpeed * Time.deltaTime),
                Mathf.Lerp(transform.position.y, Target.y, MoveSpeed * Time.deltaTime),
                Mathf.Lerp(transform.position.z, Target.z, MoveSpeed * Time.deltaTime));
        }
    }

    2、使用Vector3.Lerp()

    public staticVector3Lerp(Vector3a,Vector3b, floatt);

    其使用方法与Mathf.Lerp()用法相似。  

    六、使用SmoothDamp()

    1、使用Vector3.SmoothDamp()

    static functionSmoothDamp (current : Vector3,target : Vector3, ref currentVelocity : Vector3,smoothTime : float,maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : Vector3

    在大约以smoothTime的时间从current移动到target,其移动的当前速度为currentVelocity,此方法一般用于摄像机的平滑移动。需要注意的是currentVelocity值一般在开始时指定为零向量,每次调用该方法时该方法会自动给currentVelocity赋值。方便起见以Mathf.SmoothDamp()进行如下测试:

    using UnityEngine;
    using System.Collections;

    public class YellowMove : MonoBehaviour {

        public float MoveSpeed = 0f;
        float CurrentNum = 0f;
        float TargetNum = 20f;
        float MoveTime = 10f;

     
         void Update () {

            Debug.Log("当前数值:" + CurrentNum + ";当前速度:" + MoveSpeed);
            CurrentNum = Mathf.SmoothDamp(CurrentNum, TargetNum, ref MoveSpeed, MoveTime * Time.deltaTime);
        }

    }

    控制台输出:


    Vector3.SmoothDamp()用法如下:

    using UnityEngine;
    using System.Collections;

    public class example : MonoBehaviour{
        public Transform target;
        public float smoothTime = 0.3F;
        private Vector3 velocity = Vector3.zero;


        void Update() {

           //定义一个目标位置在目标变换的上方并且在后面
           Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));

           //平滑地移动摄像机朝向目标位置
           transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
        }
    }

    2、使用Mathf.SmoothDamp()

    使用方法与Vector3.SmoothDamp()差不多,只是Mathf.SmoothDamp()是对float类型操作,而Vector3.SmoothDamp是对三维向量操作。

    七、使用CharacterController组件控制角色移动

    Unity使用CharacterController(角色控制器)来控制角色骨骼运动,包括移动、跳跃以及各种动作。CharacterController比较复杂,具体详情请参照博客Unity CharacterController(角色控制器)

    八、使用iTween

    iTween是Unity3d的一个动画插件,可以让你更加轻松的实现各种动作,iTween实现移动的方式也比较多样,具体的可以参考博客Unity iTween动画库插件

    九、使用协程

    关于Unity的协程介绍请看博客:Unity协程介绍及使用

    协程和Update方法很类似,不过协程可以在执行切换到下一帧前时局部变量任然会保存,但pdate方法在执行下一帧后局部变量和又重新定义了。既然相似,那么我们就可以像在pdate中没执行一帧改变一次position来那样,在协程中改变position然后再执行下一帧来改变物体的位置让物体运动起来。方法如下:

    usingUnityEngine;  
    Using System.Collections;  
       
    Public class RedMove: MonoBehaviour  
    {  
        public Vector3 TargetPosition;  
        public float MoveSpeed;  
       
        Void Start()  
        {  
            StartCoroutine(Move(TargetPosition));  
        }  
       
        IEnumerator Move(Vector3 target)  
        {  
            while(transform.position != target)  
            {  
                transform.position = Vector3.MoveTowards(transform.position, target, MoveSpeed * Time.deltaTime);  
                Yield return 0;  
            }  
        }  

    展开全文
  • Unity中实现游戏物体来回移动的方法

    千次阅读 2019-03-02 13:25:25
    个人简介   本人是unity小白一枚,刚接触unity没有太长时间,我比较喜欢去浏览一些有关...  这种方法的思想很简单,就是当游戏物体达到了边界值向反方向移动,我们只需要判断这个游戏物体的坐标是否达到边界...

    个人简介

      本人是unity小白一枚,刚接触unity没有太长时间,我比较喜欢去浏览一些有关unity的帖子,文档什么的,并把其中核心的东西总结整理下来。现在我把它们放在博客上,供大家参考,如果有写的不好的地方,欢迎大家指正。好了,话不多说,下面切入正题

    实现来回移动的方法

    1.变方向

      这种方法的思想很简单,就是当游戏物体达到了边界值向反方向移动,我们只需要判断这个游戏物体的坐标是否达到边界即可,上代码

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        
        public class UpDown3 : MonoBehaviour
        {
            /// <summary>移动速度</summary>
            public float speed = 3;
            void Update()
            {
                transform.position += Vector3.up * speed * Time.deltaTime;
                //超出范围
                if (transform.position.y>=10 || transform.position.y <= -10)
                {
                    //反向
                    speed = -speed;
                }
            }
        }
    

    2.使用三角函数

      三角函数相信大家都不陌生,正弦和余弦函数是值在-1~1的周期函数,我们可以先给出一个弧度,然后让这个弧度不断增加,然后让游戏物体的指定的坐标等于这个弧度的正弦或者是余弦值即可。我这里用的是余弦函数,实现的是上下移动。这个方法参考自:
    https://blog.csdn.net/sinat_20559947/article/details/47999659

    
    /*
     * 通过三角函数实现浮动
     */
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UpDown : MonoBehaviour
    {
        // Start is called before the first frame update
        /// <summary>弧度<summary>
        public float radian;
        /// <summary>上下变化幅度<summary>
        public float moveAmplitude = 5f;
        /// <summary>初始位置<summary>
        private Vector3 oldPos;
        void Start()
        {
            oldPos = transform.position;
        }
    
        // Update is called once per frame
        void Update()
        {
            radian += Time.deltaTime;
            float newY = Mathf.Cos(radian) * moveAmplitude;
            transform.position = oldPos + Vector3.up * newY;
        }
    
       
    }
    
    

    3.使用插值

      通过插值我们也可以实现,具体做法是跟方法1类似,我们给出两边的临界点,游戏物体到了临界点之后向另一个临界点插值移动即可:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UpDown2 : MonoBehaviour
    {
        /// <summary>插值比例</summary>
        public float t;
        /// <summary>是否向上移动</summary>
        public bool isUP = true;
        /// <summary>临界点1</summary>
        public Vector3 startPos = new Vector3(0, -3, 0);
        /// <summary>临界点2</summary>
        public Vector3 endPos = new Vector3(0, 3, 0);
        /// <summary>移动速度</summary>
        private float speed = 3;
    
        void Start()
        {
        }
    
        void Update()
        {
            t += Time.deltaTime;
            if (isUP)
            {
                transform.position = Vector3.Lerp(transform.position, endPos, t * speed);
                if (transform.position.y >= endPos.y)
                {
                    isUP = false;
                    t = 0;
                }
            }
            else
            {
                transform.position = Vector3.Lerp(transform.position, startPos, t * speed);
                if (transform.position.y <= startPos.y)
                {
                    isUP = true;
                    t = 0;
                }
            }
        }
    }
    
    

    4.使用PingPong方法

      pingpong方法就是让物体像乒乓球一样来回运动,我这里就不做详细解释了,大家可以到官方文档上去详细查看,下边给出连接
    https://docs.unity3d.com/ScriptReference/Mathf.PingPong.html

    结尾:

      到了目前为止,我就总结出了以上四种方法,如果大家还有更好的方法,欢迎来补充!!!

    展开全文
  • [Unity3d ]物体自动移动到指定点

    千次阅读 2016-06-09 01:30:45
    [Unity3d ]AI脚本-物体在指定点间往返移动

    扯淡:平时玩一些3d沙盒游戏,如果你“尾随”街上的路人或者车子,可以发现,他们都是按照指定路径点循环移动的,如果你也有试过,那说明你也挺无聊的233


    思路

    让物体朝向目标点,然后向前移动,到达一个目标点后,朝向下一个目标点……


    代码

    using UnityEngine;
    using System.Collections;
    
    public class Move : MonoBehaviour {
        public float speed = 2; //[1] 物体移动速度
        public Transform []target;  // [2] 目标
        public float delta = 0.2f; // 误差值
        private static int i = 0;
    
        void Update () {
            moveTo ();  
        }
    
        void moveTo(){
            // [3] 重新初始化目标点
            target [i].position = new Vector3 (target [i].position.x, transform.position.y, target [i].position.z);
    
            // [4] 让物体朝向目标点 
            transform.LookAt (target [i]);
    
            // [5] 物体向前移动
            transform.Translate (Vector3.forward * Time.deltaTime * speed);
    
            // [6] 判断物体是否到达目标点
            if (transform.position.x > target[i].position.x - delta 
                && transform.position.x < target[i].position.x + delta
                && transform.position.z > target[i].position.z - delta
                && transform.position.z < target[i].position.z + delta)
                i = (i+1)%target.Length;
        }
    }
    

    补充注释

    >> [2] public Transform []target;

    在场景中创建 Empty GameObject ,
    将其放到你想要的位置上,
    那么这个位置即为目标点,
    然后把这个 Empty GameObjecttransform 作为脚本的输入,
    通过 target[i].transform.position 来得到我们需要的目标点。

    //用这种方法可以比较方便的设置你需要的路径点 ,
    //因为你只需要创建多个 Empty GameObject,
    //放到指定位置,然后拖到脚本的输入即可。

    >> [3] target [i].position = new Vector3

    (target [i].position.x, transform.position.y, target [i].position.z);

    其实这里的初始化,
    主要是把目标的y坐标和物体的y坐标对齐,
    这样可以省去放置目标点时的麻烦,
    当然如果你的物体需要爬上爬下就省略此步骤

    >>[6] if (transform.position.x > target[i].position.x - 0.2f

    && transform.position.x < target[i].position.x + 0.2f

    && transform.position.z > target[i].position.z - 0.2f

    transform.position.z < target[i].position.x + 0.2f)

    i = (i+1)%target.Length;

    可能有些人会说,
    你zhi4 zhang4 吗,
    为什么不直接if(transform.position == target[i].position) 呢,
    兄台你有所不知,
    如果你实际运行的话,
    你会发现物体“到达”目标点后,
    就一直在原地抽搐,
    不会走向下一个目标点了,
    因为我们的点都是浮点数,
    浮点数0.3并不等于数学上的0.3,
    浮点数0.3可能为0.299999999也可能为0.30000000001(举个栗子,大概就这意思)
    所以我们的物体看似到达了目标点,
    其实一直在无限接近,
    所以这时候就需要设置一个误差值,
    让物体到达目标点的周围一定范围后,
    来确定到达了目标点。
    至于i = (i+1)%target.Length;
    可以让我们的物体循环运动。


    具体操作

    这里写图片描述

    //为方便观察,我把目标均弄成白色球体,移动物体设置成红色球体
    1.创建6个白色球体和一个红色球体
    2.设置好他们各自的位置
    3.给红色球体脚本(Move.cs)
    4.设置Target 的 Size大小(你想让物体移动到多少个点就设为多少)
    5.然后把6个白色球体分别拖到Element0~Element5
    6.点击运行,即可观察到小球沿指定路径循环运动。


    相关资料

    游戏蛮牛Unity用户手册

    展开全文
  • Unity3D 物体移动方法总结 ** 1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,...
  • Unity3DUnity3D 物体跟随鼠标移动

    千次阅读 2020-03-11 15:29:39
    在Update中运行Vector3 mousePos=Camera.main.ScreenToWorldPoint(Input.mousePosition)+new Vector3(0,0,10);这行代码的意思是屏幕坐标转化为三维坐标,然后z轴加10就是正确的位置了transform....当前坐标跟随鼠标移动
  •  在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2.通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position)...
  • unity 游戏物体自动循环移动脚本

    千次阅读 2016-05-06 16:56:15
    using UnityEngine; using System.Collections; public class SwanMove : MonoBehaviour { private float ...//swan的移动速度. // Use this for initialization void Start () { //设置天鹅的初始位置. transfo
  • Unity3d 简单的按照路径移动物体

    万次阅读 2014-03-05 22:08:10
    在TORQUE引擎中,我们只要设置几个点,然后物体会按照这几个点顺序移动Unity3d也可以的,现在介绍一个很简单的按照路径移动的方法。 目标是让蓝色方块沿着紫色方块组成的路径移动,设计思想就是让蓝色方块...
  • Unity3D移动物体位置的几种方法

    万次阅读 多人点赞 2016-06-29 14:29:38
     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position), ...
  • Unity 3D中很多时候我们会想要移动一个物体到别的位置,如让想人物跑动起来,或者想要移动相机来跟随人物。有很多种方法可以改变物体的坐标,实现移动的目的,移动的本质是在每一帧中修改物体的position。在这里把...
  • [Unity 3D] 常用物体移动的方法

    千次阅读 2018-08-03 11:58:57
    物体从当前位置向指定方向移动,并且可以选择参照的坐标系。 float speed = 5f; // 速度 void Update() { transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World); } 2.tra...
1 2 3 4 5 ... 20
收藏数 4,968
精华内容 1,987
关键字:

unity3d 物体自动移动