ã²ãŒã éçºã®ãã©ãããã©ãŒã ãšããŠã®Unityã®å©ç¹ã®1ã€ã¯ã匷åãª3Dãšã³ãžã³ã§ãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã3Dãªããžã§ã¯ããšã¡ãã·ã¥æäœã®äžçã«ã€ããŠåŠã³ãŸãã
ä»®æ³çŸå®ããã³æ¡åŒµçŸå®ïŒVR / ARïŒãã¯ãããžãŒã®æé·ã«ãããã»ãšãã©ã®éçºè
ã¯è€éãª3Dã°ã©ãã£ãã¯ã¹ã®æŠå¿µã«çŽé¢ããŠããŸãã ãã®ãã¥ãŒããªã¢ã«ãåºçºç¹ã«ããŸãããã å¿é
ããªãã§ãã ãããè€éãª3Dæ°åŠã¯ãããŸãã-ããŒãããããŒã€ã³ã°ãç¢å°ãããããã®é¢çœããã®ã ãããããŸãïŒ
泚ïŒãã®ãã¥ãŒããªã¢ã«ã¯ãUnity IDEã«ç²ŸéããŠãããCïŒã§ããã°ã©ãã³ã°ã®çµéšããããŠãŒã¶ãŒã察象ãšããŠããŸãã ãã®ãããªç¥èããªãå Žåã¯ããŸãã Unity UIã® æŠèŠãšUnity Scriptingã®æŠèŠã®ãã¥ãŒããªã¢ã«ãåŠç¿ããŠãã ããã
2017.3.1以éã®UnityããŒãžã§ã³ãå¿
èŠã§ãã Unityã®ææ°ããŒãžã§ã³ã¯ããããããŠã³ããŒãã§ããŸã ã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãã«ã¹ã¿ã ãšãã£ã¿ãŒã䜿çšããŸããUnityãšãã£ã¿ãŒã®æ¡åŒµãã¥ãŒããªã¢ã«ããããããã«ã€ããŠè©³ããåŠã¶ããšãã§ããŸãã
ä»äºãå§ãã
éå§ããã«ã¯ã3Dã°ã©ãã£ãã¯ã¹ã®åºæ¬çšèªãçè§£ããŠãã ãããããã«ããããã¥ãŒããªã¢ã«ãããããçè§£ã§ããŸãã
3Dã°ã©ãã£ãã¯ã¹ã®åºæ¬çãªæè¡çšèªïŒ
- é ç¹ ïŒåé ç¹ã¯3D空éã®ç¹ã§ãã
- Mesh ïŒã¢ãã«ã®ãã¹ãŠã®é ç¹ããšããžãäžè§åœ¢ãæ³ç·ãUVããŒã¿ãå«ãŸããŸãã
- ã¡ãã·ã¥ãã£ã«ã¿ãŒ ïŒã¢ãã«ã¡ãã·ã¥ããŒã¿ãä¿åããŸãã
- Mesh Renderer ïŒã·ãŒã³å
ã®ã¡ãã·ã¥ããŒã¿ãã¬ã³ããªã³ã°ããŸãã
- æ³ç· ïŒé ç¹ãŸãã¯ãµãŒãã§ã¹ã®ãã¯ãã«ã ã¡ãã·ã¥ã®è¡šé¢ã«åçŽã«å€åŽã«åããããŸãã
- ç·/ãšããž ïŒé ç¹ãäºãã«æ¥ç¶ããé衚瀺ã®ç·ã
- äžè§åœ¢ ïŒ3ã€ã®ããŒã¯ãæ¥ç¶ããŠåœ¢æãããŸãã
- UVããã ïŒãªããžã§ã¯ãã«ãããªã¢ã«ãã¢ã¿ãããããã®ãã¯ã¹ãã£ãšè²ãäœæããŸãã
3Dãªããžã§ã¯ãã®æ§é ã¯ããã®ã¡ãã·ã¥ããå§ãŸããŸãã ãã®ã¡ãã·ã¥ã®äœæã¯äžéšããå§ãŸããŸãã ãããã®é ç¹ãçµã¶ç®ã«èŠããªãç·ã¯ããªããžã§ã¯ãã®åºæ¬çãªåœ¢ç¶ãå®çŸ©ããäžè§åœ¢ã圢æããŸãã
次ã«ãæ³ç·ãšUVããŒã¿ãã·ã§ãŒãã£ã³ã°ãè²ãããã³ãã¯ã¹ãã£ãæå®ããŸãã ã¡ãã·ã¥ããŒã¿ã¯ã¡ãã·ã¥ãã£ã«ã¿ãŒã«ä¿åãããã¡ãã·ã¥ã¬ã³ãã©ãŒã¯ãã®ããŒã¿ã䜿çšããŠã·ãŒã³ã«ãªããžã§ã¯ããæç»ããŸãã
ã€ãŸãã3Dã¢ãã«ãäœæããããã®æ¬äŒŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
- ãmyMeshããšããæ°ããã¡ãã·ã¥ãäœæããŸãã
- é ç¹ãšäžè§åœ¢myMeshã®ããããã£ã«ããŒã¿ã远å ããŸãã
- ãmyMeshFilterããšããæ°ããã¡ãã·ã¥ãã£ã«ã¿ãŒãäœæããŸãã
- ã¡ãã·ã¥ããããã£myMeshFilterãmyMeshã«èšå®ããŸãã
åºæ¬ãçè§£ããåŸã
ãããžã§ã¯ããããŠã³ããŒããããã¡ã€ã«ãè§£åãããã©ãããããžã§ã¯ããUnityã§å®è¡ããŸãã
ãããžã§ã¯ããŠã£ã³ããŠã§ãã©ã«ããŒæ§é ã確èªããŸãã
ãã©ã«ããŒã®èª¬æïŒ
- Prefabs ïŒã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«3Dã¡ãã·ã¥ãä¿åããããã«äœ¿çšãããSphereãã¬ãããå«ãŸããŠããŸãã
- ã·ãŒã³ ïŒãã®ãã¥ãŒããªã¢ã«ã§äœ¿çšãã3ã€ã®ã·ãŒã³ãå«ãŸããŠããŸãã
- ãšãã£ã¿ãŒ ïŒãã®ãã©ã«ããŒå
ã®ã¹ã¯ãªããã¯ããšãã£ã¿ãŒã§éçºã§äœ¿çšããã¹ãŒããŒæ©èœãæäŸããŸãã
- ã¹ã¯ãªãã ïŒGameObjectã«ã¢ã¿ãããã Playãã¯ãªãã¯ãããšå®è¡ãããã©ã³ã¿ã€ã ã¹ã¯ãªããã§ãã
- ãããªã¢ã« ïŒãã®ãã©ã«ãã«ã¯ãã¡ãã·ã¥ã®ãããªã¢ã«ãå«ãŸããŠããŸãã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ã3Dã¡ãã·ã¥ã®äœæãèŠèŠåããã«ã¹ã¿ã ãšãã£ã¿ãŒãäœæããŸãã
ã«ã¹ã¿ã ãšãã£ã¿ãŒã§ã¡ãã·ã¥ã倿Žãã
Scenesãã©ã«ããŒã«ãã
01 Mesh Study DemoãéããŸãã
ã·ãŒã³ãŠã£ã³ããŠã«ã3Dãã¥ãŒãã衚瀺ãããŸãã
ã¡ãã·ã¥ã«å
¥ãåã«ãã«ã¹ã¿ã ãšãã£ã¿ã¹ã¯ãªãããèŠãŠã¿ãŸãããã
ãšãã£ã¿ãŒã¹ã¯ãªããã®ç·šé
[
ãããžã§ã¯ã]ãŠã£ã³ããŠã§[
ãšãã£ã¿ãŒ ]ãã©ã«ããŒãéžæããŸãã ãã®ãã©ã«ããŒå
ã®ã¹ã¯ãªããã¯ãéçºäžã«ãšãã£ã¿ãŒïŒãšãã£ã¿ãŒïŒã«æ©èœã远å ãããã®ã§ããããã«ãã¢ãŒãã§ã¯äœ¿çšã§ããŸããã
MeshInspector.csãéãããœãŒã¹ã³ãŒãã衚瀺ããŸãã ãã¹ãŠã®Editorã¹ã¯ãªããã¯
Editor
ã¯ã©ã¹ãå®è£
ããå¿
èŠãããããã®
CustomEditor
屿§ã¯
Editor
ã¯ã©ã¹ã«å¯ŸããŠãããããšãã£ã¿ãŒã®ãªããžã§ã¯ãã®ã¿ã€ããæç€ºããŸãã
OnSceneGUI()
ã¯ãSceneãŠã£ã³ããŠã§ã®ã¬ã³ããªã³ã°ãå¯èœã«ããã€ãã³ãã¡ãœããã§ãã
OnInspectorGUI()
䜿çšãããšã远å ã®GUIèŠçŽ ãã€ã³ã¹ãã¯ã¿ãŒã«è¿œå ã§ããŸãã
MeshInspector.csã§ ã
MeshInspector
ã¯ã©ã¹ãéå§ããåã«ã次ã远å ããŸãã
[CustomEditor(typeof(MeshStudy))]
ã³ãŒãã®èª¬æïŒ
CustomEditor
屿§ã¯ãã«ã¹ã¿ã ãšãã£ã¿ãŒã¯ã©ã¹ã倿Žã§ãããªããžã§ã¯ãã®ã¿ã€ããUnityã«äŒããŸãã
OnSceneGUI()
åã«æ¬¡ã远å ããŸãã
mesh = target as MeshStudy; Debug.Log("Custom editor is running");
ã³ãŒãã®èª¬æïŒ
Editor
ã¯ã©ã¹ã«ã¯æšæºã®
target
倿°ããããŸãã ããã§ã
target
ã¯
MeshStudy
ãžã®å€æ
MeshStudy
ã ããã§ãã«ã¹ã¿ã ãšãã£ã¿ãŒã¯ã·ãŒã³ãŠã£ã³ããŠã®ãã¹ãŠã®
GameObjectãšãããã«ã¢ã¿ããããã
MeshStudy.csãæç»ããŸãã ãããã°ã¡ãã»ãŒãžã远å ãããšãã«ã¹ã¿ã ãšãã£ã¿ãŒãå®éã«å®è¡ãããŠããããšãã³ã³ãœãŒã«ã§ç¢ºèªã§ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
Scriptsãã©ã«ããŒã«ç§»åãã
MeshStudy.csã
éå±€å
ã®
GameObject ãã¥ãŒãã«ãã©ãã°ããŠã¢ã¿ããããŸãã
ããã§ããã«ã¹ã¿ã ãšãã£ã¿ãŒãå®è¡äžã§ãããšããã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«è¡šç€ºãããŸããããã¯ããã¹ãŠãæ£ããè¡ãããããšãæå³ããŸãã ãããã°ã¡ãã»ãŒãžãåé€ããŠãã³ã³ãœãŒã«ã§ç
©ããããªãããã«ããããšãã§ããŸãã
ã¡ãã·ã¥ã®è€è£œãšãã³ã
ã«ã¹ã¿ã ãšãã£ã¿ãŒã䜿çšããŠç·šéã¢ãŒãã§3Dã¡ãã·ã¥ãæäœããå Žåãããã©ã«ãã®Unityã¡ãã·ã¥ãäžæžãããªãããã«æ³šæããŠãã ããã ãã®å ŽåãUnityãåèµ·åããå¿
èŠããããŸãã
å
ã®ãã©ãŒã ãäžæžãããã«ã¡ãã·ã¥ãå®å
šã«è€è£œããã«ã¯ã
MeshFilter.sharedmesh
ããããã£ããã¡ãã·ã¥ã®ã³ããŒãäœæããã¡ãã·ã¥ãã£ã«ã¿ãŒã«å床å²ãåœãŠãŸãã
ãããè¡ãã«ã¯ã
Scriptsãã©ã«ããŒã®
MeshStudy.csãããã«ã¯ãªãã¯ããŠãã³ãŒããšãã£ã¿ãŒã§ãã¡ã€ã«ãéããŸãã ãã®ã¹ã¯ãªããã¯
MonoBehaviour
ã¯ã©ã¹ãç¶æ¿ããŠããããã®
Start()
颿°ã¯ç·šéã¢ãŒãã§ã¯å®è¡ãããŸããã
MeshStudy.csã§ ã
MeshStudy
ã¯ã©ã¹ãéå§ããåã«ã次ã远å ããŸãã
[ExecuteInEditMode]
ã³ãŒãã®èª¬æïŒãã®å±æ§ã远å ãããšã
Start()
颿°ã¯åçã¢ãŒããšç·šéã¢ãŒãã®äž¡æ¹ã§å®è¡ãããŸãã ããã§ãæåã«ã¡ãã·ã¥ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããã¯ããŒã³ãäœæã§ããŸãã
InitMesh()
ãæ¬¡ã®ã³ãŒãã远å ããŸãã
oMeshFilter = GetComponent<MeshFilter>(); oMesh = oMeshFilter.sharedMesh;
ã³ãŒãã®èª¬æïŒ
MeshFilter
ã³ã³ããŒãã³ãããå
ã®oMesh
ã¡ãã·ã¥ãååŸããŸããcMesh
ãæ°ããã¡ãã·ã¥cMesh
ã³ããŒãcMesh
ã- ã³ããŒããã¡ãã·ã¥ã¡ãã·ã¥ãã£ã«ã¿ãŒãå床å²ãåœãŠãŸãã
- ããŒã«ã«å€æ°ãæŽæ°ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã ãããã°ã³ã³ãœãŒã«ã«ãInitïŒClonedããšããã¡ãã»ãŒãžã衚瀺ãããŸãã
é局㧠GameObject
Cube
ãéžæãã
ã€ã³ã¹ãã¯ã¿ãŒã§ãã®ããããã£ã確èªããŸãã
Mesh Filterã¯
cloneãšããã¡ãã·ã¥ã¢ã»ããã衚瀺ããå¿
èŠããããŸãã ãããïŒ ããã¯ãã¡ãã·ã¥ã®ã¯ããŒã³äœæã«æåããããšãæå³ããŸãã
Editorãã©ã«ããŒã§ã
MeshInspector.csã«ç§»åã
ãŸã ã
OnInspectorGUI()
ãã³ãŒãã®2è¡ç®ã®åŸã«ã次ã远å ããŸãã
if (GUILayout.Button("Reset"))
ã³ãŒãã®èª¬æïŒ
- ãã®ã³ãŒãã¯ã Inspectorã« Resetãã¿ã³ãæç»ããŸãã
- æŒããããšã MeshStudy.csã®
Reset()
颿°ãåŒã³åºããŸãã
ãã¡ã€ã«ãä¿åãã
MeshStudy.csãéããæ¬¡ã®ã³ãŒãã
Reset()
颿°ã«è¿œå ããŸãã
if (cMesh != null && oMesh != null)
ã³ãŒãã®èª¬æïŒ
- ãœãŒã¹ãšã¯ããŒã³ã¡ãã·ã¥ã®ååšã確èªããŸãã
cMesh
ãå
ã®ã¡ãã·ã¥ã«ãªã»ããããŸããcMesh
oMeshFilter
å²ãåœãŠã- ããŒã«ã«å€æ°ã®æŽæ°ã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
ã€ã³ã¹ãã¯ã¿ã§ã [
ãã¹ãç·šé ]ãã¿ã³ãã¯ãªãã¯ããŠããã¥ãŒãã¡ãã·ã¥ãããããŸãã æ¬¡ã«ã[
ãªã»ãã ]ãã¿ã³ãã¯ãªãã¯ããŸãã ãã¥ãŒãã¯å
ã®åœ¢åŒã«æ»ãå¿
èŠããããŸãã
Unityã®é ç¹ãšäžè§åœ¢ã®èª¬æ
ã¡ãã·ã¥ã¯ãäžè§åœ¢ã®ãšããžã§æ¥ç¶ãããé ç¹ã§æ§æãããŸãã äžè§åœ¢ã¯ããªããžã§ã¯ãã®åºæ¬çãªåœ¢ç¶ãå®çŸ©ããŸãã
ã¡ãã·ã¥ã¯ã©ã¹ïŒ
- é ç¹ã¯
Vector3
å€ã®é
åãšããŠä¿åãããŸãã - äžè§åœ¢ã¯ãé ç¹é
åã®ã€ã³ããã¯ã¹ã«å¯Ÿå¿ããæŽæ°é
åãšããŠä¿åãããŸãã
ã€ãŸãã4ã€ã®é ç¹ãš2ã€ã®äžè§åœ¢ã§æ§æãããåçŽãªã¯ã¢ããã¡ãã·ã¥ã§ã¯ãã¡ãã·ã¥ããŒã¿ã¯æ¬¡ã®ããã«ãªããŸãã
é ç¹ãããã³ã°
ããã§ã¯ãç«æ¹äœã®é ç¹ãéãç¹ãšããŠè¡šç€ºããŸãã
MeshInspector.csã§ã
EditMesh()
颿°ã«å
¥ãã以äžã远å ããŸãã
handleTransform = mesh.transform;
ã³ãŒãã®èª¬æïŒ
handleTransform
ã¯ã mesh
ãã倿å€ãååŸããŸããhandleRotation
ã¯ãçŸåšã®ãžã§ã€ã³ãã®å転ã¢ãŒããååŸããŸãã- ã¡ãã·ã¥ã®äžéšãç§»åãã
ShowPoint()
ã䜿çšããŠãã€ã³ããæç»ããŸãã
ShowPoint()
颿°ã§ã
//draw dot
ã³ã¡ã³ãã®çŽåŸã«ã以äžã远å ããŸãã
Vector3 point = handleTransform.TransformPoint(mesh.vertices[index]);
ã³ãŒãã®èª¬æïŒãã®è¡ã¯ãé ç¹ã®ããŒã«ã«äœçœ®ãã¯ãŒã«ã空éã®åº§æšã«å€æããŸãã
åã颿°ã®
if
ãããã¯ã§ã远å ããã°ããã®ã³ãŒãè¡ã®çŽåŸã«ã次ã远å ããŸãã
Handles.color = Color.blue; point = Handles.FreeMoveHandle(point, handleRotation, mesh.handleSize, Vector3.zero, Handles.DotHandleCap);
ã³ãŒãã®èª¬æïŒ
Handles
ãã«ããŒã¯ã©ã¹ã䜿çšããŠããã€ã³ãã®è²ããµã€ãºãããã³äœçœ®ãèšå®ããŸããHandles.FreeMoveHandle()
ã¯ããã©ãã°ã¢ã³ãããããæäœãç°¡çŽ åããç¡å¶éã®ã¢ãŒã·ã§ã³ãããã¥ã¬ãŒã¿ãŒãäœæããŸããããã¯ã次ã®ã»ã¯ã·ã§ã³ã§åœ¹ç«ã¡ãŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
ã€ã³ã¹ãã¯ã¿ãŒã§ãã¥ãŒãããããã£ã確èªãã[
é ç¹ãã€ã³ãã®
ç§»å ]ãªãã·ã§ã³ãæå¹ã«ãªã£ãŠããããšã確èªããŸãã ããã§ãç»é¢äžã®ã¡ãã·ã¥ãããã€ãã®éãç¹ã§ããŒã¯ãããŠããããšãããããŸãã ããããã¥ãŒãã¡ãã·ã¥ã®é ç¹ã§ãïŒ ä»ã®3Dãªããžã§ã¯ãã§ãããå®è¡ããŠãçµæã芳å¯ããŠãã ããã
åäžã®é ç¹ãç§»åãã
ã¡ãã·ã¥ãæäœããæãåçŽãªã¹ãããããå§ããŸããã-åäžã®é ç¹ãç§»åããŸãã
MeshInspector.csã«ç§»åã
ãŸã ã
ShowPoint()
颿°å
ã§ã
//drag
ã³ã¡ã³ãã®çŽåŸã
if
ãããã¯ã®éãæ¬åŒ§ã®çŽåã«ã次ã远å ããŸãã
if (GUI.changed)
ã³ãŒãã®èª¬æïŒ
GUI.changed
ã¯ããã€ã³ãã§çºçãããã¹ãŠã®å€æŽã远跡ãã Handles.FreeMoveHandle()
ãšHandles.FreeMoveHandle()
ãŠãã©ãã°ã¢ã³ãããããæäœãèªèããŸãã- ãã©ãã°å¯èœãªé ç¹ã®å Žåã
mesh.DoAction()
颿°ã¯ã€ã³ããã¯ã¹ãšå€æå€ããã©ã¡ãŒã¿ãŒãšããŠåãåããŸãã 倿é ç¹å€ã¯ã¯ãŒã«ã空éã«ããããã InverseTransformPoint()
ã䜿çšããŠããŒã«ã«ç©ºéã«å€æããŸãã
ã¹ã¯ãªãããã¡ã€ã«ãä¿åãã
MeshStudy.csã«ç§»åã
ãŸã ã
DoAction()
ã§ãéãæ¬åŒ§ã®åŸã«ã次ã远å ããŸãã
PullOneVertex(index, localPos);
次ã«ã
PullOneVertex()
颿°ã«æ¬¡ã远å ããŸãã
vertices[index] = newPos;
ã³ãŒãã®èª¬æïŒ
- ã¿ãŒã²ããé ç¹ãå€
newPos
ã§æŽæ°ããŸãã - æŽæ°ãããé ç¹å€ã
cMesh.vertices
ãŸãã RecalculateNormals()
ã倿Žã«äžèŽããããã«ã¡ãã·ã¥RecalculateNormals()
åèšç®ããŠåæç»ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã ãã¥ãŒãäžã®ãã€ã³ãããã©ãã°ããŠã¿ãŠãã ããã å£ããã¡ãã·ã¥ãèŠãŸãããïŒ
äžéšã®é ç¹ã¯åãäœçœ®ã«ããããã1ã€ã ãããã©ãã°ãããšãæ®ãã®é ç¹ããã®åŸãã«æ®ããã¡ãã·ã¥ãå£ããŸãã æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ããã®åé¡ãä¿®æ£ããŸãã
ãã¹ãŠã®é¡äŒŒããé ç¹ãèŠã€ãã
èŠèŠçã«ã¯ããã¥ãŒãã¡ãã·ã¥ã¯8ã€ã®é ç¹ã6ã€ã®èŸºãããã³12ã®äžè§åœ¢ã§æ§æãããŠããŸãã ãããããã§ãããã©ããã確èªããŸãããã
MeshStudy.csãéãã
Start()
颿°ã®åãèŠãŠã
vertices
倿°ãèŠã€ããŸãã 以äžã衚瀺ãããŸãã
[HideInInspector] public Vector3[] vertices;
ã³ãŒãã®èª¬æïŒ
[HideInInspector]
ã¯ã
InspectorãŠã£ã³ããŠããå
±æå€æ°ãé衚瀺ã«ããŸãã
ãã®å±æ§ãã³ã¡ã³ãã¢ãŠãããŸãã
泚ïŒé ç¹å€ãé衚瀺ã«ãããšã [HideInInspector]
ãããè€éãª3Dã¡ãã·ã¥ã«åœ¹ç«ã¡ãŸãã é ç¹é
åã®ãµã€ãºã¯æ°åã®èŠçŽ ã«éããå¯èœæ§ããããããã€ã³ã¹ãã¯ã¿ãŒã§é
åå€ã衚瀺ããããšãããšãUnityãæå¶ãããå¯èœæ§ããããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
Inspectorã«ç§»åããŸãã ããã§ã
Mesh Studyã¹ã¯ãªããã®ã³ã³ããŒãã³ãã®äžã«ã
verticesããããã£ã衚瀺ãããŸããã ãã®æšªã®ç¢å°ã¢ã€ã³ã³ãã¯ãªãã¯ããŸãã ãã®ããã
Vector3
èŠçŽ
Vector3
é
åã
Vector3
ãŸãã
é
åã®ãµã€ãºã24ã§ããããšãããããŸããã€ãŸããåãäœçœ®ã®é ç¹ããããŸãã ç¶è¡ããåã«ãå¿
ã
[HideInInspector]
ã³ã¡ã³ãã
[HideInInspector]
ã
ãªã24åã®é ç¹ãããã®ã§ããïŒãã®ããŒãã«ã¯å€ãã®çè«ããããŸãã ããããæãç°¡åãªçãã¯ãç«æ¹äœã«ã¯6ã€ã®åŽé¢ããããååŽé¢ã¯å¹³é¢ã圢æãã4ã€ã®é ç¹ã§æ§æãããŠãããšããããšã§ãã
ãããã£ãŠãèšç®ã¯æ¬¡ã®ããã«ãªããŸãïŒ6 x 4 = 24é ç¹ã
ä»ã®åçãæ€çŽ¢ã§ããŸãã ãã ããçŸæç¹ã§ã¯ãäžéšã®ã¡ãã·ã¥ã«åãäœçœ®ã®é ç¹ãããããšãç¥ãã®ã¯ç°¡åã§ãã
MeshStudy.csã§ ã
DoAction()
颿°å
ã®
ãã¹ãŠã®ã³ãŒããæ¬¡ã®ã³ãŒã
ã«çœ®ãæããŸãã
PullSimilarVertices(index, localPos);
PullSimilarVertices()
颿°ã«
PullSimilarVertices()
ããŠã次ã远å ããŸãããã
Vector3 targetVertexPos = vertices[index];
ã³ãŒãã®èª¬æïŒ
FindRelatedVertices()
ã¡ãœãããžã®åŒæ°ãšããŠäœ¿çšãããã¿ãŒã²ããé ç¹ã®äœçœ®ãååŸããŸãã- ãã®ã¡ãœããã¯ãã¿ãŒã²ããé ç¹ãšåãäœçœ®ãæã€ã€ã³ããã¯ã¹ïŒé ç¹ã«å¯Ÿå¿ããïŒã®ãªã¹ããè¿ããŸãã
- ã«ãŒãã¯ãªã¹ãå
šäœãèµ°æ»ãã察å¿ããé ç¹ã
newPos
èšå®ãnewPos
ã - æŽæ°ããã
vertices
ãcMesh.vertices
ãŸãã æ¬¡ã«ã RecalculateNormals()
ãåŒã³åºããŠãæ°ããå€ã§ã¡ãã·ã¥ãåæç»ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã é ç¹ã®ããããããã©ãã°ããŸãã ããã§ãã¡ãã·ã¥ã¯ãã®åœ¢ç¶ãä¿æãã厩å£ããªãã¯ãã§ãã
ã¡ãã·ã¥ãæäœããæåã®ã¹ããããå®äºããã®ã§ãã·ãŒã³ãä¿åããŠæ¬¡ã®ã»ã¯ã·ã§ã³ã«é²ã¿ãŸãã
ã¡ãã·ã¥æäœ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã¡ãã·ã¥ããªã¢ã«ã¿ã€ã ã§æäœããæ¹æ³ã«ã€ããŠåŠç¿ããŸãã å€ãã®æ¹æ³ããããŸããããã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¡ãã·ã¥ãæäœããæãç°¡åãªæ¹æ³ãã€ãŸãäºåã«äœæãããã¡ãã·ã¥ã®é ç¹ãç§»åããæ¹æ³ãèŠãŠãããŸãã
éžæããã€ã³ããã¯ã¹ãåéãã
ãªã¢ã«ã¿ã€ã ã§ç§»åããé ç¹ãéžæããããšããå§ããŸãããã
ã·ãŒã³ãéã
02 Scenesãã©ã«ããŒãã
ããŒãã¡ãã·ã¥ã
äœæããŸãã [ã·ãŒã³]ãŠã£ã³ããŠã«ãèµ€ãçã衚瀺ãããŸãã
Hierarchyã§ Sphereãéžæãã
Inspectorã«é²ã¿ãŸãã
Heart Meshã¹ã¯ãªããã³ã³ããŒãã³ãããªããžã§ã¯ãã«ã¢ã¿ãããããŠããããšãããããŸãã
ããã§ãSceneãŠã£ã³ããŠã«ã¡ãã·ã¥ã®é ç¹ã衚瀺ããã«ã¯ããã®ãªããžã§ã¯ãã®Editorã¹ã¯ãªãããå¿
èŠã§ãã
Editorãã©ã«ããŒã«ç§»åãã
HeartMeshInspector.csãããã«ã¯ãªãã¯ã
ãŸã ã
ShowHandle()
颿°ã§ã
if
ãããã¯å
ã«æ¬¡ã远å ããŸãã
Handles.color = Color.blue; if (Handles.Button(point, handleRotation, mesh.pickSize, mesh.pickSize, Handles.DotHandleCap))
ã³ãŒãã®èª¬æïŒ
- ã¡ãã·ã¥ã®é ç¹ãã¿ã€ã
Handles.Button
ãšããŠèšå®ããã³è¡šç€ºããŸãã - ã¯ãªãã¯ãããšãéžæããã€ã³ããã¯ã¹ããæŒããã
mesh.selectedIndices
ã«mesh.selectedIndices
ã
OnInspectorGUI()
ã§ãéãæ¬åŒ§ã®åã«ã次ã远å ããŸãã
if (GUILayout.Button("Clear Selected Vertices")) { mesh.ClearAllData(); }
ã³ãŒãã®èª¬æïŒããã¯ã
Inspectorã«ãªã»ãããã¿ã³ã远å ããŠ
mesh.ClearAllData()
ãåŒã³åºã
mesh.ClearAllData()
ã§ãã
ãã¡ã€ã«ãä¿åãã
Scriptsãã©ã«ããŒãã
HeartMesh.csãéããŸãã
ClearAllData()
颿°ã§ã次ã远å ããŸãã
selectedIndices = new List<int>(); targetIndex = 0; targetVertex = Vector3.zero;
ã³ãŒãã®èª¬æïŒã³ãŒãã¯
selectedIndices
ããã³
targetIndex
å€ãã¯ãªã¢ããŸãã ãŸãã
targetVertex
ããªã»ããããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
Sphereãéžæãã
HeartMeshã¹ã¯ãªãã
ã³ã³ããŒãã³ãã® ã€ã³ã¹ãã¯ã¿ãŒã«ç§»åã
ãŸã ã æšªã«ããç¢å°ã¢ã€ã³ã³ãã¯ãªãã¯ããŠã
éžæããã€ã³ããã¯ã¹ãå±éããŸãã ããã«ããããªã¹ãã«è¿œå ããããã¹ãŠã®é ç¹ã远跡ã§ããŸãã
暪ã«ãããã§ãã¯ããã¯ã¹ã䜿çšããŠã
ç·šéã¢ãŒããæå¹ã«ããŸãã ããã«ãããã¡ãã·ã¥ã®é ç¹ãã·ãŒã³ãŠã£ã³ããŠã«æç»ãããŸãã
éžæãããã€ã³ããã¯ã¹ã®éãç¹ãã¯ãªãã¯ãããšãããã«å¿ããŠå€ã倿ŽãããŸãã ãŸãã[
éžæããé ç¹ã
ã¯ãªã¢ ]ãã¿ã³ããã¹ãããŠããã¹ãŠã®å€ãã¯ãªã¢ãããããšã確èªããŸãã
泚ïŒå€æŽãããã«ã¹ã¿ã
ã€ã³ã¹ãã¯ã¿ãŒã«ã¯ã
Show Transform Handleã䜿çšããŠå€æãããã¥ã¬ãŒã¿ãŒã
衚瀺 /é衚瀺ã«ãããªãã·ã§ã³ããããŸãã ãã®ãããä»ã®ã·ãŒã³ã§Transformãããã¥ã¬ãŒã¿ãŒãèŠã€ããããªããŠããããã¯ã«é¥ããªãã§ãã ããïŒ çµäºããåã«ãªã³ã«ããŠãã ããã
çäœãå¿ã«å€ãã
ã¡ãã·ã¥ã®é ç¹ããªã¢ã«ã¿ã€ã ã§å€æŽããã«ã¯ãåºæ¬çã«3ã€ã®ã¹ãããããããŸãã
- ïŒã¢ãã¡ãŒã·ã§ã³ã®åã«ïŒçŸåšã®ã¡ãã·ã¥ã®é ç¹ã
mVertices
ãŸãã - èšç®
mVertices
ã mVertices
ã®å€ã倿ŽããŸãã - åã¹ãããã§å€æŽãããšãã«ãçŸåšã®ã¡ãã·ã¥é ç¹ã
mVertices
æŽæ°ããUnityã«æ³ç·ãèªåçã«èšç®ãããŸãã
Start()
颿°ã®åã«
HeartMesh.csãšæ¬¡ã®å€æ°ãéããŸãã
public float radiusofeffect = 0.3f;
ã³ãŒãã®èª¬æïŒ
- ã¿ãŒã²ããé ç¹ã®åœ±é¿ãåããé åã®ååŸã
- ãã©ãã°ãã©ãŒã¹ã
- ã¢ãã¡ãŒã·ã§ã³ã®ç¶ç¶æéã
selectedIndices
ãªã¹ãã®çŸåšã®ã€ã³ããã¯ã¹ã
Init()
颿°ã§ã
if
ãããã¯ã®åã«ã次ã远å ããŸãã
currentIndex = 0;
ã³ãŒãã®èª¬æïŒã²ãŒã ã®éå§æã«ã
currentIndex
selectedIndices
ãªã¹ãã®æåã®ã€ã³ããã¯ã¹ã§ãã0ã«
currentIndex
selectedIndices
ãŸãã
åã
Init()
颿°ã§ã
else
ãããã¯ã®éãæ¬åŒ§ã®åã«ã次ã远å ããŸãã
StartDisplacement();
ã³ãŒãã®èª¬æïŒ
isEditMode
ãfalseã®å Žåã
StartDisplacement()
颿°ãéå§ããŸãã
StartDisplacement()
颿°å
ã«ã次ã远å ããŸãã
targetVertex = oVertices[selectedIndices[currentIndex]];
ã³ãŒãã®èª¬æïŒ
targetVertex
ãéžæããŠãã¢ãã¡ãŒã·ã§ã³ãéå§ããŸãã- éå§æéãèšå®ãã
isAnimate
ã®å€ãtrueã«å€æŽããŸãã
StartDisplacement()
颿°ã®åŸã次ã®ã³ãŒãã§
FixedUpdate()
颿°ãäœæããŸãã
void FixedUpdate()
ã³ãŒãã®èª¬æïŒ
FixedUpdate()
颿°ã¯ãåºå®FPSã®ãµã€ã¯ã«ã§å®è¡ãããŸããisAnimate
ãfalseã®å Žåãæ¬¡ã®ã³ãŒããã¹ãããããŸããruntime
ã¢ãã¡ãŒã·ã§ã³ã倿Žãruntime
ãruntime
ãduration
å
ã§ããduration
ã targetVertex
ããã³DisplaceVertices()
ã®ã¯ãŒã«ã座æšãååŸãã pullvalue
ããã³radiusofeffect
ã¿ãŒã²ããé ç¹ãã«ããŒãradiusofeffect
ã- ãã以å€ã®å Žåã¯ãæéåãã§ãã
currentIndex
ã«1ã远å ããŸãã currentIndex
selectedIndices
å«ãŸselectedIndices
ãããã©ããã確èªããŸãã StartDisplacement()
ã䜿çšããŠããªã¹ãå
ã®æ¬¡ã®é ç¹ã«ç§»åããŸãã- ãã以å€ã®å Žåã¯ããªã¹ãã®æåŸã§ã
oMesh
ããŒã¿ãçŸåšã®ã¡ãã·ã¥ã«å€æŽãã isAnimate
ãfalseã«isAnimate
ãŠã¢ãã¡ãŒã·ã§ã³ã忢ããŸãã
DisplaceVertices()
ãæ¬¡ã远å ããŸãã
Vector3 currentVertexPos = Vector3.zero; float sqrRadius = radius * radius;
ã³ãŒãã®èª¬æïŒ
- ååŸã®äºä¹ã
- ã¡ãã·ã¥ã®åé ç¹ãã«ãŒãããŸãã
currentVertexPos
ãšsqrMagnitude
éã®currentVertexPos
ãtargetVertexPos
ãŸããsqrMagnitude
ãsqrMagnitude
ãè¶
ããå Žåãæ¬¡ã®é ç¹ã«ç§»åããŸãã- ãã以å€ã®å Žåã¯ãã¹ã³ãŒãã®äžå¿ç¹ããçŸåšã®é ç¹ãŸã§ã®
distance
å¿ããŠã falloff
ãªãå€ãå®çŸ©ããŠç¶è¡ããŸãã - æ°ãã
Vector3
äœçœ®ãVector3
ãã®TransformãçŸåšã®é ç¹ã«é©çšããŸãã - ã«ãŒããçµäºãããšã倿Žããã
mVertices
å€ãmVertices
ã«å²ãåœãŠãUnityã«æ³ç·ãåèšç®ãããŸãã
ãã©ãŒã«ãªããã¯ãããžãŒã®ãœãŒã¹
å
ã®åŒã¯ã Procedural Examplesã¢ã»ããããã±ãŒãžãã¡ã€ã«ããååŸãããUnity Asset Storeããç¡æã§ããŠã³ããŒãã§ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
Sphereãéžæãã
HeartMeshã³ã³ããŒãã³ãã«ç§»åããŠã
Selected Indicesããããã£ã«ããã€ãã®é ç¹ã远å ããŠã¿ãŠãã ããã
ç·šéã¢ãŒããç¡å¹ã«ãã[
åç ]ãã¯ãªãã¯ããŠãäœæ¥ã®çµæã確èªããŸãã
Radiusofeffect ã
Pullvalueãããã³
Durationã®å€ã
詊ããŠãç°ãªãçµæãååŸããŸãã æºåãã§ããããäžã®ã¹ã¯ãªãŒã³ã·ã§ããã«åŸã£ãŠèšå®ã倿ŽããŸãã
[
åç]ãã¯ãªãã¯ã
ãŸã ã ããªãã®çã¯å¿ã«å€ãããŸãããïŒ
ããã§ãšãããããŸãïŒ æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ãã¡ãã·ã¥ãå°æ¥ã®äœ¿çšã«åããŠãã¬ãããšããŠä¿åããŸãã
ã¡ãã·ã¥ããªã¢ã«ã¿ã€ã ã§ä¿åãã
ãã¬ã€ã¢ãŒãã§ããŒãåã®æç¶ãåã¡ãã·ã¥ãä¿åããã«ã¯ãåã3Dãªããžã§ã¯ãã«ãªããã¬ãããæºåããã¹ã¯ãªããã䜿çšããŠãã®ã¡ãã·ã¥ã¢ã»ãããæ°ãããã®ã«çœ®ãæããå¿
èŠããããŸãã
ãããžã§ã¯ããŠã£ã³ããŠã§ã
Prefabsãã©ã«ããŒã®
CustomHeartãèŠã€ããŸãã ç¢å°ã¢ã€ã³ã³ãã¯ãªãã¯ããŠå
容ãå±éããã
åããéžæããŸãã ããã§ã
Inspectorãã¬ãã¥ãŒãŠã£ã³ããŠã«Sphereãªããžã§ã¯ãã衚瀺ãããŸãã ããã¯ãæ°ããã¡ãã·ã¥ã®ããŒã¿ãä¿åãããã¬ããã§ãã
HeartMeshInspector.csãéã
ãŸã ã
OnInspectorGUI()
颿°å
ã§ãéãæ¬åŒ§ã®åã«ã次ã远å ããŸãã
if (!mesh.isEditMode && mesh.isMeshReady) { string path = "Assets/Prefabs/CustomHeart.prefab";
ã³ãŒãã®èª¬æïŒ
- CustomHeart ãã¬ãããªããžã§ã¯ããžã®ãã¹ã«
path
ãèšå®ããŸãã - CustomHeart ãã¬ãããã2ã€ã®ãªããžã§ã¯ããäœæããŸãã1ã€ã¯GameObjectãšããŠã€ã³ã¹ã¿ã³ã¹ãäœæããããïŒ
pfObj
ïŒããã1ã€ã¯ãªã³ã¯ãšããŠäœæããŸãïŒ pfRef
ïŒã - CustomHeart
pfMesh
ã¡ãã·ã¥pfMesh
ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã èŠã€ãããªãå Žåã¯æ°ããã¡ãã·ã¥ãäœæããèŠã€ãããªãå Žåã¯æ¢åã®ããŒã¿ãã¯ãªã¢ããŸãã pfMesh
ã«æ°ããã¡ãã·ã¥ããŒã¿ãå
¥åãããããã¢ã»ãããšããŠCustomHeartã«è¿œå ããŸã ã
gameObj
ã¡ãã·ã¥ã¢ã»ãããå€pfMesh
ãŸãã- æ¢åã®æ¥ç¶ãç
§åããããš
gameObj
CustomHeartãgameObj
眮ãæããŸãã - å³åº§ã«
gameObj
ç Žå£ãgameObj
ã
ãã¡ã€ã«ãä¿åããŠã
HeartMesh.csã«ç§»åã
ãŸã ã äžè¬çãª
SaveMesh()
ã¡ãœããã§ã
nMesh
ã€ã³ã¹ã¿ã³ã¹ãäœæããåŸã次ã远å ããŸãã
nMesh.name = "HeartMesh"; nMesh.vertices = oMesh.vertices; nMesh.triangles = oMesh.triangles; nMesh.normals = oMesh.normals;
ã³ãŒãã®èª¬æïŒã¡ãã·ã¥ã®ã¢ã»ãããããŒãåã¡ãã·ã¥ã®å€ã§è¿ããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸãã
åçãã¯ãªãã¯ã
ãŸã ã ã¢ãã¡ãŒã·ã§ã³ãå®äºãããšã
ã¡ãã·ã¥ã®
ä¿åãã¿ã³ã
ã€ã³ã¹ãã¯ã¿ãŒã«è¡šç€ºãããŸãã ãã¿ã³ãã¯ãªãã¯ããŠæ°ããã¡ãã·ã¥ãä¿åãããã¬ãŒã€ãŒã忢ããŸãã
Prefabsãã©ã«ããŒã«ç§»åããCustomHeart
ãã¬ããã確èªããŸãã ããã§ãCustomHeart
ãã¬ãããªããžã§ã¯ãã«ããŸã£ããæ°ããããŒãåã®ã¡ãã·ã¥ãããããšãããããŸãã
çŽ æŽãããä»äºã§ãïŒãã¹ãŠããŸãšãã
åã®ã·ãŒã³ã§ã¯ã
DisplaceVertices()
颿°ã¯FalloffåŒã䜿çšããŠãæå®ãããååŸå
ã®åé ç¹ã«é©çšããããã©ãã°åãæ±ºå®ããŸããã æåãæžå°ãå§ãããæžè¡°ãã®ãã€ã³ãã¯ã䜿çšãããæžè¡°ã®çš®é¡ïŒç·åœ¢ãã¬ãŠã¹ããŸãã¯éïŒã«ãã£ãŠç°ãªããŸãã åã¿ã€ãã¯ãã¡ãã·ã¥ã§ç°ãªãçµæãçæããŸãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãé ç¹ãæäœããå¥ã®æ¹æ³ãã€ãŸãç¹å®ã®æ²ç·ã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã é床ã¯è·é¢ãæéã§å²ã£ãå€ã«çãããšããã«ãŒã«ãæ¡çšãïŒd =ïŒv / tïŒïŒãæéã§å²ã£ãè·é¢ãåç
§ããŠããã¯ãã«ã®äœçœ®ã決å®ã§ããŸãã
æ²ç·æ³ã䜿çšãã
çŸåšã®ã·ãŒã³ãä¿åãã
Scenesãã©ã«ããã
03 Customize Heart MeshãéããŸãã
Hierarchyã«CustomHeartã®ã€ã³ã¹ã¿ã³ã¹ã衚瀺ãããŸãã ãã®æšªã«ããç¢å°ã¢ã€ã³ã³ãã¯ãªãã¯ããŠå
容ãå±éããã
åããéžæããŸãã
Inspectorã§ããããã£ã衚瀺ããŸãã
Heart Mesh Assetãå«ã
Mesh Filterã³ã³ããŒãã³ãã衚瀺ãããŸãã
ã«ã¹ã¿ã ããŒãã¹ã¯ãªãããã³ã³ããŒãã³ããšããŠChildã«æ·»ä»ããŸããããã§ãã¢ã»ãããHeartMeshããcloneã«å€æŽãããã¯ãã§ããæ¬¡ã«ãScriptsãã©ã«ããŒããCustomHeart.csãéããŸãã颿°ã®åã«ã次ã远å ããŸããStart()
public enum CurveType { Curve1, Curve2 } public CurveType curveType; Curve curve;
ã³ãŒãã®èª¬æïŒããã§ã¯ãååã®äžã«äžè¬çãªåæåãäœæããCurveType
ããã®åŸInspectorãã䜿çšå¯èœã«ãªããŸãã以äžã«ç§»åãCurveType1()
ãŠè¿œå ããŸãã Vector3[] curvepoints = new Vector3[3];
ã³ãŒãã®èª¬æïŒ- åçŽãªæ²ç·ã¯3ã€ã®ãã€ã³ãã§æ§æãããŸããæåã®æ²ç·ã®ãã€ã³ããèšå®ããŸãã
- ãã«ãã䜿çšããŠæåã®æ²ç·ãçæãã
Curve()
ãã®å€ãå²ãåœãŠãŸãcurve
ãæåŸã®ãã©ã¡ãŒã¿ãŒãšããŠtrueãæå®ãããšãæç»ãããæ²ç·ããã¬ãã¥ãŒã«è¡šç€ºã§ããŸãã
CurveType2()
次ã«ç§»åããŠè¿œå ããŸãã Vector3[] curvepoints = new Vector3[3];
ã³ãŒãã®èª¬æïŒ- 2çªç®ã®æ²ç·ã®ãã€ã³ããèšå®ããŸãã
- ã§2çªç®ã®æ²ç·ãçæãã
Curve()
ãã®å€ãå²ãåœãŠãŸãcurve
ãæåŸã®ãã©ã¡ãŒã¿ãŒãšããŠtrueãæå®ãããšãæç»ãããæ²ç·ããã¬ãã¥ãŒã«è¡šç€ºã§ããŸãã
B StartDisplacement()
ãéãæ¬åŒ§ã®åã«ã次ã远å ããŸãã if (curveType == CurveType.Curve1) { CurveType1(); } else if (curveType == CurveType.Curve2) { CurveType2(); }
ã³ãŒãã®èª¬æïŒããã§ã¯ããŠãŒã¶ãŒãéžæãããªãã·ã§ã³ã確èªããcurveType
ããã«å¿ããŠçæãcurve
ãŸããB DisplaceVertices()
ãfor
éãæ¬åŒ§ã®åã®ã«ãŒãã¹ããŒãã¡ã³ãå
ã«ã次ã远å ããŸãã float increment = curve.GetPoint(distance).y * force;
ã³ãŒãã®èª¬æïŒ- ç§ãã¡ã¯ãäžããããæ²ç·äžã®äœçœ®ãååŸ
distance
ãããã®å€ãä¹ç®y
ã«force
ååŸããŸãincrement
ã Vector3
çŸåšã®é ç¹ã®æ°ããäœçœ®ãä¿åããæ°ããããŒã¿åãäœæããããã«å¿ããŠãã®å€æãé©çšããŸãã
ãã¡ã€ã«ãä¿åããŠUnityã«æ»ããŸããã³ã³ããŒãã³ãã®ããããã£ã確èªCustomHeartã®ã²ãŒã ãªããžã§ã¯ãã®åããã«ãŒãã¿ã€ããéžæã§ããããããããŠã³ãªã¹ãã衚瀺ãããŸãã[ ã¿ã€ãã®ç·šé]ããããããŠã³ãªã¹ãããã[ ã€ã³ããã¯ã¹ã®è¿œå ]ãŸãã¯[ ã€ã³ããã¯ã¹ã®åé€]ãéžæããŠãé ç¹ã®ãªã¹ããæŽæ°ããããŸããŸãªèšå®ã§å®éšããŸããããŸããŸãªçš®é¡ã®æ²ç·ã®è©³çްãªçµæã衚瀺ããã«ã¯ãã¹ã¯ãªãŒã³ã·ã§ããã«åŸã£ãŠå€ãå
¥åããŸãã[ ã«ãŒãã¿ã€ã]ãªã¹ãã§[ Curve1 ]ãéžæãã[ ã¿ã€ãã®ç·šé ]ã§[ ãªã]ãéžæãããŠããããšã確èªããŠã[ åç ]ãã¯ãªãã¯ããŸããã¡ãã·ã¥ããã¿ãŒã³ã«åå²ããã®ãèŠããã¯ãã§ããã¢ãã«ãå転ãããŠåŽé¢å³ã§è¡šç€ºããäž¡æ¹ã®ã¿ã€ãã®æ²ç·ã®çµæãæ¯èŒããŸããããã§ã¯ãéžæããã«ãŒãã¿ã€ããã¡ãã·ã¥ãªãã»ããã«ã©ã®ããã«åœ±é¿ãããã確èªã§ããŸãã以äžã§ãïŒ
[ éžæããé ç¹ãã¯ãªã¢ ]ãã¯ãªãã¯ããŠãéžæããã€ã³ããã¯ã¹ããªã»ããããç¬èªã®ãã¿ãŒã³ã詊ãããšãã§ããŸãããã ããã¡ãã·ã¥ã®æçµçµæã«åœ±é¿ããä»ã®èŠå ãããããšãå¿ããªãã§ãã ããã- ååŸã®å€ã
- ãšãªã¢å
ã®é ç¹ã®ååžã
- éžæããé ç¹ã®ãã¿ãŒã³äœçœ®ã
- ãªãã»ããã«éžæãããã¡ãœããã
次ã¯ã©ããžè¡ããŸããïŒ
宿ãããããžã§ã¯ãã®ãã¡ã€ã«ã¯ããã¥ãŒããªã¢ã«ãããžã§ã¯ãã®ã¢ãŒã«ã€ãã«ãããŸãã忢ããªãã§ãã ããïŒUnity Procedural Maze Generationãã¥ãŒããªã¢ã«ã§äœ¿çšãããŠãããããæŽç·Žããããã¯ããã¯ã詊ããŠãã ããããã®ãã¥ãŒããªã¢ã«ã楜ããã§ãæ
å ±ãã圹ã«ç«ãŠã°å¹žãã§ããç§ã衚çŸããç¹å¥ãªæè¬ãžã£ã¹ããŒããªãã¯ã®ã³ãŒãã£ã³ã°ã®Catlikeç§ãå©ãã圌ã®åªãããã¥ãŒããªã¢ã«ã®ããã«ã¯ãç§ã®ãããžã§ã¯ãã®ããã®ãã¢ãçµã¿ç«ãŠãŸãã