在 Unity 3D 中使用触摸输入在地形上移动相机 [英] Move Camera Over Terrain Using Touch Input in Unity 3D

查看:46
本文介绍了在 Unity 3D 中使用触摸输入在地形上移动相机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Unity 的新手,我正在尝试弄清楚如何使用触摸输入在地图/地形上移动相机.相机会以 (90,0,0) 的旋转向下看地形.地形在第 8 层.我用键盘让它移动没有问题,现在我试图移动到触摸,如果你想在 iOS 上保持预期的使用,这是非常不同的.

I am new to Unity and I am trying to figure out how to move the camera over a map/terrain using touch input. The camera would be looking down at the terrain with a rotation of (90,0,0). The terrain is on layer 8. I have had no problem getting it moving with keyboard, now I am trying to move to touch and it is very different if you want to keep expected usage on iOS.

我能想到的内置 iOS 应用中最好的例子是地图,用户可以触摸屏幕,只要手指停留在屏幕上,地图上的那个点就会停留在手指下方.因此,当用户移动他们的手指时,地图似乎随着手指移动.我一直无法找到说明如何以这种方式进行操作的示例.我见过可能用鼠标移动相机或角色的例子,但它们似乎不能很好地转化为这种风格.

The best example I can think of on a built in iOS app is Maps where the user would touch the screen and that point on the map would stay under the finger as long as the finger stayed on the screen. So as the user moves their finger the map appears to be moving with the finger. I have not been able to find examples that show how to do it this way. I have seen may examples of moving the camera or character with the mouse but they don't seem to translate well to this style.

也在 Unity3D Answers 上发布:

Also posted on Unity3D Answers:

http://answers.unity3d.com/questions/283159/move-camera-over-terrain-using-touch-input.html

推荐答案

以下应该是你需要的.请注意,在使用透视相机时,很难在手指/光标与地形之间建立 1 对 1 的对应关系.如果您将相机更改为正交,下面的脚本应该会为您提供手指/光标位置和地图移动之间的完美映射.通过透视,您会注意到轻微的偏移.

Below should be what you need. Note that it's tricky to get a 1 to 1 correspondence between finger/cursor and the terrain when using a perspective camera. If you change your camera to orthographic, the script below should give you a perfect map between finger/cursor position and map movement. With perspective you'll notice a slight offset.

你也可以使用光线追踪来做到这一点,但我发现这条路线很草率而且不那么直观.

You could also do this with ray tracing but I've found that route to be sloppy and not as intuitive.

用于测试的相机设置(值是从检查器中提取的,因此将它们应用到那里):

Camera settings for testing (values are pulled from the inspector so apply them there):

  1. 位置:0,20,0
  2. 方向:90,0,0
  3. 投影:透视/正交


using UnityEngine;
using System.Collections;



public class ViewDrag : MonoBehaviour {
    Vector3 hit_position = Vector3.zero;
    Vector3 current_position = Vector3.zero;
    Vector3 camera_position = Vector3.zero;
    float z = 0.0f;
    
    // Use this for initialization
    void Start () {
        
    }
    
    void Update(){
        if(Input.GetMouseButtonDown(0)){
            hit_position = Input.mousePosition;
            camera_position = transform.position;
            
        }
        if(Input.GetMouseButton(0)){
            current_position = Input.mousePosition;
            LeftMouseDrag();        
        }
    }
    
    void LeftMouseDrag(){
        // From the Unity3D docs: "The z position is in world units from the camera."  In my case I'm using the y-axis as height
        // with my camera facing back down the y-axis.  You can ignore this when the camera is orthograhic.
        current_position.z = hit_position.z = camera_position.y;
        
        // Get direction of movement.  (Note: Don't normalize, the magnitude of change is going to be Vector3.Distance(current_position-hit_position)
        // anyways.  
        Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
        
        // Invert direction to that terrain appears to move with the mouse.
        direction = direction * -1;
        
        Vector3 position = camera_position + direction;
        
        transform.position = position;
    }
}

这篇关于在 Unity 3D 中使用触摸输入在地形上移动相机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆