首页 > 其他分享 >Unity 摄像机跟随人物、人物走到地图边缘摄像机停止平移、手指长按屏幕摄像机平移

Unity 摄像机跟随人物、人物走到地图边缘摄像机停止平移、手指长按屏幕摄像机平移

时间:2024-07-30 17:56:14浏览次数:17  
标签:平移 desiredPosition Vector3 摄像机 Unity position public mapBoundary

1. 摄像机跟随人物

首先,你需要一个脚本来控制摄像机跟随人物。这个脚本应该附加到你的摄像机对象上。

CameraFollow.cs

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target; // 指向你的人物对象
    public float smoothSpeed = 0.125f; // 摄像机平滑移动的速度
    public Vector3 offset; // 摄像机相对于人物的偏移量,比如(0, 10, -10)表示摄像机在人物的上方和后方

    void LateUpdate()
    {
        // 计算摄像机应该到达的位置
        Vector3 desiredPosition = target.position + offset;
        // 平滑地移动到那个位置
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
        transform.position = smoothedPosition;

        // 让摄像机始终看向人物
        transform.LookAt(target);
    }
}

在这个脚本中,target是你想要摄像机跟随的人物对象。offset是摄像机相对于人物的偏移量,你可以根据需要调整它。smoothSpeed控制摄像机移动时的平滑程度。

2. 人物走到地图边缘 摄像机停止平移

为了检测人物是否走到地图边缘,你可以在地图边缘放置一些碰撞体(如BoxCollider),并给它们一个共同的父对象,然后将这个父对象的Transform组件赋值给CameraFollow脚本中的mapBoundary变量。

CameraFollow.cs(扩展)

// ...之前的代码

public Transform mapBoundary; // 地图边界的父对象Transform

void LateUpdate()
{
    // ...之前的代码

    // 检查摄像机是否超出地图边界
    Vector3 desiredPosition = target.position + offset;
    if (desiredPosition.x < mapBoundary.position.x + mapBoundaryBoundaryOffset.x)
    {
        desiredPosition.x = mapBoundary.position.x + mapBoundaryBoundaryOffset.x;
        offset.x = desiredPosition.x - target.position.x;
    }
    else if (desiredPosition.x > mapBoundary.position.x + mapBoundary.localScale.x - mapBoundaryBoundaryOffset.x)
    {
        desiredPosition.x = mapBoundary.position.x + mapBoundary.localScale.x - mapBoundaryBoundaryOffset.x;
        offset.x = desiredPosition.x - target.position.x;
    }

    // 对y和z轴进行相同的处理
    // ...

    // 平滑地移动到那个位置(这部分代码与之前相同)
    Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
    transform.position = smoothedPosition;

    // 让摄像机始终看向人物(这部分代码与之前相同)
    transform.LookAt(target);
}

public Vector3 mapBoundaryBoundaryOffset = new Vector3(1, 1, 1); // 用于调整边界检测的灵敏度

在这个扩展中,我添加了mapBoundary变量来存储地图边界的父对象Transform。我还添加了mapBoundaryBoundaryOffset变量来允许你调整边界检测的灵敏度。现在,当人物走到地图边缘时,摄像机将停止平移。

3. 手指长按屏幕 摄像机平移

为了通过触摸控制摄像机平移,你需要另一个脚本。

CameraTouchControl.cs

using UnityEngine;

public class CameraTouchControl : MonoBehaviour
{
    private Vector3 touchOrigin = -Vector3.one; // 用于存储触摸开始的位置
    public float panSpeed = 0.5f; // 摄像机平移的速度

    void Update()
    {
        // 检查是否有触摸输入
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            // 当触摸开始时,记录触摸位置
            if (touch.phase == TouchPhase.Began)
            {
                touchOrigin = touch.position;
                return;
            }

            // 当触摸移动时,移动摄像机
            if (touch.phase == TouchPhase.Moved)
            {
                Vector3 touchEnd = touch.position;
                float x = touchEnd.x - touchOrigin.x;
                float y = touchEnd.y - touchOrigin.y;

                touchOrigin = touchEnd;

                // 根据触摸移动的方向和距离移动摄像机
                Vector3 move = new Vector3(x, 0, y) * panSpeed * Time.deltaTime;
                transform.Translate(-move, Space.World);
            }
        }
    }
}

在这个脚本中,panSpeed控制摄像机平移的速度。当用户在屏幕上触摸并移动时,摄像机将根据触摸移动的方向和距离进行平移。

现在,你应该有了实现所需功能的完整代码。将这些脚本附加到相应的对象上,并调整变量以适应你的游戏。

标签:平移,desiredPosition,Vector3,摄像机,Unity,position,public,mapBoundary
From: https://blog.csdn.net/weixin_42069404/article/details/140782284

相关文章

  • unity报错CommandWithNoStdoutInvokationFailure: Unable to start ADB server.
    这个错误提示表明Unity无法启动ADB(AndroidDebugBridge)服务器,这通常是因为AndroidSDK没有安装或者配置不正确。以下是一些解决这个问题的步骤:确认AndroidSDK的安装:确保你已经安装了AndroidSDK。可以通过AndroidStudio来安装SDK,或者从Android开发者网站下载。配置U......
  • Unity环境渲染与反射探针的深入探索
    目录环境渲染基础光源设置材质与光照贴图反射探针(ReflectionProbes)详解反射探针的创建与配置材质中的反射探针设置实践案例实践案例:室内场景中的反射效果场景设置反射探针配置Unity代码示例(非直接配置反射探针)反射探针的高级使用1.反射探针的烘焙2.反射探针的......
  • unity2D游戏开发16弹弓动画
    清理动画器选中PlayerObject,打开Animator,删除原来的四个状态右键选择CreateState|fromNewBlendTree;冲命名为WalkTree双击WalkTree查看BlendTreeGraph设置属性为2DSimpleDirectional,再点击加号选择AddMotionField添加四个,如图点击BaseLayer......
  • Unity数据持久化——序列化/二进制/Json/PlayerPrefs
    序列化序列化是指把对象转换为字节序列的过程,而反序列化是指将字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。在Unity中保存和加载、prefab、Scene、Inspector窗口、实例化预制体等都使用了序列化和反序列化。下面是一个序列化和反序列化的例子......
  • unity游戏源码和配套教程:三维的美好场景,完全免费和开源,教程完整详细,适合初学者入门
    源码(含配套教程)在夸克网盘(完全免费,完全开源,完整详细):夸克网盘分享夸克网盘是夸克推出的一款云服务产品,功能包括云存储、高清看剧、文件在线解压、PDF一键转换等。通过夸克网盘可随时随地管理和使用照片、文档、手机资料,目前支持Android、iOS、PC、iPad。https://pan.quark.cn/s/......
  • Unity GameObject学习笔记
    GameObject成员变量GameObject静态方法//准备用来克隆的对象//1.直接是场景上的某个对象//2.可以是一个预制体对象publicGameObjectMyobj;#region知识点二GameObject中的静态方法创建自带几何体只要得到了一个GameObject对象我就......
  • unity2D游戏开发11游戏背包开发
    背包存放游戏物品的地方在Hiearchy右键UI|Canvas,删除EventSystem,将Canvas重命名为InventoryObject设置属性右键InventoryObject,选择CreateEmpty,重命名为InventoryBackgroun,添加HorizontalLayoutGroup,HorizntalLayoutGroup将自动排列所有子对象,使他们水平......
  • 【Unity插件】Editor Console Pro:提升开发效率的神器
    在Unity开发过程中,控制台(Console)是我们排查错误、获取信息的重要窗口。而EditorConsolePro则是Unity编辑器控制台的强大替代品,为Unity的控制台带来了更多实用的功能和改进,极大地提升了开发效率。一、EditorConsolePro简介EditorConsolePro是一款在Unity......
  • Unity Shader 变体优化:提升性能的关键技巧
    在Unity开发中,Shader变体的管理和优化是提升游戏性能的重要环节。不合理的Shader变体可能导致性能下降、内存占用增加以及构建时间延长等问题。本文将深入探讨UnityShader变体优化的方法和技巧。一、理解Shader变体Shader变体是指通过不同的编译条件(如#pragma......
  • Unity Shader 变体优化案例
    以下是一些UnityShader变体优化的实践案例:案例一:材质纹理切换原始实现:#ifUSE_TEXTURE1sampler2Dtex1;#elsesampler2Dtex2;#endifvoidmain(){#ifUSE_TEXTURE1color=tex2D(tex1,uv);#elsecolor=tex2D(tex2,uv);......