简单的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 小时前
4.5 顶点和片元
unity
在路上看风景1 天前
31. Unity 异步加载的底层细节
unity
天人合一peng1 天前
Unity中做表头时像work中整个调整宽窄
unity
小李也疯狂2 天前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的2 天前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y2 天前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤2 天前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
我的offer在哪里2 天前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
泡泡茶壶ᐇ2 天前
Unity游戏开发入门指南:从零开始理解游戏引擎核心概念
unity·游戏引擎