Mesh

作者: 杰少Q | 来源:发表于2023-05-16 10:50 被阅读0次

在游戏内寻找模型上Mesh的点的坐标

if (Input.GetMouseButton(0))

{

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit info;

if (Physics.Raycast(ray.origin, ray.direction, out info))

{

var meshFilter = info.transform.GetComponent();

if (meshFilter)

{

var sharedMesh = meshFilter.sharedMesh;

if (!sharedMesh) return;

var tempMesh = new Mesh();

tempMesh.bounds = sharedMesh.bounds;

tempMesh.vertices = sharedMesh.vertices;

tempMesh.triangles = sharedMesh.triangles;

// tempMesh.tangents = sharedMesh.tangents;

tempMesh.uv = sharedMesh.uv;

MeshDeformer.Deformer(ref tempMesh, info.transform, info.point, -info.normal * 0.1f, 0.1f, 0.01f, 1f, 0.1f);

}

}

}

Mesh变形,更改Mesh

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using UnityEngine;

public static class MeshDeformer

{

///

    /// 返回更改后的Mesh

///

///

///

///

    /// <param name="dir">弯曲方向

    /// <param name="radius">影响半径

    /// <param name="stepradius">半径步长

    /// <param name="intensity">强度

    /// <param name="stepintensity">强度步长

    public static void Deformer(ref Mesh mesh, Transform trans, Vector3 point, Vector3 dir, float radius,float stepradius,float intensity,float stepintensity)

{

float min=float.MaxValue;

        List<Vector3> ver= mesh.vertices.ToList();

        for (int i= 0; i< ver.Count; i++)

{

var v= trans.TransformPoint(ver[i]);

            var distance= Vector3.Distance(point, v);

            var s= intensity;

            for (float r= 0; r< radius; r+=stepradius)

{

if (distance< r)

{

//ver[i] = trans.InverseTransformPoint(v + (dir*s));

                    Debug.Log(i);

                    break;

                }

s-= stepintensity;

            }

min= Mathf.Min(min, distance);

        }

mesh.RecalculateBounds();

        mesh.RecalculateNormals();

        mesh.SetVertices(ver);

        mesh.RecalculateTangents();

    }

}

Mesh

using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

[RequireComponent(typeof(MeshCollider))]

public class MeshUpdate :MonoBehaviour

{

private Mesh _mesh;

    [SerializeField]private Animator _animator;

  [SerializeField]private SkinnedMeshRenderer _renderer;

  private MeshCollider _meshCollider;

  [SerializeField]private float scale = .02f;

    public Transform player;

  private void Awake()

{

_renderer = GetComponent<SkinnedMeshRenderer>();

      _meshCollider = GetComponent<MeshCollider>();

      transform.localScale = Vector3.one*scale;

      _mesh = new Mesh();

      //在父物体上寻找

      Transform temp= this.transform;

      int findNum= 3;//寻找三次

      while (findNum> 0 && _animator == null && temp!=null)

{

temp= temp.parent;

        if(temp== null)

break;

        _animator = temp.GetComponent<Animator>();

        findNum--;

      }

if(_animator == null)

Debug.LogError("无法找到Animaor");

  }

private float startTime = 0;

  private float updateTime =0;

  private float targetAnimatorStateTime = 0;

  //当更新到最后一帧时,停止更新MeshCollider

  bool IsUpdateAnimaton()

{

//if (_animator == null) return true;

      //获取时间长度

      targetAnimatorStateTime = _animator.GetCurrentAnimatorStateInfo(0).length;

      if (updateTime - startTime > targetAnimatorStateTime)

{

return true;

      }

return false;

  }

private void Start()

{

_updateTime = 0;

      timer = 0.05f;

      startTime = updateTime = 0f;

      _isUpdateMashCollider = true;

  }

private float timer = 1f;

  private float _updateTime = 0;

  private bool _isUpdateMashCollider;

  private void LateUpdate()

{

updateTime += Time.deltaTime;

      if(!_isUpdateMashCollider)

return;

      //_isUpdateMashCollider = !IsUpdateAnimaton();//是否在更新

      _updateTime -= Time.deltaTime;

        transform.localScale = new Vector3((player.localScale.x + scale)/player.localScale.x, (player.localScale.y + scale)/ player.localScale.y, (player.localScale.z + scale)/ player.localScale.z);

        if (_updateTime <= 0)

{

_updateTime = timer;

            Debug.Log("Mesh更新");

        _renderer.BakeMesh(_mesh);//将快照存

        _meshCollider.sharedMesh = _mesh;

      }

}

}

更换Mesh

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class SkinMeshCollUpdate :MonoBehaviour

{

public SkinnedMeshRenderer meshRenderer;

    public MeshCollider meshColl;

    private Mesh _cachedMesh;

    private float _currTimes;

    private Transform player;

    float xP;

    private void Start()

{

meshRenderer = GetComponent<SkinnedMeshRenderer>();

        meshColl = GetComponent<MeshCollider>();

        _cachedMesh = new Mesh();

        player = transform.parent;

        meshRenderer.BakeMesh(_cachedMesh); //更新mesh

        meshColl.sharedMesh = _cachedMesh; //将新的mesh赋给meshcollider

    }

private void Update()

{

//_currTimes += Time.deltaTime;

//if (_currTimes >= 0.1f)

//{

//    _currTimes -= 0.1f;

        //    meshRenderer.BakeMesh(_cachedMesh); //更新mesh

        //    meshColl.sharedMesh = _cachedMesh; //将新的mesh赋给meshcollider

//    xP = player.transform.localScale.x;

//    transform.localScale = (1.0f / xP) * Vector3.one;

//}

        // meshRenderer.BakeMesh(_cachedMesh); //更新mesh

        // meshColl.sharedMesh = _cachedMesh; //将新的mesh赋给meshcollider

//xP = player.transform.localScale.x;

//transform.localScale = (1.0f / xP) * Vector3.one;

}

}

在游戏场景三点画Mesh

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Mesh : MonoBehaviour

{

private Vector3[] vertices;

    private int[] triangles;

    private int count= 0;

    private UnityEngine.Mesh _mesh;

    private List<Vector3> _list;

    void Start()

{

gameObject.AddComponent<MeshFilter>();

        gameObject.AddComponent<MeshRenderer>();

        _list=new List<Vector3>();

        _mesh= GetComponent<MeshFilter>().mesh;

        GetComponent<MeshRenderer>().material.color=Color.green;

        GetComponent<MeshRenderer>().material.shader=Shader.Find("Transparent/Diffuse");

        _mesh.Clear();

    }

// Update is called once per frame

    void Update()

{

if (Input.GetMouseButton(0))

{

count++;

            _list.Add(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,0.8f)));

        }

if (count>=3)

{

triangles=new int[3*(count-2)];

            vertices=new Vector3[count];

            for (int i= 0; i< count; i++)

{

vertices[i]= _list[i];

            }

}

int triangles_count= count- 2;

        for (int i= 0; i< triangles_count; i++)

{

triangles[3 * i]= 0;

            triangles[3 * i+1]= i+2;

            triangles[3 * i+2]= i+1;

        }

_mesh.vertices= vertices;

        _mesh.triangles= triangles;

    }

}

相关文章

网友评论

      本文标题:Mesh

      本文链接:https://www.haomeiwen.com/subject/keqpfrtx.html