2015-05-13 57 views
0

我一直在试图让我的头部围绕我的相机移动解决方案。这些都需要通过工作参数和一些想法我曾尝试:RTS触摸相机机芯

  • 相机运动/没有世界第一运动
  • 光线投射到沿地形
  • 触摸移动的工作方式是“抓”的地形准确地移动相机对你或者“推”它拿走
  • 屏幕空间到世界空间不会因为相机

所以我的想法有领导的角度的工作,我设计一个解决方案,抢的Vector3指向光线落在fingerDown下的手指下的地面,然后将相机移动到与原点和移动点之间的真实世界距离相反的方向。如果那有意义的话。

我很困惑这个问题,因此可能有人确认或否认我的想法,并给出了明确的方式=)

我使用的是被称为LeanTouch(辉煌一块免费的脚本资产)的触摸输入,这是只要我的大脑想要去(笑)

var finger = Lean.LeanTouch.Fingers [Lean.LeanTouch.Fingers.Count - 1]; 
var ray = finger.GetRay(); 
int layerMask = (1 << 8); 
Physics.Raycast (ray, out hit, Mathf.Infinity, layerMask); 
InitialHit = hit.transform.position; 

顺便说一下我在Unity我工作和C#

+0

你对此感到困惑吗?你的解决方案对我来说看起来很标准:)(顺便说一下,尝试猜测光线投射的最大距离 - 距离越小,光线投射就会越快--Mathf.Infinity将工作得最慢) – JinJi

+0

你的想法是走的路。只需计算您的触摸的三角洲位置,并将其应用于相机的每个帧的X和Z位置。相机的Y位置将等于height + hit.position(在执行Raycast(Camera.position,Vector3.down等)后) – Utamaru

+0

即使附加了碰撞器,raycast似乎也不会撞到地形。我阅读了其他一些帖子,并尝试'如果(Terrain.activeTerrain.collider.Raycast(ray,out hit,1000f))''但没有运气。它没有看到地形.. – 4t0m1c

回答

0

好吧,我终于得到它。根据我手指触摸屏幕的地图上的物理位置,精确平滑的相机移动。

using UnityEngine; 

public class SimpleCamMove : MonoBehaviour 
{ 
    private RaycastHit hit; 
    private Vector3 InitialHit; 
    private Vector3 CurrentHit; 
    private Vector3 DirectionHit; 
    private bool CamActive; 

    protected virtual void OnEnable() 
    { 
     // Hook into the OnFingerDown event 
     Lean.LeanTouch.OnFingerDown += OnFingerDown; 

     // Hook into the OnFingerUp event 
     Lean.LeanTouch.OnFingerUp += OnFingerUp; 
    } 

    protected virtual void OnDisable() 
    { 
     // Unhook the OnFingerDown event 
     Lean.LeanTouch.OnFingerDown += OnFingerDown; 

     // Unhook the OnFingerUp event 
     Lean.LeanTouch.OnFingerUp += OnFingerUp; 
    } 

    public void OnFingerDown(Lean.LeanFinger finger) 
    { 

     var ray = finger.GetRay(); //fires ray with ScreenToWorld at finger pos using LeanTouch 
     int layerMask = (1 << 8); //ground layer 
     CamActive = true; 
     if (Physics.Raycast (ray, out hit, 1500, layerMask)) { 
      InitialHit = hit.point; 
     } 
    } 

    protected virtual void LateUpdate() 
    { 
     if (CamActive == true) { 
      var finger = Lean.LeanTouch.Fingers [Lean.LeanTouch.Fingers.Count - 1]; 
      var ray = finger.GetRay(); 
      int layerMask = (1 << 8); 
      if (Physics.Raycast (ray, out hit, 1500, layerMask)) { 
       CurrentHit = hit.point; 
       DirectionHit = (CurrentHit - InitialHit); 
       this.transform.Translate(new Vector3(-DirectionHit.x,0,-DirectionHit.z)); //camera stays at same height. Invert coords to move camera the correct direction 
      } 
     } 
    } 

    public void OnFingerUp(Lean.LeanFinger finger) 
    { 
     CamActive = false; 
    } 

}