简单的Unity漫游场景搭建

unity漫游场景搭建

首先在场景中创建中立方体(墙),平面,胶囊(玩家),并缩放大小拖动到合适的位置。

导入自己需要的艺术图片并设置图片为2D和UI模式。

创建材质球,将导入的图片拖动到AIbedo上(反射率)。

再将材质球拖入到墙壁的Quad(平面)上,艺术照片被贴到了墙面上。

刚刚我们放置的胶囊作为玩家,需在里面放置一台摄像机以使得画面跟随玩家视角移动。

在场景中创建画布Canvas,在画布下创建两个按钮。

打开2D模式,查看按钮位置。

设置画布大小,调整为1920,1080。

重新设置一下按钮的大小。

创建以下代码挂载到player使得player可以用W/A/S/D进行移动控制。

复制代码
using UnityEngine;

public class SimplePlayerController : MonoBehaviour
{
    // 移动速度
    public float moveSpeed = 5f;
    // 每次旋转的角度(30度)
    public float rotationAmount = 30f;
    // 旋转速度(平滑过渡)
    public float rotationSpeed = 5f;

    // 是否正在旋转
    private bool isRotating = false;
    // 目标旋转角度
    private float targetRotation;

    void Update()
    {
        // 处理移动
        float horizontal = Input.GetAxis("Horizontal"); // A/D
        float vertical = Input.GetAxis("Vertical");     // W/S
        Vector3 direction = transform.right * horizontal + transform.forward * vertical;
        transform.position += direction * moveSpeed * Time.deltaTime;

        // 如果正在旋转,平滑过渡
        if (isRotating)
        {
            float currentRotation = Mathf.LerpAngle(transform.eulerAngles.y, targetRotation, Time.deltaTime * rotationSpeed);
            transform.rotation = Quaternion.Euler(0, currentRotation, 0);

            // 如果旋转接近目标角度,停止旋转
            if (Mathf.Abs(transform.eulerAngles.y - targetRotation) < 0.1f)
            {
                isRotating = false;
            }
        }
    }

    // 按下左按钮旋转30度
    public void RotateLeft()
    {
        // 更新目标旋转角度
        targetRotation = transform.eulerAngles.y - rotationAmount;
        isRotating = true;
    }

    // 按下右按钮旋转30度
    public void RotateRight()
    {
        // 更新目标旋转角度
        targetRotation = transform.eulerAngles.y + rotationAmount;
        isRotating = true;
    }
}

代码中的这些参数设置的是初始默认值,我们可以直接在Inspect组件处进行修改。

注意调节主摄像机使得游戏界面显示合适。

还可以通过打开 Unity 编辑器,进入 Edit > Project Settings > Input Manager来设置。

将player拖动到Button的On click()上,并设置RotateLeft()属性。同理右边按钮也一样。这样我们在player挂载的代码可以生效,启动游戏后可以进行旋转画面。

接下来设置点击艺术画,弹出介绍。

重新创建一个画布,其下再创建一个Image和Button。

将介绍的图像拖动到Image的源图像下。

创建两个代码

第一个代码的作用是当点击艺术画时,弹出详细介绍。

PaintingInteraction代码:

复制代码
using UnityEngine;

public class PaintingInteraction : MonoBehaviour
{
    public GameObject artInfoPanel; // 用来存放 UI 面板

    void Start()
    {
        // 确保游戏开始时 UI 面板是隐藏的
        if (artInfoPanel != null)
        {
            artInfoPanel.SetActive(false);
        }
    }

    void OnMouseDown()
    {
        // 调试信息
        Debug.Log("浮世绘被点击了!");

        // 如果 UI 面板被关闭,则打开它
        if (artInfoPanel != null && !artInfoPanel.activeSelf)
        {
            artInfoPanel.SetActive(true);
        }
    }
}

将该代码拖动到墙面画布Quad上。

再将Canvas拖动到脚本中。

这样,当我们点击画作时,就会出现刚刚创建的画布(换成解说的图片)。

第二个代码的作用是关闭艺术画的详细介绍。

ArtInfoPanelController代码:

复制代码
using UnityEngine;

public class ArtInfoPanelController : MonoBehaviour
{
    public GameObject artInfoPanel;

    public void ClosePanel()
    {
        if (artInfoPanel != null)
        {
            Debug.Log("关闭面板");
            artInfoPanel.SetActive(false); // 隐藏面板
        }
        else
        {
            Debug.LogWarning("ArtInfoPanel 未正确分配!");
        }
    }
}

将关闭的代码脚本挂载到Image上,

再将Image拖动到button上。

多复制几份同样的场景替换不同的艺术画就可以搭建一个虚拟美术馆啦。

相关推荐
不吃凉粉19 小时前
Unity与AS通信
unity·游戏引擎
两水先木示1 天前
【Unity】探索小地图迷雾散开Shader效果(基础版)
unity·游戏引擎
WarrenMondeville2 天前
AI复刻街头霸王到 Unity
unity·游戏引擎
玖玥拾2 天前
Lua 基础语法(六)xLua Lua 调用 C# 交互
开发语言·unity·c#·lua
xcLeigh2 天前
Unity基础:MonoBehaviour的生命周期——Awake、OnEnable、Start、Update执行顺序
unity·游戏引擎
qq_213157892 天前
其域lcc2丢失部分lod/远处显示空洞的解决方式
unity·lcc2
辻弋2012 天前
自动检测硬件生成驱动清单、实时监控FPS、120秒性能记录——30+项优化模块化开关,所有改动可精确复原
服务器·windows·游戏引擎·电脑·开源软件
点心的游戏开发世界3 天前
GDScript 入门笔记:目录
开发语言·笔记·游戏引擎·godot
XR技术研习社3 天前
关于 PICO 串流测试中报错 IndexOutOfRangeException: renderPassIndex 的两个排障方法
unity·ar·xr·vr
想做后端的前端3 天前
Unity · 性能优化:内存管理完全指南:从托管堆到跨桥开销
unity·性能优化·游戏引擎