unity 拖拽 uv

标签: unity uv 拖拽
14人阅读 评论(0) 收藏 举报
分类:

部分函数在https://blog.csdn.net/qq_17813937/article/details/79950879


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class PlaneUVOperation : MonoBehaviour, IBeginDragHandler, IDragHandler
{
    private float currentAngle = 0;
    private Mesh mesh;
    private Material material;
    private Vector2 size;

    private Vector4 offset;
    private Vector2 actualOffset;
    private Vector2 scale;
    private Vector2 result;
    private Vector3 oldPos;
    private Vector3 newPos;

    private Matrix4x4 uvRotate;
    private Matrix4x4 matRotate;
    private Vector2 textureSize;
    
    private void Awake()
    {
        mesh = GetComponent<MeshFilter>().mesh;
        material = GetComponent<MeshRenderer>().material;
        var texture = material.GetTexture("_MainTex");
        textureSize = new Vector2(texture.width,texture.height);
        scale = material.GetTextureScale("_MainTex");

        #region 计算Plane实际大小
        var boundsSize = mesh.bounds.size;
        size = new Vector2(boundsSize.x,boundsSize.z);
        size.Scale(new Vector2(transform.localScale.x,transform.localScale.z));
        #endregion

    }

    public void RotateUV(float angle)
    {
        currentAngle += angle;
        mesh.RotateUV(angle);
    }

    public void Scale(Vector2 size)
    {
        scale = size;
        material.SetTextureScale("_MainTex", size);
    }

    public void Tiling(int count)
    {
        material.SetTextureScale("_MainTex", new Vector2(count,count));
    }

    public void SetNativeSize()
    {
        material.SetTextureScale("_MainTex", new Vector2(size.x / textureSize.x, size.y / textureSize.y));
    }

    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
    {
        matRotate = Matrix4x4.Rotate(transform.localRotation).transpose;
        oldPos = eventData.pointerCurrentRaycast.worldPosition;
        uvRotate = uvRotate.Rotate2D(currentAngle);
    }
    
    void IDragHandler.OnDrag(PointerEventData eventData)
    {
        if (eventData.pointerEnter == null) return;

        newPos = eventData.pointerCurrentRaycast.worldPosition;

        // 旋转为欧拉角 (0,0,0) 计算偏移
        offset += (matRotate * newPos) - (matRotate * oldPos);
        //设置偏移
        actualOffset.Set(offset.x, offset.z);

        //旋转uv
        actualOffset = uvRotate * actualOffset;
        
        //平移
        result.Set(actualOffset.x * scale.x / size.x, actualOffset.y * scale.y / size.y);

        material.SetTextureOffset("_MainTex", result);
        oldPos = newPos;
    }
}

查看评论

【Unity Shaders】学习笔记之通过修改UV坐标实现纹理贴图的滚动(八)

一、简介   纹理贴图可以使我们的着色器更有生命力,而且可以快速地实现非常逼真的效果。然而略显遗憾的是,你需要小心翼翼地控制用于着色器地纹理贴图的数目,因为如果添加的纹理图片过多,会非常影响游戏的性...
  • liulongling
  • liulongling
  • 2016-07-03 15:27:22
  • 3751

Unity Shader编程(3)uv操作

Unity Shader编程(3)uv操作 1、shader示意图 2、uv常用操作 ①缩放 Shader "Custom/NewShader" { Properties { _...
  • husheng0
  • husheng0
  • 2016-03-03 13:04:54
  • 3619

Unity简单修改UV的动画脚本

using UnityEngine; using System.Collections; public class UVScroll : MonoBehaviour { public flo...
  • qq_20849387
  • qq_20849387
  • 2017-05-05 18:33:46
  • 979

unity3d对材质球的uv进行平移,缩放和旋转

平移和缩放比较好解决: 平移:  v2 = new Vector2(0f,v);
  • u010851844
  • u010851844
  • 2014-09-26 14:47:17
  • 2752

unity3d游戏开发之UV贴图教程

一、理解UV贴图UVs是驻留在多边形网格顶点上的两维纹理坐标点,它们定义了一个两维纹理坐标系统,称为UV纹理空间,这个空间用U和V两个字母定义坐标轴。用于确定如何将一个纹理图像放置在三维的模型表面。 ...
  • ldghd
  • ldghd
  • 2015-12-31 14:32:07
  • 7245

【猫猫的Unity Shader之旅】之UV动画

UV动画是一种常用的渲染技巧,经常用来描述水的流动、霓虹灯的闪烁等。实现的原理就是动态修改贴图的UV坐标,使物体表面产生变化。贴图坐标  说到UV动画就不得不多说一点贴图了。我们知道,贴图是覆盖在模型...
  • dbtxdxy
  • dbtxdxy
  • 2015-03-30 00:13:57
  • 6882

Unity3d Shader UV移动

本文使用UV偏移,创建车道方向动画 原始素材 最终效果(带水平向移动)Unity3d纹理坐标 偏移:Offset(xo,yo),将原点偏移到(xo,yo)。 平铺:Tiling(xt,yt),...
  • MAOMAOXIAOHUO
  • MAOMAOXIAOHUO
  • 2016-04-03 22:18:37
  • 4143

Unity 通过 Secondary Maps + UV Set 动态修改UV

本问题是在开发ar 涂涂乐项目过程中碰到的(2017.03.15. 更新 (此解决方案有显示上的问题,现已用shader完美解决,请看后面17日更新的内容))本文的主题是:unity如何动态的修改单个...
  • puremilk684
  • puremilk684
  • 2017-03-14 17:22:30
  • 2187

unity中多套uv set理解和应用

unity中多套uv有很大用处,比如自带的物体box,sphere就自带两套uv 第一套是正常的,比如方块可以每个面是同一个uv, 但是第二套需要烘焙光照信息,所以默认是全展开,纹理看出来要小些 ...
  • shenmifangke
  • shenmifangke
  • 2016-05-19 10:52:24
  • 5532

unity基础开发----unity中的UV动画实现代码

在unity有时候需要使用UV动画,代码如下using UnityEngine; using System.Collections; public class UVAnimation : MonoB...
  • liang_704959721
  • liang_704959721
  • 2014-03-28 14:35:48
  • 2357
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 922
    排名: 5万+