前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3d 制作一个立体旋转相册

Unity3d 制作一个立体旋转相册

作者头像
林德熙
发布2020-05-09 15:57:25
1.6K0
发布2020-05-09 15:57:25
举报
文章被收录于专栏:林德熙的博客林德熙的博客

大概效果就是在空间放一个立方体,然后给他贴图,点击鼠标的时候切换贴图内容。按下方向键旋转立方体

效果请看下图

本来是打算做个 Gif 动态图给大家看效果的,但是图片太大了 25M 我就不敢放出来了,在文章最后放了运行效果的链接

这个效果很简单,做法可以分为三个部分,第一个部分是模型部分,或者说 Scane 里面的内容。第二个部分就是读取本地图片作为贴图部分。第三个部分就是立体旋转部分

模型

只需要右击新建一个立方体放在相机可以看到的部分就可以

将磁盘的随意一张图片拖到资源里面,如我这里放的 s1 这张图片

接着选择 Cube 将图片 s1 拖放到 Cube 上,大概的效果就是在 Cube 的 Mesh Renderer 的材料的元素0显示了拖进去 s1 元素,同时可以看到 Cube 被 S1 贴图

切换贴图内容

新建一个 C# 脚本,命名是 MeshPainter 将在这里读取本地的图片,按照文件夹的图片,一张张播放

在 C# 中获取一个文件夹里面的所有文件的方法很简单,只需要使用 Directory.GetFiles 方法。在脚本的 Start 方法里面尝试获取图片,获取之后存放在本地的字段

    void Start()
    {
        var imageList = Directory.GetFiles(@"D:\lindexi\image");
        foreach (var temp in imageList)
        {
            Debug.Log(temp);
        }

        _imageList = imageList;
    }

    private string[] _imageList;

在 Update 方法判断用户是否有输入,通过判断鼠标的方法,在上一篇博客 Unity3d 连续按键处理和单次按键处理 告诉小伙伴可以通过 Fire1 判断鼠标左键

    void Update()
    {
        // 鼠标左键
        if (Input.GetButtonDown("Fire1"))
        {
           
        }
    }

新建一个字段用来存放当前是第几次点击,对应文件夹的文件

    void Update()
    {
        // 鼠标左键
        if (Input.GetButtonDown("Fire1"))
        {
            var path = _imageList[_count];
            _count++;

            if (_count == _imageList.Length)
            {
                _count = 0;
            }
        }
    }

    private int _count;

此时就可以拿到本地文件 path 了,接下来就是通过创建 Texture2D 的方式进行贴图

创建 Texture2D 需要给定大小,这个大小建议是根据模型来,也就是需要贴到那个模型上

Texture2D texture = new Texture2D(1920, 1080);

通过 LoadImage 方法可以加载图片,参数是一个 byte 数组,在 C# 里面读取文件作为 byte 数组的方法可以使用 System.IO.File.ReadAllBytes 方法

 texture.LoadImage(File.ReadAllBytes(path));

创建了 Texture2D 可以将他贴到 mainTexture 作为贴图

            var meshRender = gameObject.GetComponent<MeshRenderer>();

            Texture2D texture = new Texture2D(1920, 1080);
            texture.LoadImage(File.ReadAllBytes(path));
            
            meshRender.material.mainTexture = texture;

贴图的代码请看下面

    void Update()
    {
        // 鼠标左键
        if (Input.GetButtonDown("Fire1"))
        {
            var meshRender = gameObject.GetComponent<MeshRenderer>();
            var path = _imageList[_count];
            _count++;

            if (_count == _imageList.Length)
            {
                _count = 0;
            }

            Texture2D texture = new Texture2D(1920, 1080);
            texture.LoadImage(File.ReadAllBytes(path));
            
            meshRender.material.mainTexture = texture;
        }
    }

    private int _count;

旋转

新建一个脚本 Move.cs 用来做旋转

通过下面代码可以了解用户的按键,将这个值作为旋转

        var horizontalAsixName = "Horizontal";
        var horizontal = Input.GetAxis(horizontalAsixName);

        var verticalAsixName = "Vertical";
        var vertical = Input.GetAxis(verticalAsixName);

旋转的方法请看下面

        transform.Rotate(new Vector3(horizontal, vertical) * Time.deltaTime * Speed, Space.World);

所有代码请看

    void Update()
    {
        var horizontalAsixName = "Horizontal";
        var horizontal = Input.GetAxis(horizontalAsixName);

        var verticalAsixName = "Vertical";
        var vertical = Input.GetAxis(verticalAsixName);

        transform.Rotate(new Vector3(horizontal, vertical) * Time.deltaTime * Speed, Space.World);
    }

将刚才创建的两个脚本拖放到 Cube 上,然后尝试运行就可以

本文代码放在 github 欢迎小伙伴访问

运行效果请点击此链接 https://r302.cc/JGLjDZ


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/Unity3d-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E7%AB%8B%E4%BD%93%E6%97%8B%E8%BD%AC%E7%9B%B8%E5%86%8C.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模型
  • 切换贴图内容
  • 旋转
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档