unity3d 控制物体移动_unity3d控制物体移动 - CSDN
精华内容
参与话题
  • 一种常用的控制方法: void Update()     {         if (Input.GetKey(KeyCode.W))         {    &...

    一种常用的控制方法:

     void Update()
        {
            if (Input.GetKey(KeyCode.W))
            {
                transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.S))
            {
                transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.A))
            {
                transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.D))
            {
                transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
            }
        }
    
    展开全文
  • Unity3d 控制物体transform移动的几种方法

    万次阅读 多人点赞 2018-01-26 16:53:40
    Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下: 一、transform.Translate() function Translate (translation : Vector3, relativeTo : Space = Space.Self) : void ...

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

    一、transform.Translate()

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

    物体以relativeTo为参照系,沿着translation运动|translation|的距离。如果relativeTo缺省将

    以Space.Self为默认值。举个例子:

    function Update() {
    
    //导弹相对于战斗机Fighter以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 void MovePosition(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);
        
     //控制物体向Target移动
        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 staticVector3 Lerp(Vector3a,Vector3b, floatt);

    其使用方法与Mathf.Lerp()用法相似,不同点是Vector3.Lerp()是对三维向量进行插值,而Mathf.Lerp()是对数字进行插值。

    using UnityEngine;
    using System.Collections;
    public class YellowMove : MonoBehaviour {
        public float MoveSpeed = 0.1f;
        Vector3 Target = new Vector3(20, 20, 20);
        
     //控制物体向Target移动
        void Update () {
            gameObject.transform.localPosition = Vector3.Lerp(transform.position, Target, MoveSpeed * Time.deltaTime),
        }
    }

    六、使用SmoothDamp()

    1、使用Vector3.SmoothDamp()

    static function SmoothDamp (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方法很类似,不过协程可以在执行切换到下一帧时局部变量任然会保存,但update方法在执行下一帧后局部变量又重新定义了。既然相似,那么我们就可以像在update中每执行一帧改变一次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;  
            }  
        }  
    } 



    展开全文
  • Unity3D控制物体移动

    万次阅读 2016-11-16 20:54:48
    下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续更新。 1.点击鼠标,物体移动到鼠标的位置 实现代码: protected Transform _transform; ...

    在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。

    下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续更新。

    1.rigidbody.MovePosition()控制物体上下左右移动(简单好用)

    // Update is called once per frame
        void Update()
        {
            //控制移动
            float h = Input.GetAxis("Horizontal");
            float v = Input.GetAxis("Vertical");
    
            rigidbody.MovePosition(transform.position + new Vector3(h, 0, v) * speed * Time.deltaTime);
        }

    2.transform.Translate();上下左右移动

    using UnityEngine;
    using System.Collections;
    
    public class Move : MonoBehaviour
    {
        public float speed = 5;
        private Transform transform;
    
        // Use this for initialization
        void Start()
        {
            transform = this.GetComponent<Transform>();
        }
    
        // Update is called once per frame
        void Update()
        {
            float h = Input.GetAxis("Horizontal");
            float v = Input.GetAxis("Vertical");
    
            transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);
        }
    }

    3.点击鼠标,物体移动到鼠标位置(2D,transform.position)

    if (isMouseDown && GameManager._instance.gameState == GameState.Runing)
            {
                if (lastMousePosition != Vector3.zero)
                {
                    //Camera.main.ScreenToWorldPoint(Input.mousePosition)
                    Vector3 offest = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMousePosition;//位移
                    transform.position = transform.position + offest;
                    checkPosition();
                }
                lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            }

    4.rigidbody2D.AddForce();(2D游戏添加力左右移动物体,忍者跑酷)

    void Update()
        {
            if (isSlide == false)
            {
                float h = Input.GetAxis("Horizontal");
                Vector2 velocity = rigidbody2D.velocity;
    
    
                if (h > 0.05f)
                {
                    rigidbody2D.AddForce(Vector2.right * force_move);
                }
                else if (h < -0.05f)
                {
                    rigidbody2D.AddForce(-Vector2.right * force_move);
                }
        }
    
    

    5.点击鼠标,物体移动到鼠标的位置(3D,Vector3.MoveToWards()函数,BeatPlane飞机大战)

    实现代码:

    protected Transform _transform;
    protected Vector3 targetPos;//目标位置
    
        // Use this for initialization
        void Start()
        {
            _transform = this.transform;
            targetPos = this._transform.position;
        }
    
        void MoveTo()
        {
            if (Input.GetMouseButton(0))
            {
                //获得鼠标屏幕位置
                Vector3 mousePos = Input.mousePosition;
                //将屏幕位置转为射线
                Ray ray = Camera.main.ScreenPointToRay(mousePos);
                //用来记录射线碰撞记录
                RaycastHit hitInfo;
                //产生射线
                bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask);
                if (isCast)
                {
                    //如果射中目标,记录射线碰撞点 
                    targetPos = hitInfo.point;
                }
            }
            //使用Vector3提供的MoveTowards函数,获得朝目标移动的位置
            Vector3 pos = Vector3.MoveTowards(this._transform.position, targetPos, speed * Time.deltaTime);
            //更新当前位置
            this._transform.position = pos;
        }

    游戏运行时,点击鼠标,物体就会移动到鼠标所点击的位置。

    6.键盘WSAD控制物体的上下左右移动(这个比较复杂。。)

    void Control()
        {
    
            //获取鼠标移动距离
            float rh = Input.GetAxis("Mouse X");
            float rv = Input.GetAxis("Mouse Y");
    
            // 旋转摄像机
            m_camRot.x -= rv;
            m_camRot.y += rh;
            m_camTransform.eulerAngles = m_camRot;
    
            // 使主角的面向方向与摄像机一致
            Vector3 camrot = m_camTransform.eulerAngles;
            camrot.x = 0; camrot.z = 0;
            m_transform.eulerAngles = camrot;
    
            // 定义3个值控制移动
            float xm = 0, ym = 0, zm = 0;
    
            // 重力运动
            ym -= m_gravity * Time.deltaTime;
    
            //按键盘W向上移动
            if (Input.GetKey(KeyCode.W))
            {
                zm += m_movSpeed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.S))//按键盘S向下移动
            {
                zm -= m_movSpeed * Time.deltaTime;
            }
    
            if (Input.GetKey(KeyCode.A))//按键盘A向左移动
            {
                xm -= m_movSpeed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.D))//按键盘D向右移动
            {
                xm += m_movSpeed * Time.deltaTime;
            }<pre name="code" class="csharp">}
    
    
    
    


    展开全文
  • Unity3D 控制物体移动、旋转、缩放

    千次阅读 2014-07-04 14:02:39
    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192】本文链接地址: Unity3D 控制物体移动、旋转、缩放 Transform基本移动函数: 1.指定方向移动: //移动速度 float ...

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192本文链接地址: Unity3D 控制物体移动、旋转、缩放

    Transform基本移动函数:

    1.指定方向移动:

    //移动速度 
    float TranslateSpeed = 10f;
    
    //Vector3.forward 表示“向前”
    transform.Translate(Vector3.forward *TranslateSpeed);
    

    2.全方向移动:

    复制代码
    //x轴移动速度移动速度 
    float xSpeed = -5f;
    
    //z轴移动速度移动速度 
    float  zSpeed = 10f;
    
    //向x轴移动xSpeed,同时想z轴移动zSpeed,y轴不动 
    transform.Translate(xSpeed,0,zSpeed);
    
    复制代码

    3.重置坐标:

    //x轴坐标 
    float xPostion = -5f;
    //z轴坐标 
    float zPostion = 10f;
    //直接将当前物体移动到x轴为xPostion,y轴为0,z轴为zPostion的三维空间位置。
    transform.position = Vector3(xPostion,0,zPostion);

    输入控制:

    1.输入指定按键:

    复制代码
    //按下键盘“上方向键”
    if(Input.GetKey ("up"))
      print("Up!");
    
    //按下键盘“W键”
    if(Input.GetKey(KeyCode.W);)
      print("W!");
    复制代码

    2.鼠标控制

    //按下鼠标左键(0对应左键 , 1对应右键 , 2对应中键) 
    if(Input.GetMouseButton(0))
      print("Mouse Down!");
    Input.GetAxis("Mouse X");//鼠标横向增量(横向移动) 
    Input.GetAxis("Mouse Y");//鼠标纵向增量(纵向移动)

    3.获取轴:

    //水平轴/垂直轴 (控制器和键盘输入时此值范围在-1到1之间)
    Input.GetAxis("Horizontal");//横向 
    Input.GetAxis ("Vertical");//纵向

    按住鼠标拖动物体旋转和自定义角度旋转物体:

     

    复制代码
    float speed = 100.0f;
    float x;
    float z;
    
    void Update () {
      if(Input.GetMouseButton(0)){//鼠标按着左键移动 
        y = Input.GetAxis("Mouse X") * Time.deltaTime * speed;               
        x = Input.GetAxis("Mouse Y") * Time.deltaTime * speed; 
      }else{
        x = y = 0 ;
      }
      
      //旋转角度(增加)
      transform.Rotate(new Vector3(x,y,0));
      /**---------------其它旋转方式----------------**/
      //transform.Rotate(Vector3.up *Time.deltaTime * speed);//绕Y轴 旋转 
    
      //用于平滑旋转至自定义目标 
      pinghuaxuanzhuan();
    }
    
    
    //平滑旋转至自定义角度 
    
    void OnGUI(){
      if(GUI.Button(Rect(Screen.width - 110,10,100,50),"set Rotation")){
        //自定义角度
    
        targetRotation = Quaternion.Euler(45.0f,45.0f,45.0f);
        // 直接设置旋转角度 
        //transform.rotation = targetRotation;
    
        // 平滑旋转至目标角度 
        iszhuan = true;
      }
    }
    
    bool iszhuan= false;
    Quaternion targetRotation;
    
    void pinghuaxuanzhuan(){
      if(iszhuan){
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 3);
      }
    }
    复制代码

     

     

     

     

     

    键盘控制物体缩放:

    复制代码
    float speed = 5.0f;
    float x;
    float z;
    
    void Update () {
        x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;    //水平           
        z = Input.GetAxis("Vertical") * Time.deltaTime * speed;      //垂直//"Fire1","Fine2","Fine3"映射到Ctrl,Alt,Cmd键和鼠标的三键或腰杆按钮。新的输入轴可以在Input Manager中添加。
        transform.localScale += new Vector3(x, 0, z);  
        
        /**---------------重新设置角度(一步到位)----------------**/
        //transform.localScale = new Vector3(x, 0, z);
    }
    展开全文
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { public float speed = 0.1F; public float rotatespeed = 3.0f; private Transform ...p...
  • function Update () { if(Input.GetKey(KeyCode.W)){ print("w"); transform.Translate(Vector3.forward * Time.deltaTime * -20); } if(Input.GetKey(KeyCode.S)){ print("s")
  • 以前转载了一篇关于在Unity3d中鼠标控制物体的旋转、移动、缩放的代码 然后发现错误比较多,就重新写了一个代码,自我感觉简单实用。。。特意分享出来供大家参考 原文章也贴出来吧 【Unity3d 鼠标滚动拉近模型、鼠标...
  • Unity3D 物体移动方式总结

    万次阅读 多人点赞 2015-05-19 17:00:48
     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转...
  • 按下"W" 控制物体向前; 按下"A"控制物体像左; 按下"S"控制物体向后; 按下"D"控制物体向右; 按下"Q"控制物体向左旋转; 按下”E"控制物体向右旋转;  把脚本拖给一个物体,再给相机一个SmoothFollow脚本。就...
  • Unity键盘控制物体移动

    千次阅读 2018-07-15 09:42:06
    using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { public float speed = 2f; private Rigidbody rigidbody;... // Use this for initi
  • Unity3D键盘控制游戏物体移动

    千次阅读 2018-07-25 14:47:02
    using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeRemove : MonoBehaviour { public float MoveSpeed ; void Start() ... MoveSpeed = 2...
  • Unity3D物体移动脚本小记

    千次阅读 2017-02-01 22:57:56
    Uinty3D物体移动脚本小记最近几天在Unity官网看了官方提供的教程,自己也实验了一下,发现几个不同的项目中,脚本中对物体移动的实现方式并不相同。using UnityEngine;public class PlayerMoveController : ...
  • Unity3D由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。过去Unity支持三种编程语言:...
1 2 3 4 5 ... 20
收藏数 11,972
精华内容 4,788
关键字:

unity3d 控制物体移动