如何通过Unity3D中的路径触摸位置来控制动画?

时间:2013-08-15 15:24:47

标签: animation path unity3d itween

我有一个GameObject,我想沿着特定的路径/曲线设置动画,但动画应该由鼠标/触摸位置控制。因此,当我触摸/单击GameObject并在路径上/附近移动手指/鼠标(或者可能更容易向下移动)时,GameObject应遵循其定义的路径。

我喜欢iTween,但我认为在这里找不到使用它的解决方案,对吗?

编辑:添加图片:enter image description here

2 个答案:

答案 0 :(得分:4)

这比你想象的要简单得多。

基本上,这是将函数(将输入作为参数)重新映射到另一个函数(表示沿路径的位置)的问题。 有几种方法可以实现,具体取决于您想要实现的精确效果。

您必须采取的最重要的选择是:

  • 如何描述路径/曲线
  • 如何处理输入

示例

对于路径,一种简单灵活的方法是使用某种样条曲线,例如立方Bézier curve。它易于实现,Unity3D提供了内置函数来绘制它们。看看Handles.DrawBezier

Bézier函数基本上将域t中的参数[0,1]作为输入,并作为结果返回空间中的一个点(根据您的喜好选择2D或3D)。 B(0)在曲线的开头给出了点,B(1)结束点。 (旁注:函数不是线性的,因此在一般情况下以恒定速率递增t不会沿曲线以恒定速度产生运动。这paper可能有用。)

对于输入的关注点,我想到的更简单的解决方案如下:

  • 累积描述从触摸开始时的位置到当前触摸位置的偏移的向量。 (Here如何处理触摸,请查看deltaPosition)。

类似的东西:

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) 
{
  offsetFromStartPos += Input.GetTouch(0).deltaPosition;
}

假设您要向上/向下滑动手指以沿着路径向前/向后移动物体。选择手指的“行程”距离(输入功能的域)以完成沿着路径的移动使用此距离对曲线进行曲线和标准化,以便将输入重新映射到[0,1]域。

float t = offsetFromStartPos.y / maxDistanceAlongYAxis;
Vector3 pos = CalculateBezier(t);
transform.position = pos;

这只是让你朝着正确方向前进的暗示。

答案 1 :(得分:0)

我尝试使用键盘,并且键盘工作正常, 但不能使用鼠标或触摸

require 'snmp'

HOST = '127.0.0.1'.freeze

registers = ['sysContact.0', 'sysUpTime.0',
             'upsIdentManufacturer.0', 'upsIdentModel.0', 'upsIdentName.0']

params_array = {}
SNMP::Manager.open(host: HOST) do |manager|
  manager.load_module('UPS-MIB')
  response = manager.get(registers)
  response.each_varbind do |vb|

    ##################################
    # change from here...

    value = nil
    case vb.value.asn1_type
    when 'OCTET STRING'        # <==========
      value = vb.value        
    when 'INTEGER'             # <==========
      value = vb.value.to_i
    when 'TimeTicks'           # <==========
      value = vb.value.to_s
    else
      puts "Type '#{vb.value.asn1_type}' not recognized!"
      exit(1)
    end
    params_array[vb.name.to_s] = value

    # ... to here
    ##################################

    # with something like
    # params_array[vb.name.to_s] = vb.value._to_its_proper_type_

  end
end
pp params_array