RTS触摸相机运动

RTS touch camera movement

我一直在努力寻找相机移动的解决方案。这些是它需要工作的参数以及我尝试过的一些想法:

所以我的想法让我设计了一个解决方案来抓住 Vector3 点,在该点上,光线在 fingerDown 上击中手指下方的地面,然后将相机沿与原点和 movingPoint 之间的真实世界距离相反的方向移动。如果那有意义的话。

我对此很困惑所以有人可以确认或否认我的想法并给出明确的前进方向=)

我正在使用一种名为 LeanTouch(出色的免费脚本)的资产来进行触摸输入,这是我的大脑想要达到的程度:(lol)

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#

好的,我终于明白了。基于地图上我的手指触摸屏幕的物理位置,一个非常流畅准确的相机移动。

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)
    {
        //Fires ray with ScreenToWorld at finger pos using LeanTouch
        var ray = finger.GetRay (); 
        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);
                //Camera stays at same height. 
                //Invert coords to move camera the correct direction
                this.transform.Translate(
                     new Vector3(-DirectionHit.x,0,-DirectionHit.z)); 
            }
        }
    }

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