unity3d位置移动_unity3d 移动到指定位置 - CSDN
  • 方法1:使用Vector3.MoveTowards void Update () { float step = speed * Time.deltaTime; gameObject.transform.localPosition = Vector3.MoveTowards(gameObject.transform.localPosition, new Vector3(10, -3, 50...

    方法1:使用Vector3.MoveTowards

    void Update ()
    {
    float step = speed * Time.deltaTime;
    gameObject.transform.localPosition = Vector3.MoveTowards(gameObject.transform.localPosition, new Vector3(10, -3, 50), step);
    }

    方法2:使用插值
    void Update ()
    {
    float step = speed * Time.deltaTime;
    gameObject.transform.localPosition =new Vector3(Mathf.Lerp(gameObject.transform.localPosition.x, 10, step),Mathf.Lerp(gameObject.transform.localPosition.y, -3, step),Mathf.Lerp(gameObject.transform.localPosition.z, 50, step));//插值算法也可以
    }
    方法3:使用iTween

    iTween.MoveTo(m_UIbgCamera, iTween.Hash(“x”, -20,
    “y”, -3,
    “z”, 50,
    “time”, 1.0,
    “islocal”, true
    ));

    方法4:使用协程

    StartCoroutine(MoveToPosition());

    IEnumerator MoveToPosition()
    {
    GameObject m_UIbgCamera = GameObject.Find(“UI/FengMian/UIbgCamera”);
    while (m_UIbgCamera.transform.localPosition != new Vector3(-5, -3, 50))
    {
    m_UIbgCamera.transform.localPosition = Vector3.MoveTowards(m_UIbgCamera.transform.localPosition, new Vector3(-20, -3, 50), 10 * Time.deltaTime);
    yield return 0;
    }
    }


    作者:lcy0221
    来源:CSDN
    原文:https://blog.csdn.net/lcy0221/article/details/44040739

    展开全文
  • 1、通过输入鼠标右键获取光标在屏幕上的坐标信息,if(Input.GetMouseButtonDown(1)){ Vector3 mousePosition= Input.MousePosition;}//此处获得的是光标在屏幕上的相对坐标,不方便直接使用。...
    1、通过输入鼠标右键获取光标在屏幕上的坐标信息,
    if(Input.GetMouseButtonDown(1))
    {
       Vector3 mousePosition=  Input.MousePosition;
    }
    //此处获得的是光标在屏幕上的相对坐标,不方便直接使用。

    2、将该光标转化为世界坐标
    //从相机中打出一个经过mousePosition的射线
    Ray ray=Camera.main.ScreenPointRay(mousePosition);
    //获取射线打中物体的信息(在实际运用中会增加对物体的限制,一般为仅限地面)
    RaycastHit hitInfo;
    if(Physics.Raycast(ray, out hitInfo))
    {
        Vector3 endPoint=hitInfo.point;
    }

    3、获取位移向量
    //终点坐标-起点坐标=起点到终点的位移向量;
    Vector3 v = endPoint - tank.position;

    4、实现移动
    //通过Update函数每帧进行位置变更来实现位置的移动;
    //位置+向量=新的位置
    //将位移向量归一,方便用速度变量控制
    var next=v.normalized * speed * Time.deltaTime;
    tank.position+=next;

    5、实现转向
    //获取forward 与位移向量的夹角
    float angle=Vector3.Angle(v, tank.forward)
    //通过转速变量来控制转向速度
    float minAngle = Mathf.Min(angle, angluarSpeed * Time.deltaTime);
    //利用叉乘的方法实现转向,叉乘方法对与辨认左右极为便利
     transform.Rotate(Vector3.Cross(tank.forward,v.normalized),minAngle);

    一下为完整代码:
    (在上面基础上进行了拓展实现了连续点击几个位置,坦克逐个巡逻的功能

      转向的实现发放上用了点乘的方法。)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    public class MoveToTarget : MonoBehaviour
    {
        Transform MyTrans;
        List<Vector3> endPoints;
        float speed = 5;
        float angluarSpeed = 100;
    
        void Start()
        {
            MyTrans = GetComponent<Transform>();
            endPoints = new List<Vector3>();
        }
    
        void Update()
        {
            if (Input.GetMouseButtonDown(1))
            {
                UpdateControl();
            }
            if (endPoints.Count > 0)
            {
                Vector3 v = endPoints[0] - MyTrans.position;
                var dot = Vector3.Dot(v, MyTrans.right);
                Vector3 next = v.normalized * speed * Time.deltaTime;
                float angle = Vector3.Angle(v, MyTrans.forward);
                if (Vector3.SqrMagnitude(v) > 1f)
                {
                    float minAngle = Mathf.Min(angle, angluarSpeed * Time.deltaTime);
                    //点乘
                    if (angle > 1f)
                    {
                        //transform.Rotate(Vector3.Cross(tank.forward, v.normalized), minAngle);
                        if (dot > 0)
                        {
                            MyTrans.Rotate(new Vector3(0, minAngle, 0));
                        }
                        else
                        {
                            MyTrans.Rotate(new Vector3(0, -minAngle, 0));
                        }
                    }
                    else
                    {
                        MyTrans.LookAt(endPoints[0]);
                        MyTrans.position += next;
                    }
                }
                else
                {
                    endPoints.RemoveAt(0);
                }
    
            }
        }
        void UpdateControl()
        {
            //获取屏幕坐标
            Vector3 mousepostion = Input.mousePosition;
            //定义从屏幕
            Ray ray = Camera.main.ScreenPointToRay(mousepostion);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                if (Input.GetKey(KeyCode.LeftShift))
                {
                    AddEndPoint(hitInfo.point);
                }
                else
                {
                    ReSetEndPoint(hitInfo.point);
                }
                //transform.LookAt(endPoint);
                //transform.Translate(movePoint * 0.1f);
            }
    
        }
        void AddEndPoint(Vector3 endPoint)
        {
            endPoint.y = MyTrans.position.y;
            endPoints.Add(endPoint);
        }
        void ReSetEndPoint(Vector3 endPoint)
        {
            endPoint.y = MyTrans.position.y;
            endPoints.Clear();
            endPoints.Add(endPoint);
        }
    }
    

    展开全文
  • Unity3d 简单的按照路径移动物体!

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


    目标是让蓝色方块沿着紫色方块组成的路径移动,设计思想就是让蓝色方块移动第一个,然后继续移动到第二个,然后.....,我们使用碰撞检测判定蓝色方块是否已经到位置来改变方向。

    首先编写2个简单的脚本:

    /----------------------------- move.cs 给蓝色方块使用------------------------------/
    using UnityEngine;
    using System.Collections;

    public class move : MonoBehaviour
    {
        //用来保存目标的数组
        public Transform [] obj;
        //用来改变数组的值
        private static int i = 0;
     
        void Start()
        {
        }
      
        void Update()
        {
            // 让我们的物体朝目标移动
            transform.LookAt(obj[i % obj.Length]);
            transform.Translate(Vector3.forward*Time.deltaTime*5);
        }

        //改变目标物体
        public static void Add()
        {
            i++;
        }
    }
    /----------------------------- move.cs end --------------------------/

    /----------------------------- point.cs 给紫色方块使用 ----------------/
    using UnityEngine;
    using System.Collections;

    public class point : MonoBehaviour {

    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
    }

        //当用户接触到目标物体改变参数到下一个目标物体
        void OnTriggerEnter(Collider cos)
        {
            move.Add();
        }
    }
    /----------------------------- point.cs end --------------------------/

    蓝色方块的参数设置,注意要将box collider 换成Character Controller,这样才能跟紫色方块产生碰撞触发。

    紫色方块的参数设置,注意要将Is Trigger 参数打钩,否则也不会产生碰撞检测。


    运行工程,你就会发现蓝色方块会沿着紫色方块路径移动,不停的循环......

    展开全文
  • Unity3D 路径的编辑与跟随路径的移动脚本的编写。

    Unity3D跟随路径移动

    在做项目的时候,突然想到要做一个可以跟随路径走的AI,而且路径可视化。
    原视频地址:https://www.youtube.com/watch?v=1aBjTa3xQzE

    分为两部分代码,第一个是编辑路径的代码,另一个为跟随路径的代码。


    代码如下

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class EditorPathScript : MonoBehaviour {
    
        public Color rayColor = Color.white;
        public List<Transform> path_objs = new List<Transform>();
        Transform[] theArray;
    
        void OnDrawGizmos(){
            Gizmos.color = rayColor;
            theArray = GetComponentsInChildren<Transform>();
            path_objs.Clear();
            foreach(Transform path_obj in theArray){
                if(path_obj != this.transform){
                    path_objs.Add(path_obj);
                }
            }
            for(int i = 0;i<path_objs.Count;i++){
                Vector3 position = path_objs[i].position;
                if(i>0){
                    Vector3 previous = path_objs[i-1].position;
                    Gizmos.DrawLine(previous,position);
                    Gizmos.DrawWireSphere(position, 0.3f);
                }
            }
    
        }
    
        void Start () {
    
        }
    
        // Update is called once per frame
        void Update () {
    
        }
    }
    

    挂到一个游戏物体上,然后在该游戏物体下创建子游戏物体,在scene视图可以看到。
    scene视图
    Scene视图
    至少要有两个物体,这样才会连成线。

    hierarchy视图
    编辑游戏物体

    inspector视图
    游戏对象脚本

    第二部分代码如下

    using UnityEngine;
    using System.Collections;
    
    public class FollowPath : MonoBehaviour {
    
        public bool StartFollow = false;
        public EditorPathScript PathToFollow;
        public int CurrentWayPointID = 0;
        public float Speed;//移动速度
        public float reachDistance = 0f;//里路径点的最大范围
        public string PathName;//跟随路径的名字
        private string LastName;
        private bool ChangePath = true;
    
    
    
        void Start () {
    
        }
    
        void Update () {
            if (!StartFollow)
                return;
            if (ChangePath)
            {
                PathToFollow = GameObject.Find(PathName).GetComponent<EditorPathScript>();
                ChangePath = false;
            }
            if (LastName != PathName)
            {
                ChangePath = true;
            }
            LastName = PathName;
    
    
    
    
            float distance = Vector3.Distance(PathToFollow.path_objs[CurrentWayPointID].position, transform.position);
            //transform.Translate(PathToFollow.path_objs[CurrentWayPointID].position * Time.deltaTime * Speed, Space.Self);
            transform.position = Vector3.MoveTowards(transform.position, PathToFollow.path_objs[CurrentWayPointID].position, Time.deltaTime * Speed);
            if (distance <= reachDistance)
            {
                CurrentWayPointID++;
            }
            if (CurrentWayPointID >= PathToFollow.path_objs.Count)
            {
                CurrentWayPointID = 0;
            }
        }
    }
    

    脚本挂到要移动的游戏物体上,PathName是路径的名字。

    和视频里面的脚本有一点不同,我加了开关,然后能动态检测名字。。。当名字改变后仍然能够继续运行。

    在EditorPath下创建两个子物体,然后挂上编辑脚本,然后再创建路径
    这里写图片描述
    这里写图片描述
    这里写图片描述

    这里写图片描述
    指定Path1为跟随路径。

    挂到游戏物体上,打开StartFollow,可以看到他自动往路径点跑,然后一个一个接着跑,最后会循环。

    展开全文
  • Unity3D移动物体位置的几种方法

    万次阅读 多人点赞 2016-06-29 14:29:38
     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position), ...
  • Unity3d 控制物体transform移动的几种方法

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

    万次阅读 多人点赞 2015-05-19 17:00:48
     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体  Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转...
  • Unity3D】键盘鼠标控制视角的移动

    万次阅读 2017-05-02 17:23:48
    其实也不难,换到Unity3D里面是想办法控制摄像机的移动。下面举一个简单的例子说明在Unity3D如何用键盘鼠标控制视角的移动的。如下图所示: 就像大部分游戏一样,可以用鼠标滚轮控制视角的远近,键盘的wasd和上下...
  • Unity3D实现人物转向与移动脚本

    热门讨论 2020-07-30 23:32:24
    Unity3D实现人物转向与移动脚本。通过设定四个方向值进行角度计算
  • 就比如可以在鼠标移动到UI上面的时候显示文字。 那么如何在UGUI上,鼠标移动上去显示文字说明呢。 大家都知道,当鼠标移动到button按钮上面的时候会出现变化,主要是button这个组件在控制 既然可以控制颜色,就一定...
  • Unity3D移动平台简单实现

    千次阅读 2018-12-04 23:51:01
    本文主要是在Unity3D引擎下使用少量脚本实现两点之间来回移动平台的最基本功能,是一种比较简单且好理解的移动平台解决方案。 涉及到的点如下: 平台对象的实现 平台移动路线的设定 处于平台上游戏对象(如:玩家...
  • Unity3d 控制角色移动

    千次阅读 2018-09-09 09:17:48
    方法一:使用Transform组件 public class Mover : MonoBehaviour { public float speed = 10f; private void Update() { float hMove = Input.GetAxis("Horizontal"... float vMove =...
  • Unity3d添加简单人物移动

    千次阅读 2019-03-02 22:21:09
    首先在场景中添加一个cube。 并对其添加一个character controller 组件。因为character controller组件中包含碰撞体,所以可以将原本的collider删除掉。 然后对其添加一个c# script 组件用于编写代码。...
  • Unity3D 人物移动控制

    千次阅读 2017-12-03 18:29:09
    加刚体(RigidBody) 设置 y方向锁定位置 拖拽脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class RemController : MonoBehaviour { Vector3 movement; Rigidbody ...
  • Unity3D 中物体移动脚本小记

    千次阅读 2017-02-01 22:57:56
    Uinty3D 中物体移动脚本小记最近几天在Unity官网看了官方提供的教程,自己也实验了一下,发现几个不同的项目中,脚本中对物体移动的实现方式并不相同。using UnityEngine;public class PlayerMoveController : ...
  • Unity3D Player角色移动控制脚本

    千次阅读 2018-05-15 16:40:37
    1.简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。常用API的脚本,会增强代码能力。2. 通过Transform组件移动物体2.1 Transform.Translate(键盘输入,最最最...
  • [Unity3D]Unity3D游戏开发之自由视角下的角色控制

    万次阅读 热门讨论 2014-09-10 12:54:34
    在上一篇文章[Unity3D]Unity3D游戏开发之角色控制漫谈>一文中,博主与大家分享自己在角色控制方面的一些感悟。今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由...
  • Unity3D控制物体移动

    万次阅读 2016-11-16 20:54:48
    在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。 下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续...
  • Unity3DUnity3D 物体跟随鼠标移动

    千次阅读 2020-03-11 15:29:39
    在Update中运行Vector3 mousePos=Camera.main.ScreenToWorldPoint(Input.mousePosition)+...这行代码的意思是屏幕坐标转化为三维坐标,然后z轴加10就是正确的位置了transform.position=mousePos;当前坐标跟随鼠标移动
1 2 3 4 5 ... 20
收藏数 25,032
精华内容 10,012
关键字:

unity3d位置移动