Unity를 사용하여 스크립트에서 UV 작업
개시하다
예를 들어 캐릭터의 표정을 문양으로 붙여 UV 좌표를 변경해 표정을 바꾸는 경우도 있다고 본다.요즘은 이런 것에 주력하고 있지만 제가 겪는 문제들을 소개해 드리겠습니다.
1. Born에 합류한 캐릭터는 SkinneedMeshRenderer의 sharedMesh를 사용한다.
2. 실례화된 sharedMesh를 사용합니다.
이 두 가지.
MeshRenderer가 첨부된 객체인 경우
예를 들어 Unity 편집기에서 큐브와 같은 원본 버전을 만들면 메시 파일러와 메시 렌더러가 자동으로 첨부됩니다
이제 meshFilter 어셈블리에서 mesh를 가져올 수 있습니다.mesh 클래스의 구성원은 UV를 Vector2의 배열로 정의하기 때문에 그것을 조작하면 됩니다.
meshUV.cs一部抜粋
private Mesh myM;
void Start () {
myMesh = gameObject.GetComponent<MeshFilter>().mesh;
}
void Update(){
Vector2[] nUV = myMesh.uv;
for (int i=0; i < myMesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
myMesh.uv = nUV;
}
이렇게 붙이면 무늬가 변한다.
SkinneedMeshRenderer가 첨부된 객체일 경우
대부분의 경우 캐릭터로 사용하고자 하는 대상은 가로줄로 이동한다.예를 들어 캐릭터의 FBX 파일을 가져오면 그 그물 모양의 대상을 보면 아까의 MeshFilter와 MeshRenderer가 보이지 않는다
따라서 MeshFilter의 Mesh에서 아까처럼 UV를 조작할 수 없습니다.
대신 bon에 의해 변형된 캐릭터에 이 스킨네드 메시 렌더가 사용됐다.Skinneed Mesh Renderer에서 Shared Mesh를 얻을 수 있습니다. 이 Shared Mesh의 구성원은 UV가 있기 때문에 조작합니다.
meshUV.cs private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = myMesh.uv;
for (int i = 0; i < myMesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
myMesh.uv = nUV;
}
하지만 이번에는 이렇게 UV를 조작하면 문제가 발생할 수 있다.
UV를 조작할 수 있지만 스크립트를 실행한 후 UV를 변경하면 실행을 중지해도 원래 상태로 돌아가지 않습니다.방금 큐브가 멈춘 후 다시 실행하면 스크립트에 따른 UV 변경 사항이 재설정되지만 Skinneed Mesh Renderer의 경우에는 안 됩니다.
실례화된 데이터를 사용하여 원시 데이터를 조작하지 않고 미리 저장하다
따라서 방금 전의 스크립트를 조금 수정합니다.
meshUV.cs private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
Imesh = Instantiate(myMesh);
gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh = Imesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = Imesh.uv;
for (int i = 0; i < Imesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
Imesh.uv = nUV;
}
Instantiate()를 사용하여 sharedMesh를 인스턴스화하여 sharedMesh의 참조 위치를 인스턴스로 변경합니다.
이렇게 하면 인스턴스에 이러한 문제가 발생하지 않으며 실행이 중지되면 UV 변경 사항이 재설정됩니다.
주제 밖의 말을 하면 UV뿐만 아니라 정점도 마음대로 놀 수 있다.
또한 UV 변경에 국한되지 않고 다양한 장소에 적용할 수 있다.
Reference
이 문제에 관하여(Unity를 사용하여 스크립트에서 UV 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Chocogake_sanQ/items/2ddc056500a3d87e512c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
예를 들어 Unity 편집기에서 큐브와 같은 원본 버전을 만들면 메시 파일러와 메시 렌더러가 자동으로 첨부됩니다
이제 meshFilter 어셈블리에서 mesh를 가져올 수 있습니다.mesh 클래스의 구성원은 UV를 Vector2의 배열로 정의하기 때문에 그것을 조작하면 됩니다.
meshUV.cs
一部抜粋
private Mesh myM;
void Start () {
myMesh = gameObject.GetComponent<MeshFilter>().mesh;
}
void Update(){
Vector2[] nUV = myMesh.uv;
for (int i=0; i < myMesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
myMesh.uv = nUV;
}
이렇게 붙이면 무늬가 변한다.
SkinneedMeshRenderer가 첨부된 객체일 경우
대부분의 경우 캐릭터로 사용하고자 하는 대상은 가로줄로 이동한다.예를 들어 캐릭터의 FBX 파일을 가져오면 그 그물 모양의 대상을 보면 아까의 MeshFilter와 MeshRenderer가 보이지 않는다
따라서 MeshFilter의 Mesh에서 아까처럼 UV를 조작할 수 없습니다.
대신 bon에 의해 변형된 캐릭터에 이 스킨네드 메시 렌더가 사용됐다.Skinneed Mesh Renderer에서 Shared Mesh를 얻을 수 있습니다. 이 Shared Mesh의 구성원은 UV가 있기 때문에 조작합니다.
meshUV.cs private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = myMesh.uv;
for (int i = 0; i < myMesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
myMesh.uv = nUV;
}
하지만 이번에는 이렇게 UV를 조작하면 문제가 발생할 수 있다.
UV를 조작할 수 있지만 스크립트를 실행한 후 UV를 변경하면 실행을 중지해도 원래 상태로 돌아가지 않습니다.방금 큐브가 멈춘 후 다시 실행하면 스크립트에 따른 UV 변경 사항이 재설정되지만 Skinneed Mesh Renderer의 경우에는 안 됩니다.
실례화된 데이터를 사용하여 원시 데이터를 조작하지 않고 미리 저장하다
따라서 방금 전의 스크립트를 조금 수정합니다.
meshUV.cs private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
Imesh = Instantiate(myMesh);
gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh = Imesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = Imesh.uv;
for (int i = 0; i < Imesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
Imesh.uv = nUV;
}
Instantiate()를 사용하여 sharedMesh를 인스턴스화하여 sharedMesh의 참조 위치를 인스턴스로 변경합니다.
이렇게 하면 인스턴스에 이러한 문제가 발생하지 않으며 실행이 중지되면 UV 변경 사항이 재설정됩니다.
주제 밖의 말을 하면 UV뿐만 아니라 정점도 마음대로 놀 수 있다.
또한 UV 변경에 국한되지 않고 다양한 장소에 적용할 수 있다.
Reference
이 문제에 관하여(Unity를 사용하여 스크립트에서 UV 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Chocogake_sanQ/items/2ddc056500a3d87e512c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = myMesh.uv;
for (int i = 0; i < myMesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
myMesh.uv = nUV;
}
따라서 방금 전의 스크립트를 조금 수정합니다.
meshUV.cs
private Mesh myM;
private Mesh Imesh;
// Use this for initialization
void Start()
{
myMesh = gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh;
Imesh = Instantiate(myMesh);
gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh = Imesh;
}
// Update is called once per frame
void Update()
{
Vector2[] nUV = Imesh.uv;
for (int i = 0; i < Imesh.uv.Length; i++)
{
nUV[i].x *= 0.99f;
nUV[i].y *= 0.99f;
}
Imesh.uv = nUV;
}
Instantiate()를 사용하여 sharedMesh를 인스턴스화하여 sharedMesh의 참조 위치를 인스턴스로 변경합니다.이렇게 하면 인스턴스에 이러한 문제가 발생하지 않으며 실행이 중지되면 UV 변경 사항이 재설정됩니다.
주제 밖의 말을 하면 UV뿐만 아니라 정점도 마음대로 놀 수 있다.
또한 UV 변경에 국한되지 않고 다양한 장소에 적용할 수 있다.
Reference
이 문제에 관하여(Unity를 사용하여 스크립트에서 UV 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Chocogake_sanQ/items/2ddc056500a3d87e512c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)