精华内容
下载资源
问答
  • Unity iTween的匀速运动

    千次阅读 2019-02-01 15:08:20
    iTween.MoveTo(gameobject, iTween.Hash("x", 0, "y", 0f, "z", -2000f, "time", 1f, "islocal"...重点是EaseType 的模式 linear 表示线性运动


    iTween.MoveTo(gameobject, iTween.Hash("x", 0, "y", 0f, "z", -2000f, "time", 1f, "islocal", true, "EaseType", "linear"));

    重点是EaseType 的模式 linear 表示线性运动

    展开全文
  • Unity编辑器场景相机匀速运动

     美术在使用Unity编辑地形时,提出了让场景相机匀速运动的需求,因为Unity原本的场景相机移动速度不可控,同时在移动过程中会加速。在网上找了很多没有确切的解决方案,Unity似乎也并没有提供相关的接口。笔者尝试了一种利用EditorWindow的Update刷新相机位置的方法,效果还不错。
     首先创建一个EditorWindow,并在OnGui中提供速度的输入框。
     如果仍使用Unity原有的相机控制快捷键,在持续运动相机一段时间后,Unity自带的相机速度会加到很大,而Unity自己处理Scene相机频率比Update快,即使我们在每次Update的时候手动设置了相机位置,仍然会造成相机位置突变,导致图像晃动。因此笔者采用了一组新的快捷键(方向键+鼠标右键)的组合,既不与现有操作冲突,又可以在移动过程中随时调整相机角度。
     通过SceneView.onSceneGUIDelegate注册场景事件,捕捉按键变化,并在每个Update中获取相机角度,计算运动后的位置。
     具体代码如下:

    public class SceneCameraControlWindow : EditorWindow
    {
      private string m_speedStr = "1";
      private float m_speed = 1f;
      private bool m_enable = false;
      private Vector3 m_curMove;
      private void OnEnable()
      {
        SceneView.onSceneGUIDelegate += OnSceneFunc;
      }
      private void OnDisable()
      {
        SceneView.onSceneGUIDelegate -= OnSceneFunc;
      }
      private void OnGUI()
      {
        GUILayout.BeginHorizontal();
        GUILayout.Label("速度:");
        string newStr = GUILayout.TextField(m_speedStr);
        GUILayout.EndHorizontal();
        GUILayout.Label("按住鼠标右键+方向键(↑、↓、←、→)移动相机");
        float newSpeed;
        if(newStr != m_speedStr && float.TryParse(newStr, out newSpeed) && newSpeed >= 0)
        {
          m_speedStr = newStr;
          m_speed = newSpeed;
        }
      }
    
      private void Update()
      {
        if(m_enable && null != SceneView.lastActiveSceneView)
        {
    
          SceneView.lastActiveSceneView.pivot += (SceneView.lastActiveSceneView.camera.transform.rotation * m_curMove) * m_speed * Time.deltaTime;
        }
      }
    
      private void OnSceneFunc(SceneView target)
      {
        if (null == SceneView.lastActiveSceneView || target != SceneView.lastActiveSceneView)
          return;
        switch (Event.current.type)
        {
          case EventType.MouseDown:
            if(Event.current.button == 1)
            {
              m_enable = true;
            }
            break;
          case EventType.MouseUp:
            if (Event.current.button == 1)
            {
              m_enable = false;
            }
            break;
          case EventType.KeyDown:
            switch (Event.current.keyCode)
            {
              case KeyCode.UpArrow:
                m_curMove.z = 1f;
                break;
              case KeyCode.DownArrow:
                m_curMove.z = -1f;
                break;
              case KeyCode.LeftArrow:
                m_curMove.x = -1f;
                break;
              case KeyCode.RightArrow:
                m_curMove.x = 1f;
                break;
            }
    
            break;
          case EventType.KeyUp:
            switch (Event.current.keyCode)
            {
              case KeyCode.UpArrow:
                m_curMove.z = 0f;
                break;
              case KeyCode.DownArrow:
                m_curMove.z = 0f;
                break;
              case KeyCode.LeftArrow:
                m_curMove.x = 0f;
                break;
              case KeyCode.RightArrow:
                m_curMove.x = 0f;
                break;
            }
            break;
        }
      }
    }
    展开全文
  • 前言首先,我们可以利用Unity API,Transform.RotateAround来实现匀速圆周运动。但是这个实现,我觉得不过瘾,因为你只是了解一个API,并没有学到任何其他的知识。接下讲一点有意思东西。物理知识1.定义: 质点沿...

    前言
    首先,我们可以利用Unity API,Transform.RotateAround来实现匀速圆周运动。但是这个实现,我觉得不过瘾,因为你只是了解一个API,并没有学到任何其他的知识。接下讲一点有意思东西。
    物理知识
    1.定义:
    质点沿圆周运动,如果在任意相等的时间里通过的圆弧长度都相等,这种运动就叫做“匀速圆周运动”,亦称“匀速率圆周运动”。因为物体作圆周运动时速率不变,但速度方向随时发生变化。所以匀速圆周运动的线速度是无时无刻在发生变化的。

    2.基本公式:
    v(线速度)=ΔS/Δt=2πr/T=ωr=2πrn (S代表弧长,t代表时间,r代表半径,n代表转速)
    ω(角速度)=Δθ/Δt=2π/T=2πn (θ表示角度或者弧度)

    T(周期)=2πr/v=2π/ω
    Fn(向心力)=mrω^2=mv^2/r=mr4π^2/T^2=mr4π^2n^2
    为了方便起见,我们采用线速度v,半径r,质量m,来计算向心力。F=m*v*v/r


    源码:

    [csharp]

    using UnityEngine;

    • using System.Collections;
    • public class circle : MonoBehaviour {
    •     public Vector3 linerSpeed;
    •     public Vector3 circleDot;
    •     private float radius;
    •     private Rigidbody body;
    •     private float speed;
    •     private float omga;
    •     // Use this for initialization
    •     void Start () {
    •         body=gameObject.GetComponent<Rigidbody> ();
    •         body.velocity = linerSpeed;
    •         radius = (circleDot - gameObject.transform.position).magnitude;
    •         speed = linerSpeed.magnitude;
    •         omga = speed *speed/ radius;
    •     }
    •     // Update is called once per frame
    •     void Update () {
    •         //Debug.Log (body.velocity);
    •     }
    •     void FixedUpdate () {
    •         Vector3 fp = circleDot - gameObject.transform.position;//向心力矢量,但此时向量模不正确
    •         fp = fp.normalized * body.mass * omga;//纠正向量的模
    •         body.AddForce (fp,ForceMode.Force);
    •     }
    • }

    温馨提示:circleDot:围绕哪点做匀速圆周运动。
    linerSpeed:匀速圆周运动的线速度。

    1.AddForce 需要使用ForceMode.Force模式,不要使用Impulse模式。冲力模式会增加向心力效用,导致更多向中心靠拢。

    2.利用空间换取时间,把一些运算结果保存起来,以便下一帧复用。
    3.利用物理引擎会消耗更多性能,但可以了解更多知识嘛,也许还要更优方法,在此抛砖引玉。

    转载于:https://www.cnblogs.com/feiyanstudio/articles/7326757.html

    展开全文
  • Vector3.Lerp和itween插件路径算法并不是需要的效果,在目标点转换的时候使用这两个方法并不会匀速,两点间的距离越大速度就越快,我对itween的算法还不太了解,现在我着重解释一下怎么用Vector3.Lerp解决“变速”的...
        在项目中,可能会遇到迅速任意方向的运动需求,要解决匀速运动大家可能会首先想到Vector3.Lerp和unity 的itween插件来解决,但是真正使用之后,你就会发现Vector3.Lerp和itween插件路径算法并不是你需要的效果,在目标点转换的时候使用这两个方法并不会匀速,两点间的距离越大速度就越快,我对itween的算法还不太了解,现在我着重解释一下怎么用Vector3.Lerp解决“变速”的问题;
          Vector3.Lerp
          static Vector3 Lerp(Vector3 from, Vector3 to, float t);假设from和to的坐标分别为(x1,y1,z1)和(x2,y2,z2),两点之间可以连成一条直线。Vector3.Lerp(from,to,t)的值(x,y,z)就是在这条直线上的一点,并且满足x-x1/x2-x1=y-y1/y2-y1=z-z1/z2-z1=t,根据这个方程求得x=t(x2-x1)+x1,y=t(y2-y1)+y1,z=t(z2-z1)+z1,即Vector3.Lerp(from,to,t)的(返回)值为(t(x2-x1)+x1,t(y2-y1)+y1,t(z2-z1)+z1),由于x1,y1,z1,x2,y2,z2都是常数,所以x,y,z随t单调递增或递减。当t=0时,x=t(x2-x1)+x1=x1,y=y1,z=z1;当t=1时,x=x2,y=y2,z=z2;当t=1/2时,x=x1+x2/2,y=y1+y2/2,z=z1+z2/2,正好为两点之间的中点。函数返回值实际上就是由from到to的直线的t分点综上所述,当0<=t<=1时,并且由0向1变化时,函数返回值沿直线由点from逐渐变化为点to。在Unity中,t<0按t=0处理,t>1按t=1处理在Update中调用该函数时,transform.position=Vector3.Lerp(transform.position,GameObject.FindWithTag("Player").transform.position,0.9f);每经过一帧,物体的位置向Player移动90%,两者之间越来越接近,但是永远不会在同一位置(特殊情况除外)。可见,只要t不为0和1,两者之间总是在逐渐接近,t越大,两者之间接近的速度越快,当t不等于1时,两者总不会在同一位置(特殊情况除外)。当t=1时,两者总在同一位置
         了解了 Vector3.Lerp每次都是按剩余百分比,这就是速度变化的原因,而想要控制速度只需要很简单的把t=1/((from - to).magnitude)就行了,每一帧都对剩余的量求解,这样就能实现匀速了。
         而方向控制就使用Quaternion.Slerp就非常容易解决。
    展开全文
  • [Unity算法]斜抛运动

    2019-02-18 23:36:00
    [Unity算法]斜抛运动 斜抛运动: 1.物体以一定的初速度斜向射出去,物体所做的这类运动叫做斜抛运动。 2.斜抛运动看成是作水平方向的匀速直线运动和竖直方向的竖直上抛运动的合运动。 3.它的运动...
  • [Unity算法]平抛运动

    2019-02-17 16:28:00
    [Unity算法]平抛运动 平抛运动: 1.物体以一定的初速度水平方向抛出,如果物体仅受重力作用,这样的运动叫做平抛运动。 2.平抛运动可看作水平方向的匀速直线运动以及竖直方向的自由落体运动的合运动。 ...
  • unity

    2019-09-18 23:52:09
    1、简答并用程序验证 游戏对象运动的本质是什么? 游戏运动的本质就是使用矩阵变换...抛物运动的原理就是水平方向做匀速运动,竖直方向上做加速度不变的运动,例如让一个物体在x轴和y轴组成的平面上做抛物运动,那...
  • Unity中炮弹抛物线运动

    万次阅读 多人点赞 2016-06-24 15:59:51
    比如迫击炮发射的子弹是抛物线运行的,并且在垂直方向上子弹做自由落体运动,如果垂直方向上不做自由落体(仅仅是一个匀速的抛物线),有很多简便的方法可以实现,比如设置一个起始点,一个最高点,一个目标点,让物体按照这...
  • unity插件DOTween

    2015-07-17 18:05:51
    Unity插件DOTween,包含各种运动类型:匀速运动、加速运动、减速运动等等。
  • 用于Unity中非基于时间的动画的灵活运动引擎 UrMotion(您的运动)是Unity的全新简单灵活的运动引擎。 它使您可以轻松快捷地在脚本上创建非基于时间的复杂动画。 要开始使用UrMotion,请将Assets/UrMotion Directoy...
  • UNITY 围绕一个物体做圆周运动

    千次阅读 2016-05-04 17:08:49
    有一道题:一个物体围绕原点(0,0)做匀速圆周运动。t1时物体位置为(x1,y1),已知物体的角速度为 w,围绕半径为 r。求经过时间t后,物体在圆周上位置(x,y)。求得: - x = r * sin(w * t) - y = r * cos(w * t)...
  • 简答 游戏对象运动的本质是什么? 游戏对象运动的本质是随着每一帧刷新,对象的positoin、rotation离散地进行变化。...即x轴上做匀速直线运动,y轴上匀变速直线运动。所以首先我们都要定义好的就...
  • 抛物线运动即是水平做匀速运动,垂直做加速运动 假定发射角度为45°,发射速度为10m/s 因为初速度、初方向的计算都类似,所以除了第一个代码块声明了变量和Start()方法外其他的都只写Update()方法 实现方法1:...
  • Unity 小知识

    2019-08-01 11:25:50
    目录 1.Component的复制黏贴 2.组件删除 3.Editor模式下执行脚本的Update或...7.物体匀速运动,匀加速运动 8.Unity 项目多开 9.Unity调用外部可执行文件(例如 .exe .bat文件) 10.向量的长度sqrMagnitude和ma...
  • 物体延水平方向运动工程实现需注意: - 摄像机的设置 Projection Orthographic - Start() 和 Update()的执行顺序与执行次数 - 屏幕坐标与空间坐标的转换 - 关于Time.deltaTime ...//匀速运动 public
  • Unity-Spine动画位移问题

    千次阅读 2018-12-02 18:25:43
    但如果某些动画本身不是匀速运动,比如丧失的走路动画,可能会是一个非线性运动,这个时候如果要策划在编辑器通过调曲线来调出走路的非线性移动是相当困难的,而spine-unity并没有提供像3dmax一样将移动转换为unity...
  • Unity 3D - Lerp

    2017-05-04 11:16:50
    Unity 3D - Lerp :很多时候大家使用Lerp都是想达到匀速运动的效果,但如下“误用”却让对象以逐渐降低的速度运动。每帧都重新获取物体当前的位置,计算物体和目标距离的差距,再按照当前帧的持续时间(当做一个...
  • Unity 控制物体移动的一些方法

    千次阅读 2019-07-16 10:40:57
    Unity3D中一些控制物体移动的方法, 匀速移动, 加速移动, 物理运动
  • unity发射弓箭轨迹的实现

    千次阅读 2017-04-21 11:23:03
    就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动。 在unity上的具体实现为,使用transform进行位移模拟。至于为何不使用刚体的物理模拟,大家自行脑补或者测试。 那么如何使用transform模拟呢...
  • Unity开发 AnimationCurve

    千次阅读 2018-07-23 17:25:57
    AnimationCurve 动画曲线 这个功能很好用,在粒子系统,理系统上都有用到,还是很常用的 ...就是物体上下 做 匀速运动, 创建 关键针序列 Keyframe ,插入。 获取 创建关键帧序列:Keyframe[] ks = new Keyfram...
  • @TOC贝塞尔曲线在Unity中的简单实现 #贝塞尔曲线在Unity中的简单实现 ...model:运动模式,匀速或者插值 points:指定一条路线 ##方法说明 Bezier:开启一个协程控制物体运动 Suspend:暂停运动 ReStart:...
  • 强烈建议新项目使用DoTween,Tween的移动类型有很多种,比如匀速运动、加速运动、减速运动,等等。
  • Unity Vector3.Lerp

    2017-10-25 14:14:22
    一、匀速运动 public Transform from; public Transform to; public float mMoveTime = 1f; private float t = 0f; void Update() { t += 1f / mMoveTime * Time.deltaTime; from.po

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

unity匀速运动