在游戏内寻找模型上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;
}
}











网友评论