RTS触摸相机运动
RTS touch camera movement
我一直在努力寻找相机移动的解决方案。这些是它需要工作的参数以及我尝试过的一些想法:
- 相机移动/不是世界移动
- 光线投射可沿地形准确移动相机
- 触摸移动通过 "grabbing" 朝向你的地形或 "pushing" 它远离你
- 屏幕 space 到世界 space 由于相机的角度将无法正常工作
所以我的想法让我设计了一个解决方案来抓住 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;
}
}
我一直在努力寻找相机移动的解决方案。这些是它需要工作的参数以及我尝试过的一些想法:
- 相机移动/不是世界移动
- 光线投射可沿地形准确移动相机
- 触摸移动通过 "grabbing" 朝向你的地形或 "pushing" 它远离你
- 屏幕 space 到世界 space 由于相机的角度将无法正常工作
所以我的想法让我设计了一个解决方案来抓住 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;
}
}