【问题标题】:restrict camera movement, Camera moves out of bounds限制相机移动,相机移动出界
【发布时间】:2021-03-10 07:34:15
【问题描述】:

我正在为我的手机游戏创建一个简单的相机平移和滚动,需要一些帮助。 现在使用代码我有一个玩家可以滚动我创建的地图。 我从这个 youtube 视频中获得了代码(用于上下文)https://gist.github.com/ditzel/836bb36d7f70e2aec2dd87ebe1ede432
https://www.youtube.com/watch?v=KkYco_7-ULA&ab_channel=DitzelGames

你知道我该如何解决这个问题吗?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScrollAndPinch : MonoBehaviour
{
#if UNITY_IOS || UNITY_ANDROID
    public Camera Camera;
    public bool Rotate;
    protected Plane Plane;

    public Transform Map;

    float distance;


    private void Awake()
    {
        if (Camera == null)
            Camera = Camera.main;
        Input.multiTouchEnabled = true;

    }

    private void Update()
    {

        //Update Plane
        if (Input.touchCount >= 1)
            Plane.SetNormalAndPosition(transform.up, transform.position);

        var Delta1 = Vector3.zero;
        var Delta2 = Vector3.zero;

        //Scroll
        if (Input.touchCount >= 1)
        {
            Delta1 = PlanePositionDelta(Input.GetTouch(0));
            if (Input.GetTouch(0).phase == TouchPhase.Moved)
                Camera.transform.Translate(Delta1, Space.World);
        }

    }

    protected Vector3 PlanePositionDelta(Touch touch)
    {
        //not moved
        if (touch.phase != TouchPhase.Moved)
            return Vector3.zero;

        //delta
        var rayBefore = Camera.ScreenPointToRay(touch.position - touch.deltaPosition);
        var rayNow = Camera.ScreenPointToRay(touch.position);
        if (Plane.Raycast(rayBefore, out var enterBefore) && Plane.Raycast(rayNow, out var enterNow))
            return rayBefore.GetPoint(enterBefore) - rayNow.GetPoint(enterNow);

        //not on plane
        return Vector3.zero;
    }

    protected Vector3 PlanePosition(Vector2 screenPos)
    {
        //position
        var rayNow = Camera.ScreenPointToRay(screenPos);
        if (Plane.Raycast(rayNow, out var enterNow))
            return rayNow.GetPoint(enterNow);

        return Vector3.zero;
    }

#endif
}

【问题讨论】:

    标签: unity3d zooming limit pinchzoom pinch


    【解决方案1】:

    您可以使用这样的布尔值在您的区域范围内更新控件:

    if(Camera.transform.position.x > valuexmax || Camera.transform.position.x < valuexmin
          || Camera.transform.position.y > valueymax || Camera.transform.position.y < valueymin)
       {
         InBounds = false; //just a bool variable set to true in start
       }
    

    然后你可以在卷轴中放入类似这样的东西

    if (Input.touchCount >= 1 && InBounds == true)
        {
            Delta1 = PlanePositionDelta(Input.GetTouch(0));
            if (Input.GetTouch(0).phase == TouchPhase.Moved)
                Camera.transform.Translate(Delta1, Space.World);
        }
    
    if(InBounds == false)
    {   
          // reset position
     }
    

    【讨论】:

    • 所以我添加了你所说的内容并且我没有收到错误(这很棒??????)。但我现在对如何让相机保持在界内感到困惑。使用您的代码,一旦相机超出范围,它就会停止移动。我尝试使用矢量夹,但那太乱了,弄乱了相机。有什么想法吗?
    • 您可以设置一个 if(InBounds == true) 并在其中使用一个名为 OldPos 的变换变量并设置 OldPos = Camera.transform.position 然后如果 InBounds = false 您可以将相机位置设置为 OldPos如果它不起作用,则在 X 上设置 oldpos - 0.1,在 Y 上设置 -0.1,这样它应该再次移动相机。希望有用
    • 谢谢 Leoverload。这对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多