
ãããŠãå°ãè±ç·ããŠã°ãŒã°ã«ãã¬ã€ã§ã²ãŒã ãæžããŸããããïŒ ãããŠãç§ãæ®æ®µèšäºãæžããŠãããããªå·šå€§ã§å§åçãªãŽãã§ã¯ãªããç§ã®å¿ã«ã·ã³ãã«ã§çãäœããã
å®éããã¹ãŠãéåžžã«ç°¡åã§ããæçµçã«éçºè
ã¢ã«ãŠã³ããç»é²ããå®éã«è©ŠããŠã¿ãããšæããŸãã ãããã®è¡ãæžããŠããæç¹ã§ã¯ãåäžã®èšè¿°ã¯ã©ã¹ãåäžã®æç»ãã¯ã»ã«ããããŸããã å®éããã®èšäºã¯æ¬åœã®éçºè
åããã°ã§ãã
èšäº
ç®æ¬¡
ã¬ãã«1.1 ã¢ã€ãã¢

æåã®ã«ãªã€ãããªã€ãã
çŽã®äžã§ãã®åãåç
§ããŠãã ããïŒ åœŒããå§ããŸãã ç§ã«ã¯ãã©ããªã²ãŒã ïŒãŸããã©ããªä»äºã§ãïŒãåæ§ã®ãµãŒã¯ã«ã§å§ãããããšæãããŸãã åœŒã¯æ°ç§åŸã«äœã«ãªããŸããïŒ ãã€ãŒã«ã§ïŒ åžœåïŒ ææïŒ ãã®ãµãŒã¯ã«ã®æå³ãæ³åããªãããèœæžããæããŠããŸãã åžœåïŒ
å³ãããããéãæ©ããŠãããç§ãã¡ã¯åœŒãäžããèŠãŠããŸãã é床-圌ã¯éã§æã€æ¹æ³ãç¥ã£ãŠããããã§ãã è¡ãæ©ãåããå£ã²ããå¹ãã匷çã«é匟ãçºå°ããã
ãã®ç©ºçœã¯ãç§ã®é ã®äžã§é·ãéå転ããŠããåãªãç»åã§ãã ããããç§ã¯ééããªãã¯ãªã ãŸã³ã©ã³ãã®ãããªã²ãŒã ãããããããŸããã ãããŠãç§ã¯ãã€ã奜ãã§ã¯ãªãã£ã2ã€ã®ãžã§ã€ã¹ãã£ãã¯ãæã€GUIã äžèŠãªOccamã®ãã¿ããããã¹ãŠåãé¢ããåºåã§æ¬¡ã®æŠå¿µãååŸããŸãã
ã¬ãã«ïŒå®¶ãæšæ ãæšœã®ããå°ããªçºã
ãã£ã©ã¯ã¿ãŒïŒã¡ã€ã³ãã£ã©ã¯ã¿ãŒïŒã·ã¥ãŒãã£ã³ã°ã²ãŒã ïŒãçè³ãéè¡äººã
ã²ãŒã ã¯äžæåæ¢ãããã¬ã€ã€ãŒã®ã¢ã¯ã·ã§ã³ãåŸ
ã¡ãŸãã ãã¬ãŒã€ãŒã¯ä»»æã®æ¹åã«ã¹ã¯ã€ãããŸãã ãã®æç¹ã§ïŒ
1.ã²ãŒã ã®æéãé²ã¿å§ããŸãã
2.䞻人å
¬ã¯ãã¬ã€ã€ãŒãæç€ºããæ¹åã«æã¡ãŸãã
3.䞻人å
¬ã¯æç€ºãããæ¹åã«åãå§ããŸãã
0.5ç§ãçµéãããšãã²ãŒã ã®æéãåã³åæ¢ããŸãã ãã¬ãŒã€ãŒã¯ããã¹ãŠã®çè³ãåããã§ããã ãå°ãªãéè¡äººãè² å·ãããå¿
èŠããããŸãã
èªåæ®åœ±ãšåæ¢æéã®ãã®çµã¿åããã¯ãç§ããšãŠãæ°ã«å
¥ã£ãŠããŸããã
- èªåæ®åœ±ïŒ
- 管çãç°¡çŽ åããŸãïŒ2ã€ã®ãžã§ã€ã¹ãã£ãã¯ã®ä»£ããã«1åã¹ã¯ã€ãïŒã
- è峿·±ãã¡ã«ããºã ã远å ããŸãïŒéè¡äººãæããªãããã«ãè¡ãå
ã確èªããå¿
èŠããããŸãïŒã
- 忢æéïŒ
- ã²ãŒã ãã¬ã€ã«å€åæ§ã远å ããŸãïŒç°ãªãã¬ãã«ãå®è¡ã§ããŸãïŒé
ãç©æãã«æ²ãã ããºã«ãŸãã¯ã¹ããŒãã·ã¥ãŒãã£ã³ã°ã²ãŒã ïŒã
- èªåçºç ²ã®é£ãããåãããŸãã
- ç§ïŒã¬ãã«ãã¶ã€ã³ïŒãšãã¬ã€ã€ãŒã®äž¡æ¹ã®ãã€ããã¯ã¹ãå¶åŸ¡ã§ããŸãã
åŸã
ã«ãã¢ã€ãã¢ã¯èŠèŠåããã詳现ã倧ãããªããããŸãã 仿¥ã¯ããã§ååã§ãã
TodoïŒå°ããªãããã¿ã€ããäœæããæéããããã«ç§»å/æ®åœ±ããããšã®æ¥œããã確èªããŸãã
ã¬ãã«1.2 ãã€ã¯ããããã¿ã€ã
Unity3Dã®ãããã§ããããã¿ã€ãã³ã°ã¯éåžžã«ç°¡åã§ãã BoxCollider2Dã§ããã€ãã®å£ã远å ããRigidBody2DãšCircleCollider2Dã§äžžãã¹ãã©ã€ãïŒãã¬ãŒã€ãŒãéè¡äººãçè³ïŒã远å ããŸãã ç®æ¡æžã-åãã¹ãã©ã€ããå°ãããèµ€ã®ã¿ãé£è¡çµè·¯çšã®RigidBody2D ã CircleCollider2Dããã³TrailRenderer ã
ç§ã¯èªåã®Clockã¯ã©ã¹ã§æé管çãè¡ã£ãŠããŸãããä»ã®ãã¹ãŠã®ã¯ã©ã¹ïŒãã¬ãŒã€ãŒã匟䞞ãªã©ïŒã¯ãTime.DeltaTimeã§ã¯ãªããããããã®æéå·®ã䜿çšããŸãã
èå³ããã人ã®ããã®Clock.csã®æåã®ããŒãžã§ã³ã®1ã€using UnityEngine; using System.Collections; public class Clock : MonoBehaviour { [SerializeField, Range(0, 2)] float stepDuration; [SerializeField] AnimationCurve stepCurve; float time = -1; float timeRatio = 0; float defaultFixedDeltaTime = 0; static Clock instance; public static Clock Instance { get { return instance; } } void Start() { instance = this; defaultFixedDeltaTime = Time.fixedDeltaTime; } void OnDestroy() { if (instance == this) instance = null; } public bool Paused { get { return time < 0; } } public float DeltaTime { get { return timeRatio * Time.deltaTime; } } public float FixedDeltaTime { get { return timeRatio * Time.fixedDeltaTime; } } public void Play() { if (!Paused) return; time = 0; timeRatio = Mathf.Max(0, stepCurve.Evaluate(0)); UpdatePhysicSpeed(); } public void Update() { if (Paused) return; time = Mathf.Min(time + Time.unscaledDeltaTime, stepDuration); if (time >= stepDuration) { timeRatio = 0; time = -1; UpdatePhysicSpeed(); return; } timeRatio = Mathf.Max(0, stepCurve.Evaluate(time / stepDuration)); UpdatePhysicSpeed(); } void UpdatePhysicSpeed() { Time.timeScale = timeRatio; Time.fixedDeltaTime = defaultFixedDeltaTime * timeRatio; } }
æãåºæ¬çãªãããã¿ã€ãã¯1æéåã§å®æãããã°ããã£ã±ãã§ãã
- ãã¬ã€ã€ãŒãšåŒŸäžžã®ç§»åã¯ãé床ã§ã¯ãªããtransform.positionãä»ããŠè¡ãããããããã¬ã€ã€ãŒã¯å£ã«å¯ãããã£ãŠãœãŒã»ãŒãžã䜿çšããŸãã
- æéã忢ããŠãç©ççŸè±¡ã¯åæ¢ããŸããïŒfixedDeltaTimeã¯å€æŽãããŸããïŒããããã£ãŠãäžæåæ¢ã¢ãŒãã§ã¯ããã£ã©ã¯ã¿ãŒã¯ãããã«ç§»åããŸãïŒçžäºã«ããã·ã¥ãããŸãïŒã
ãããããã®ããŒãžã§ã³ã§ããç§»åããŠæ®åœ±ããããšã¯ãã§ã«é¢çœãã§ãã ãã¡ãããæåã®ãããã¿ã€ãã¯å®å
šã«è¡šçŸäžå¯èœã§ãã

æåã®ãã¬ã€å¯èœãªãããã¿ã€ã
ãã ããç¿æ¥ã«ã¯ãã§ã«ã¿ã¹ã¯ã衚瀺ãããŸãã
ãããïŒ
- ãåå°ãå£ã远å ããŸãããããã匟䞞ãè·³ãè¿ããŸãã
- 匟䞞ãšã®è¡çªã§ãããã®ç Žå£ã远å ããŸãïŒæ¹æ³ã¯ããããŸããïŒã
- æè»ãªæé管çã远å ããŸãïŒãæéã®çµéã®é床ãã®æéãšæ²ç·ããããŸãããããã¯äžäŸ¿ã§ãïŒã
ä¿®æ£ïŒ
- transform.positionã§ã¯ãªããé床ã倿Žããããã«åããããçŽããŸãã
- å£ã§ã®åŒŸäžžã®äœæãçŠæ¢ããŸãïŒãã¬ã€ã€ãŒã¯å£ã«å¯ãããã£ãŠæã¡ã匟䞞ã¯ããã«ãã¬ã€ã€ãŒã殺ããŸãïŒã
TodoïŒçºæãããããã§ãã¹ãåŠç¿ã¬ãã«ãäœããŸãã
ã¬ãã«1.3 æåã®ã«ãŒã
éããæ©ããªããããã¹ãã¬ãã«ã®èšç»ãç«ãŠãŸããã
- å®å
šãªãšãªã¢ã ãã¬ã€ã€ãŒã¯æ©ãããšãåŠã³ããã¹ãŠã®åŒŸäžžã¯å£ã«è¡ããŸãã
- éã¢ã¯ãã£ããªæµãšã®çãå»äžã ãã¬ã€ã€ãŒã¯ããŒã«ãäžããæ»ææ¹æ³ãçè§£ããŸãã
- éã¢ã¯ãã£ããªçè³ãšæ°äººã®éè¡äººã«ããå»äžã®æ¡å€§ã å»¶é·-ã¿ãŒã³ã®åŸããã¬ã€ã€ãŒã誀ã£ãŠéè¡äººã«å
¥ãããšã¯ã§ããŸããã
- é¡ã®ä»£ããã«æœæé¡ã®åœ¢ã®å転-ã¿ãŒã³ã®èåŸã«ããåå°å£-éã¢ã¯ãã£ããªæµã ãã¬ãŒã€ãŒã¯å£ãæã¡ããªããŠã³ãã®ä»çµã¿ã確èªããŸãã
- é¡åŒµãã®å£ãæµãéè¡äººãããå»äžã ãã¬ã€ã€ãŒã¯å»äžãæ
éã«éãéããéè¡äººã«ã¶ã€ãããªãããã«ïŒãŸãã¯ãå¿
èŠã«å¿ããŠããããæã¡ãŸãïŒ;
- ãµã³ãããã¯ã¹
ã¹ããŒãžã«ãªããžã§ã¯ããæããåå°ããå£ãé»è²ã§å¡ãçŽããŸãã æ¬¡ã®ããã«ãªããŸãã

ãã¬ãŒãã³ã°ã¬ãã«ã®çš®é¡
å¥ã®ã¬ã€ã€ãŒã§åå°å£ãäœæãããšãé害ç©ãšè¡çªãã匟䞞ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
OnCollisionEnter2D void OnCollisionEnter2D(Collision2D coll) { int layer = 1 << coll.gameObject.layer; if (layer == wall.value) Destroy(gameObject); else if (layer == human.value) { Destroy(gameObject); var humanBody = coll.gameObject.GetComponent<Human>(); if (humanBody != null) humanBody.Kill(); return; } else if (layer == wallMirror.value) { Vector2 normal = Vector2.zero; foreach (var contact in coll.contacts) normal += contact.normal; direction = Vector2.Reflect(direction, normal); } }
ãã°ãä¿®æ£ããæçµæ¥ã«çºæãããããã远å ããŸãã Clockã¯ã©ã¹ãäœãçŽããŸããã以åã¯ãã³ãŒã¹ã¯å®éã®ç§ã®stepDurationã§ãããæéé床ã®ä¿æ°ã¯stepCurveã«ãŒãã«ãã£ãŠæ±ºå®ãããŸããã æ²ç·ã¯ãã³ãŒã¹ãã¹ã ãŒãºã«éå§ããã³çµäºããããã«å¿
èŠã§ãã

Clock.csã®å€ãèšå®
ãã ããã¹ãããŒã¯ã®ç¶ç¶æéã倿Žããå Žåã«ã®ã¿ãéå§/çµäºã®ç¶ç¶æéã倿ŽãããŸãïŒæ²ç·ã®çžŠåº§æšã1ã«çãããªãå ŽåïŒã ãŸããã¹ãããŒã¯ã®é·ããçãããå Žåãããªã³ãæéã¯éãããããã«èŠãã1ç§çšåºŠã®å Žåãé
ãããããã«èŠããŸãïŒæ²ç·ãç§»åã®é·ãå
šäœã«ããã£ãŠã䌞ã³ããããïŒã ã³ãŒã¹ã®éå§ãšçµäºãããã³éå§/çµäºã®ç¶ç¶æéã«åå¥ã®æ²ç·ã远å ããŸãã
ãã¬ãŒã€ãŒãç£èŠãããã¬ãŒã€ãŒã®è»è·¡ãèŠèŠåããã«ã¡ã©ã远å ããŸãã
ç®çã管çã説æããã«ããããã¿ã€ããæ°äººã®ç¥äººã«éãã«èŠããããšã 誰ããçµå¶é£ãçè§£ããããšãã§ããŸããããæ°ã¥ããŠããªãåé¡ããããŸãã ç§èªèº«ã®ããã«ããã¬ã€ãã¹ãã®çµè«ãæžãçããŸããã
- çãã®ã¯é£ããã§ãã æã®æåŸã®2ã€ã®äœçœ®ã®éã®ãã«ã¿ã䜿çšããŸããããå€ãã®å€ãååŸããå¿
èŠããããŸãã
- æã¯ç»é¢ãã¹ã¯ã€ãããã®ã«ããããããŸãã ã³ãŒã¹ã®æéãã¬ãã«ã®ãã¶ã€ã³ã«ãã£ãŠæ±ºãŸããŸãã
- æã
ãè¡ãããã¹ã¯ã€ããæ¶ããŸãã 人ã
ã¯ãåãããŸã çµãã£ãŠããªããšãã«ã¹ã¯ã€ããå§ããçŸåšã®åããæ¢ãŸã£ãŠããéã«æãé¢ããŸãã ãªããªã ã³ãŒã¹äžã«æ¹åãå€ããããšã¯ã§ããŸããããžã§ã¹ãã£ãŒã¯ç¡é§ã«ãªããŸãã ããã¯cãªã³ãŒãã«ãã£ãŠè§£æ±ºãããŸãïŒãŸã ã©ã®ã³ãŒããããããŸããïŒã
- 匟䞞ã«ãã£ãŠç Žå£ããããªããžã§ã¯ããäœæããã®ã¯ã¯ãŒã«ã§ãã 圌ãã¯æ¥è¿ããå¿
èŠããããŸãããçŽç·ã§ã¯ãããŸããã
- Ricochetã¯èå³ã远å ããŸãïŒçæ°ã®åŒŸäžžåµãæé
ã§ããŸãã
- ãã¬ã€ã€ãŒã¯éè¡äººãšæµãåºå¥ããŸããã ã¢ãŒãã§æ±ãããŸãã
ãããã¿ã€ãã®æºåãæŽã£ãŠããã®ã§ãã²ãŒã ãã¬ã€ãèŠããããšãã§ããŸãïŒ
TodoïŒèšå®ãã°ã©ãã£ãã¯ã¹ã決å®ããŸãã
ã¬ãã«1.boss [100hp]ã èšå®ãšèŠèŠã¹ã¿ã€ã«ã®éžæ
ç§ã®æåã®ããã¹ãã§ããããšã倿ããã®ã¯ãã®æ®µéã§ãããç§ã¯æ¬åœã«ããã¯æããŸããã§ããã ç§ã¯æ¬¡ã®ããšãèšç»ããŸããïŒäººæ°ã®ããã²ãŒã èšå®ã®ãããã¯ã§ã€ã³ã¿ãŒãããããµãŒãã£ã³ããã€ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã®åèæç®ãšã¢ãŒããæ¢ãããã¯ã»ã«ã¢ãŒãã®ã¬ãã«ãæãå§ããŸãã
ããã€ãã®ã°ãŒã°ã«ã®åŸãç§ã¯ãã¯ããªã¢æã®ã€ã³ã°ã©ã³ãã®åŽè¿ã«ç«ã¡å¯ãããšã«æ±ºããŸããã ã·ããæ»ã®ã«ã«ããæ²èŠ³çãªããã¯ã æšæãéå±ãèžæ°ãæ²¹ã
ç§ã¯æåã®ã¹ãã©ã€ããæããŠåé¡ãèŠã€ããããšããŸãã ã²ãŒã å
ã®ãã¹ãŠã®ãªããžã§ã¯ãã¯å転ã§ããŸãã ãããããåãã®ãšããããã¯ã»ã«ã¯ãããŸããã
åã¹ãã©ã€ãã®360ãªãã·ã§ã³ã®ã¬ã³ããªã³ã°ã¯ãæããã«ãªãã·ã§ã³ã§ã¯ãããŸããã 幞ããªããšã«ãã¹ãã©ã€ãããã®è»žãäžå¿ã«èªç±ã«å転ããå Žåãã¢ãŒãã¯ãäžæ£ãªãã¯ã»ã«ã¢ãŒããã§ã¯ãããŸããã ãã®å Žåãå¿
ç¶çã«çŸãããšã€ãªã¢ã·ã³ã°é段ã§äœãããããã¡ãã¡ã§ç¥å¥ªçãªè§ã®ããéå£ãšã¡ãã€ããåºãå¿
èŠããããŸãã ææ
¢ããŠèšãããšãã§ããŸãïŒãããã¯ç§ã®ã¹ã¿ã€ã«ã§ãïŒãããããã©ã€ã³ãã€ã¢ãã®ã¯ãªãšã€ã¿ãŒããã£ãããã«ïŒãããŠããããã£ãïŒïŒã ã¢ã³ããšã€ãªã¢ã¹ãæ¥ç¶ããããšãã§ããŸãïŒãéŠãã®è¯ãç³é¹žãé·çãïŒãã
ãããã«ããããšã€ãªã¢ã·ã³ã°ãšã©ããŒããŸãã¯ã¢ã³ããšã€ãªã¢ã·ã³ã°åŸã®ãã¡ãžãŒãšããžã®ãããããç§ã«èµ·ãããŸããã

ãã¯ã»ã«ã¢ãŒããã¹ã
ç§ã¯ãã¯ã»ã«ã¢ãŒããããŒã¯ããŸãïŒããããåéïŒïŒãããŠãåçŽåãåçŽåïŒ
TodoïŒé©åãªèŠèŠã¹ã¿ã€ã«ãéžæããŸãã
ã¬ãã«1.boss [75hp]ã 3Dãžã®ç§»è¡
çŽã®è¡ïŒ Wildfireã®äžçã«å°ã䌌ãŠããŸãã ãããã·ã³ãã«ã§ãã ç²ãçŽã®é«è²Žãªçœãçžãåºã®ãã³ãã®æç¹ããããã¯é¢çœãåžœåã®ãã£ã©ã¯ã¿ãŒã§ãïŒ

åç圢ã®äººã
å®éãç§ã¯ã²ãŒã éçºã§3Dã䜿çšããããšã¯ãªããæ°å¹Žåã«3Dãšãã£ã¿ãæåŸã«éããŸããã ããããç§ã¯å€ããç
§æãšåœ±ã«ãã£ãŠæ±ºå®ãããããšãç¥ã£ãŠããŸãã ç¹ã«ãã¯ã¹ãã£ãçœãçŽã§ããå Žåãæªãå
ã®å·ãæ¬åœã«é ãããšã¯ã§ããŸããã
å€ã¯æåã®ãªããžã§ã¯ãã§ããçä¹³ã®ããã±ãŒãžã®ã¢ããªã³ã°ã«è²»ãããŸãã ç§ã¯æšæºçãªã·ã§ãŒããŒãç
§æãæ±ã£ãŠããŸãã
çµè«ã¯ç°¡åã§ãïŒç§ã¯åŒã£åŒµããŸããã ã¢ããªã³ã°ã«å€ãã®æéãè²»ãããæšæºçãªããŒã«ã䜿çšããŠçŸããåçãæ®ãããšã¯ã§ããŸããã çç
ç
§æã¯åœ¹ç«ã¡ãŸãããé£è¡äžã«çç
ãããããå€ãã®ã¬ãã«ã®å°ããªããã¡ããäœãããã£ãã®ã§ãã ãã¹ã¯ãŸã æåããŠããªãããã§ãã......

ã·ã³ãã«ãªç
§æä»ããã«ã¯ããã°
ã¬ãã«1.boss [15hp]ã æç¶ãåçæã
ç§ã®é·æãšçæãæãåºããŸãã éåžžããããžã§ã¯ãã«ã¢ãŒããæç»ã§ããªãå Žåã¯ããããè¡ãã¹ã¯ãªãããäœæããŸãã 3Dãæªãã®ã¯ãªãã§ããïŒ æç¶ãåçæã§ãïŒ åºæ¬çãªããªããã£ãã¯ãå®éã«ã¯äœããªã§ãã ã²ãŒã ãã¬ã€ã®éããèŠèŠçã«ãšã³ã³ãŒããããé®®ããã§å¯Ÿç
§çãªè²ã
ã¬ãã«ãäœæããããã«å¿
èŠãªããªããã£ããæ±ºå®ããå¿
èŠããããŸãã ã·ãªã³ããŒãšãã¥ãŒããããããäºè§åœ¢...ããŒãã1ã€ã®ã³ãŒãã§çæã§ããã®ã¯ããã ãã§ãã åãããã«ïŒ
TodoïŒåçŽãªããªããã£ãçæãå®è£
ããŸãã
ã¬ãã«2.1 2Dã®æ£å€è§åœ¢
ãããŸã§ã®ãšãããã¬ãã«ã«ã¯ååãªéåžžã®ããªãŽã³ããããŸãã æåã«ã2Dã§è©ŠããŠã¿ãããšã«ããã«ã¡ã©ãçŽäº€ã¢ãŒãã«ããŠã2ã€ã®éšåããèŠçŽ ãäœæããŸããã
- æ¬äœïŒåãªãæ£å€è§åœ¢ïŒã¯çœã§ãã
- è²ä»ãã®ãªããžã§ã¯ãã®ã¿ã€ãã瀺ãè²ä»ãã®ãªã³ã°ïŒè¡çªæã®åŒŸäžžã®åäœïŒã
ãžãªã¡ããªãå¿ããªãã§ãã ããïŒãã¹ãŠã®ããªãŽã³ã«ãªã³ã°ã®äžå®ã®ååŸã䜿çšãããšããããã®å€åœ©ãªèŒªéãåŸãããŸãã

ç°ãªãåãã®èŒªé
å®éã«ã¯ãããªã³ã°ãã®å€åŽéšåãšå
åŽéšåã®åŽé¢éã®è·é¢ãåãã«ããå¿
èŠããããåŽé¢ã§ã¯ãªãã³ãŒããŒã§äœæ¥ããŸãã å€è§åœ¢ã®è§åºŠãå°ããã»ã©ã倿¥åãšå
æ¥åã®ååŸã倧ããç°ãªãããããã£ãŠã蟺éã®è·é¢ãšè§éã®è·é¢ã倧ããç°ãªããŸãã
$ inline $ 1-cos \ frac {\ pi} {edges} $ inline $ -åé¡ã解決ããŸãã
è§åºŠãå°ããã»ã©ã茪éãåºããªããŸãã

åãåãã®èŒªé
å°ãã®ã¹ãã³ã·ã«ããžãã¯ã«ãããä»ã®ããªãŽã³ã®å
åŽã«ãªã³ã°ã衚瀺ãããããã®ãããªããããåŸãããŸãã

ãããŒ
ãããŠå転ããŸããïŒ
äœã«æšæºã®ã»ã«ã©ãŒãã¯ã¹ãã£ã远å ããè²ãæŸãäžããŸããããæçµçã«æµæããããšãã§ããããæ°ã«å
¥ãã®åœ±ãã€ãªããŸããïŒæ¢ã«äœããã®åœ¢ã§æžããŸããïŒã

ã·ã³ãã«ã§ãããã
ç§ã¯ã¹ã¯ãªãŒã³ãå°å¥³ãšå
±æããåççãªãã£ãŒãããã¯ãåŸãŸãããé«ããªããžã§ã¯ãããäœããªããžã§ã¯ãã«èœã¡ã圱ã«ã¯æªã¿ããããããããŸãã ç§ã¯åæããŸããç§ã¯åžžã«ãããçŸå®ã®äžçã§èŠãŠããŸãã ç§ã¯çŽã«æããŠããããã®æªã¿ãã©ã®ããã«èŠããããçè§£ããããšããŸãã ãããŠãç§ã¯çè§£ããŠããŸãïŒã«ã¡ã©ãçŽäº€ããŠããå Žåãã©ã®ãããªæªã¿ã§ããïŒ

ããŒã¹ãã¯ãã£ãã«ã¡ã©ã䜿çšãã巊圱ãçŽäº€ã䜿çšããå³åœ±
ç§ã®çŸãã圱ã¯ããããã®å¹³ããªå€èгã匷調ããã ãã§ããããšãããããŸããã 3Dã§æ»ã£ãŠããæéã§ãã
ã¬ãã«2.2ã 3Dã®æ£å€è§åœ¢
æ£çŽãªãšããã3Dã§ã®æç¶ãçæã¯ãç§ã«ãšã£ãŠãŸã£ããæ°ããçµéšã§ãã äžæ¹ã2Dãšéãã¯ãããŸããã
ãŸããç¹å®ã®ããªãŽã³ã®èšå®ã決å®ããŸããã
- height-é«ã ;
- ãšããž - ãšããžã®æ°ã
- size -Vector2DãããªãŽã³ã®ãµã€ãºãèšå®ãããã軞ã®1ã€ã«æ²¿ã£ãŠã¹ãã¬ãããããã§ããŸãã
- isCircle-ããã¯ã·ãªã³ããŒã§ããïŒ ãã®å Žåãé¢ã®æ°ã¯ååŸã«åºã¥ããŠèªåçã«èšå®ãããsize.yã¯size.xãšçãããªããŸãã
ãŸããäžè¬çãªèšå®ã§ã¯ãã²ãŒã ãªããžã§ã¯ãã®1ã€ã®ã¿ã€ãã§åãã«ãªããŸãã
- ã倩äºãã®è²ã
- å¢çç·ã®è²;
- ããŒããŒå¹
ã
- ã·ãªã³ããŒå
ã®é¢ã®æå°æ°ã
- ã·ãªã³ããŒã®é¢ã®æ°ãšåšå²ã®1åäœã®æ¯çã
次ã«ããããã®ããªãŽã³ãäœæããŸãã ããããã3ã€ã®ã¡ãã·ã¥ã«åå²ããŸããã
- æ¬äœ-äžåº;
- ããŒããŒ-äžéšããŒã¹ã®è²ä»ããªã³ã°;
- åŽé¢-åŽé¢;
äœãããŒã¹ãçæããŠãæå³ããããŸããããªããªãã ãªããžã§ã¯ããx軞ãŸãã¯yè»žã«æ²¿ã£ãŠå転ãããããšã¯ã§ãããã«ã¡ã©ã¯åžžã«å°å³ã®äžã«ãããŸãã

ãã®ãããªããªãŽã³ãååŸããŸã
æé©åã®æéïŒ
ãŸããç¹å®ã®è§åºŠã§å転ããåäœãã¯ãã«ãåžžã«èšç®ããŸãã
1ã€ã®ãããªãã¯ã¡ãœããã§AnglesCacheã¯ã©ã¹ãäœæããŸãã
namespace ObstacleGenerators { public class AnglesCache { public Vector3[] GetAngles(int sides); } }
次ã«ãéèŠãªãã©ã¡ãŒã¿ãŒïŒèŸºã®æ°ãè²ãåã§ãããã©ãããªã©ïŒã䜿çšããããŒãšããŠã3çš®é¡ãã¹ãŠã®ã¡ãã·ã¥ããã£ãã·ã¥ããŸãã è²ãäžçªäžã«ä¿ã¡ãŸããããã«ãããã¡ãã·ã¥ã«1ã€ã®ãããªã¢ã«ã䜿çšã§ããããã«ãªãããã®çµæãåçãªãããåŠçãå¯èœã«ãªããŸãã
確ãã«ãããŒããŒãšã¹ãã³ã·ã«ã«ã¯åé¡ããããŸããã¹ãã³ã·ã«ã䜿çšããŠããŒããŒãçµåããŠããŸããããããªã¥ãŒã ãããããããã®ã¢ãããŒãã§ã¯äžååãªçµæã«ãªããŸãã

ããé«ãåæ±ã®å¢çã¯æç»ãããŸããã äžã¯äœãã·ãªã³ããŒã®ããŒã¹ã§ã
ã¹ãã³ã·ã«ãããã¡ãŒã®äœ¿çšã忢ããŸãã ããã§ããã¹ãŠã®å¢çç·ãå¿
ãæç»ãããŸãã

ã¹ãã³ã·ã«ãããã¡ãŒãªã
æåŸã«ãããŒããŒã·ã§ãŒããŒã®ZTestèšå®ãOn ïŒ LEqual ïŒããLessã«å€æŽããŸãã åãé«ãã®ã·ãªã³ããŒã®äžéšã«å¢çç·ãæç»ãããªããªããŸããã ãã®çµæãé«ãã®ç°ãªããªããžã§ã¯ãã§æ£ããæ©èœãããã¡ããšããããŒããŒããŒãžãåŸãããŸãã

ZTestã®èšå®ã«ããå¢çç·ã®ããŒãž
æåŸã«ãæåŸã®ä»äžãïŒ
- äžç座æšãåæ±ã®ããŒã¹ã®UV座æšãšããŠäœ¿çšããŸãã ãã¹ãŠã®ãªããžã§ã¯ãã«ã¯ãç¶ãç®ã®ãªãå
±éã®ãã¯ã¹ãã£ããããŸãã
- ãã€ã©ã€ããããå¢çç·ã®è²ã§åŽé¢ããã€ã³ãããŸãã
- _fixed3 _LightPositionãåŽé¢ã®ã·ã§ãŒããŒã«è¿œå ããåŽé¢ãå°ãæããããŸãïŒ Guroãçè²ããå€å
žçãªæ¹æ³ ïŒã ããã§ããšããã§ãisCircleãã©ã°ã¯ãªããžã§ã¯ãã§åœ¹ç«ã¡ãŸãããèšå®ãããŠããªãå Žåãåäžè§åœ¢ã¯äžæã®é ç¹ãæã¡ãèšå®ãããŠããå Žåãé ç¹ã¯å
±éã§ãã ãã®çµæãæ³ç·ã¯è£éãããisCircleã®æ»ãããªè¡šé¢ãåŸãããŸãã
ç
§æãã¹ã ãŒãžã³ã°ãã·ã§ãŒããŒãã¯ãŒã«ãUV座æšã ïŒæåºŠãäžããããã«ç
§æããã匷ãããããŸãïŒ
æåŸã®ä»äžã-ç®çã®åœ¢ç¶ã®PolygonCollider2DããªãŽã³ãçæããŸãã
åèšïŒç©çåŠãšãã¡ããšããããŒããªã¹ã¿ã€ã«ã®3次å
ããªãŽã³ã
TodoïŒåœ±ã
ã¬ãã«3.1ã 圱
ãã¡ãããä»ã§ã¯ä»¥åã®2次å
ã®åœ±ã¯æ©èœããŸããã

å¹³ããªåœ±ã¯å¥åŠã«èŠãã ãªããžã§ã¯ãã®ããªã¥ãŒã ãèæ
®ããªãã§ãã ãã
ãããŠã次ã®ããã«ãªããŸãã
ãããªã¢ã«ãªåœ±ã
ãããŠãåé¡ã¯äœã§ããïŒã -ãé¡ãããŸãã ãUnity3Dã«ã¯çŽ æŽããã圱ããããŸãïŒã
確ãã«ãããŸãã ã·ã£ããŠãããã³ã°ã¢ã«ãŽãªãºã ã¯ã ã·ã£ããŠã®æ§ç¯ã«ã®ã¿äœ¿çšãããŸãã ç°¡åã«èšããšãå
æºããã·ãŒã³ãèŠããšã衚瀺ãããŠãããã¹ãŠã®ãªããžã§ã¯ããç
§ããããŠãããäœãã§éããããŠãããªããžã§ã¯ãã¯é°ã«ãªã£ãŠããŸãã å
æºã®åº§æšã«ã«ã¡ã©ãé
眮ããã·ãŒã³ãã¬ã³ããªã³ã°ããããšã«ãããã·ã£ããŠããããäœæã§ããŸãïŒå
æºãŸã§ã®è·é¢ã®ããŒã¿ãzãããã¡ãŒã«è¡šç€ºãããŸãïŒã åé¡ã¯é è¿æã®æªã¿ã§ãã ãªããžã§ã¯ããå
æºããé ããªãã»ã©ãã·ã£ããŠãããã®ãã¯ã»ã«ã«å¯Ÿå¿ããç»é¢ãã¯ã»ã«ãå€ããªããŸãã
ã€ãŸã 圱ã¯ããã¯ã»ã«ããŒãã§ã¯ããã§ã¯ãããŸãããããã¯ãããã§ã¯ãããŸãããããã«éèŠãªã®ã¯ãéåžžã«é«éã§ãã éåžžããã¯ã¹ãã£ã®ããè€éãªãªããžã§ã¯ãã«åœ±ãéãããããããæªã¿ã®åé¡ã¯ãããŸããããã®çµæãå質ã®ããããªäœäžã¯ç®ç«ã¡ãŸããã ããããç§ã¯éåžžã«æãããã¯ã¹ãã£ãéåžžã«å°ãªãããªãŽã³ãæã£ãŠããã®ã§ã圱ã®äœå質ãã¯ã£ãããšèŠããŸãã
ãã ããè¯ã解決çããããŸãã ã ã·ã£ããŠããªã¥ãŒã ããšåŒã°ããã¢ã«ãŽãªãºã ãåŒã³åºããã以åã®èšäºã§è¡ã£ã2次å
ã®ã·ã£ããŠã«éåžžã«ãã䌌ãŠããŸãã
å
æºãã圱ãèœãšãäœããã®ã¡ãã·ã¥ããããšããŸãã
- ãã®ã·ã«ãšããã®é¢ïŒã¡ãã·ã¥ã®ç
§ããããéšåãšç
§ããããŠããªãéšåãåé¢ããé¢ïŒãèŠã€ããŸãã
- å
æºãããããããåŒãåºããŸããïŒåé¢ã2ã€ã®äžè§åœ¢ã«å€ãããŸãïŒã
- ãããã®ãã¹ãŠã®çްé·ãé¢ãæç»ããŸãïŒã«ã©ãŒãããã¡ãŒã«ã¯äœãæžã蟌ãŸããzãããã¡ãŒããã®ã¿èªã¿åããŸãããã¹ãã³ã·ã«ã«æžã蟌ã¿ãŸãïŒã
3.1ã äžè§åœ¢ã®æ³ç·ãã«ã¡ã©ïŒæ£é¢ïŒã«åããããŠããå ŽåïŒã¹ãã³ã·ã«ãããã¡ãŒã«1ã€è¿œå ããŸãã
3.1ã äžè§åœ¢ã®æ³ç·ãã«ã¡ã©ããé ãããæ¹åïŒåŸãïŒã®å ŽåïŒã¹ãã³ã·ã«ãããã¡ãã1ãåŒããŸãã
圱ã1åïŒæ£é¢ã®äžè§åœ¢ã暪åãïŒãš1ã€ïŒãå·ŠãïŒèé¢ã®äžè§åœ¢ã暪åãïŒïŒã«ãå
¥ãããå Žåãã¹ãã³ã·ã«ã®å€ã¯çãããªããŸãã $ã€ã³ã©ã€ã³$ -1 + 1 = 0 $ã€ã³ã©ã€ã³$ ãã¯ã»ã«ãç¹ç¯ããŸãã 圱ã«äœåºŠãå
¥ã£ãå ŽåïŒåãšåãšã®éã«ãzãããã¡ãŒã«ããŒã¿ãæç»ããèšé²ãããããçš®ã®äžè§åœ¢ãããå ŽåïŒ-ãã¯ã»ã«ã¯åœ±ã«ãããæããããå¿
èŠã¯ãããŸããã
ãã®ããããªããžã§ã¯ãããã·ã£ããŠã¡ãã·ã¥ãååŸããã·ã§ãŒããŒãééããå¿
èŠãªããŒã¿ãã¹ãã³ã·ã«ã«è¿œå ããŠãããã¹ãã³ã·ã«ããŒã以å€ã®å€ãæã€ã·ã£ããŠãæç»ããå¿
èŠããããŸãã ã·ã§ãŒããŒã§è§£æ±ºããã¿ã¹ã¯ã®ããã«èãããŸãïŒ
TodoïŒã·ã§ãŒããŒã§ã®ã·ã£ããŠçæã
ã¬ãã«3.2ã é ç¹ã·ã§ãŒããŒã®åœ±
ãžãªã¡ããªã·ã§ãŒããŒã¯äœ¿çšããŸããã§ãããGLããŒãžã§ã³ãå€ããããäžéšã®ããã€ã¹ã倱ããããããŸããã ãããã£ãŠããã¹ãŠã®æœåšçãªé¢ã¯ãåããªãŽã³ã«å¯ŸããŠäºåã«ãã€ã¯åŠçããå¿
èŠããããŸãã
ç®è¡å32è§ã®åæ±ããããšããŸãã åé¢ã¯ãåèš2ã€ã®äžè§åœ¢ãš4ã€ã®é ç¹ã«å€ãããŸãã
åèšé¢-åŽé¢32ã2ã€ã®ããŒã¹ã®ããããã«32ãåèš96ã
ãããã£ãŠã96 * 2 = 192åã®äžè§åœ¢ãšã·ãªã³ããŒããã384åã®é ç¹ã ããªãããããã
å®éãããã«å€ãïŒæåã¯ãåŽé¢ã®ã©ããå
ãã圱ãžã®ç§»è¡ïŒåé¢ïŒã§ããããããã³ã©ã®åŽé¢ã圱ããå
ãžã®ç§»è¡ïŒèé¢ïŒã§ããããç¥ããŸããã ãããã£ãŠãåŽé¢ããšã«2ã€ã®äžè§åœ¢ãäœæããå¿
èŠã¯ãããŸãããã4ã€ïŒæ³ç·ã®å察æ¹åã«2ã€ïŒã«ãããšãåŸã§ã«ã«ããã¯ãŸãã¯ã«ã«ããã³ãã䜿çšããŠå¿
èŠãªäžè§åœ¢ãæ£ããåæã§ããŸãã
ãããã£ãŠã32 * 4 = 128ã®é¢ã256ã®äžè§åœ¢ãããã³512ã®é ç¹ã æ¬åœã«ããããã
ã¡ãã·ã¥ã®äœæã¯éåžžã«ç°¡åã§ãããã«çŠç¹ãåãããŸããã
ããããã·ã§ãŒããŒã¯éåžžã«å¥œå¥å¿ã匷ãã§ãã
èªåã®å€æïŒãã¹ãŠã®é¡ãæãå¿
èŠã¯ãªããã·ã«ãšããã®é¡ïŒå
ãšåœ±ãå
±æããé¡ïŒã ããæãå¿
èŠããããŸãã ãããã£ãŠãé ç¹ã·ã§ãŒããŒã®åé ç¹ãå¿
èŠã§ãã
- åã®é¡ã®äœçœ®ãèŠã€ããŸãã
- çŸåšã®é¢ãšåã®é¢ãéãç·ã®AãBãCã®å€ãèšç®ããŸãã
- ããªãŽã³ã®äžå¿ãç·ã®ã©ã¡ãåŽã«ããããæ±ºå®ããŸãã
- å
æºãç·ã®ã©ã¡ãåŽã«ãããã倿ããŸãã
- 次ã®ãã¡ã»ããã«å¯ŸããŠæé 1ã4ãç¹°ãè¿ããŸãã
- å€ãæ¯èŒããŸã-ã©ã€ãã®é¢ã®1ã€ïŒäžå¿ãšå
æºãç°ãªãåå¹³é¢ã«ããå ŽåïŒãšã·ã£ããŠã®ãã1ã€-ãã®é ç¹ã¯ã·ã«ãšããã§ãããæç»ããå¿
èŠããããŸãã
- çŸåšã®é ç¹ãæ¡åŒµããå¿
èŠããããã©ããããŸãã¯ãããåæ±èªäœã«ãããã©ããã調ã¹ãŸãã
- ã¹ãã¬ããããå¿
èŠãããå Žåã¯ãã¯ãŒã«ã座æšã§é ç¹ã®äœçœ®ãèŠã€ããå
æºããæ¹åãååŸãããã®æ¹åã«ç¹å®ã®è·é¢ïŒããšãã°ã100åäœïŒã«ç§»åããŸãã
ãããã®ãã¹ãŠã®èšç®ã§ã¯ã倧éã®ããŒã¿ãäžéšã«ä¿åããå¿
èŠããããŸãã
åãšæ¬¡ã®é ç¹ãžã®åº§æšïŒãŸãã¯ãªãã»ããïŒããã©ã°-çŸåšã®é ç¹ããªãã»ãããããã©ããã
åãããšãæ³åããŠãã ããïŒ
ãã ãããã®ã·ã£ããŠäœææ¹æ³ã«ã¯èŽåœçãªæ¬ é¥ãå€ãå«ãŸããŠãããããæ²ãããªããŸãã
- èšå€§ãªæ°ã®é ç¹ãšäžè§åœ¢ã ã»ãšãã©ã®å Žåã圱ã¯2ã€ã®åŽé¢ã§æ§æãããŸããååã¯äžé¢ãååã¯äžé¢ã§ãã 32åã®ç³çã·ãªã³ããŒãšç¡éé ã®å
æºã®å Žåã $ã€ã³ã©ã€ã³$ 16 * 4 = 64 $ã€ã³ã©ã€ã³$ ãã€ã³ããš $ã€ã³ã©ã€ã³$ïŒ16 * 2 + 2ïŒ* 2 = 68 $ã€ã³ã©ã€ã³$ äžè§åœ¢ã 代ããã«ã256åã®äžè§åœ¢ãš512åã®é ç¹ããããªã«ãŒãã«äžããŸãã
- ãããåŠçã¯æ©èœããŸããã é ç¹ã®åœ±ãèšç®ããã«ã¯ã飿¥ããé ç¹ïŒäœçœ®ãšæ³ç·ïŒã«é¢ããæ
å ±ãäœããã®æ¹æ³ã§ä¿åããå¿
èŠããããŸãã ãããã£ãŠãããŒã¿ã¯ã¡ãã·ã¥ç©ºéã®ããŒã«ã«åº§æšã«é¢é£ä»ããããŸãã ãããåŠçãè¡ããšãå€ãã®ã¡ãã·ã¥ãçµåããïŒåº§æšç³»ãã¯ãŒã«ãã¡ãã·ã¥ã«å€æŽãããŸãïŒãé ç¹ã«ã¯é£æ¥ãã€ã³ãã®äœçœ®ã«é¢ããæ
å ±ããªããªããŸãã
å£ãããããåŠçã¯æ¬¡ã®ããã«ãªããŸãã 倿°ã®ããŒã¯ãéžæããæ¹æ³ã®äžå¿«ãªçµæã§ããããšã倿ããŸããããå£ãããããåŠçãæåŸã®éã«åœãããŸãããã¢ãã€ã«ããã€ã¹ã®ã·ã£ããŠã«å¯Ÿãã100ã200ã®åŒã³åºãåŒã³åºãã¯åãå
¥ããããªãçµæã§ãã ã©ããããã·ã£ããŠã®èšç®ãCPUã«å€æããå¿
èŠããããŸãã ããããããã¯èŠããã»ã©æªãã§ããïŒ :)
Todo: CPU.
Level 3.2. cpu
.
:
1.1ã ;
1.2ã ;
1.3ã ;
1.4ã , â , (lightToShadowIndex);
1.5.1 , , (shadowToLightIndex);
:
2.1ã lightToShadowIndex shadowToLightIndex 2 (, 4-, 2 , 2 â , );
:
3.1 shadowToLightIndex lightToShadowIndex 2 ;
- :
4.1 shadowToLightIndex lightToShadowIndex;
:
, ( ).
: , .
, . , 60fps 10 , 600 . ( â 6 10 ).
Todo: , 60fps nexus 5.
Level 3.3.
:
â , . , .
:
. AnglesCache, . :
using UnityEngine; using System.Collections.Generic; namespace ObstacleGenerators { public class AnglesCache { List<Vector2[]> cache; const int MAX_CACHE_SIZE = 100; public AnglesCache () { cache = new List<Vector2[]>(MAX_CACHE_SIZE); for (int i = 0; i < MAX_CACHE_SIZE; ++i) cache.Add(null); } public Vector2[] GetAngles(int sides) { if (sides < 0) return null; if (sides > MAX_CACHE_SIZE) return GenerateAngles(sides); if (cache[sides] == null) cache[sides] = GenerateAngles(sides); return cache[sides]; } public float AngleOffset { get { return Mathf.PI * 0.25f; } } Vector2[] GenerateAngles(int sides) { var result = new Vector2[sides]; float deltaAngle = 360.0f / sides; float firstAngle = AngleOffset; var matrix = Matrix4x4.TRS(Vector2.zero, Quaternion.Euler(0, 0, deltaAngle), Vector2.one); var direction = new Vector2(Mathf.Cos(firstAngle), Mathf.Sin(firstAngle)); for (int i = 0; i < sides; ++i) { result[i] = direction; direction = matrix.MultiplyPoint3x4(direction); } return result; } } }
:
( ). , c .
:
Transform.TransformPoint transform.localToWorldMatrix MultiplyPoint3x4.
Vector3 Vector2 ( , ), , :
Vector2 v2; Vector3 v3;
, , , .
:
. , , :
- (size.x == size.y);
- .
, â . â .
:
, : size.x == size.y ;
- :
direction = lightPosition - obstacleCenter;
- LCT (L â , C â , T â , L) LC, CT (). deltaAngle â LC CT;
- directionAngle â ( OX) LC;
- firstAngle , secondAngle â LT:
firstAngle = directionAngle - deltaAngle; secondAngle = directionAngle + deltaAngle;
- , â 360° / edges, â z:
fromLightToShadow = Mathf.FloorToInt(firstAngle / pi2 * edges + edges) % edges; fromShadowToLight = Mathf.FloorToInt(secondAngle / pi2 * edges + edges) % edges;
- , . , firstAngle : , . , , (fromLightToShadow fromShadowToLight), :
if (linesCache[fromLightToShadow].HalfPlainSign(lightPosition) < 0) fromLightToShadow = (fromLightToShadow + 1) % edges; if (linesCache[fromShadowToLight].HalfPlainSign(lightPosition) >= 0) fromShadowToLight = (fromShadowToLight + 1) % edges;
. â (Acos, Atan2) . â . , . , :
.
bool CanUseFastSilhouette(Vector2 lightPosition) { if (size.x != size.y || edgesList != null) return false; return (lightPosition - (Vector2)transform.position).sqrMagnitude > size.x * size.x; } bool FindSilhouetteEdges(Vector2 lightPosition, Vector3[] angles, out int fromLightToShadow, out int fromShadowToLight) { if (CanUseFastSilhouette(lightPosition)) return FindSilhouetteEdgesFast(lightPosition, angles, out fromLightToShadow, out fromShadowToLight); return FindSilhouetteEdges(lightPosition, out fromLightToShadow, out fromShadowToLight); } bool FindSilhouetteEdgesFast(Vector2 lightPosition, Vector3[] angles, out int fromLightToShadow, out int fromShadowToLight) { Vector2 center = transform.position; float radius = size.x; Vector2 delta = center - lightPosition; float deltaMagnitude = delta.magnitude; float sin = radius / deltaMagnitude; Vector2 direction = delta / deltaMagnitude; float pi2 = Mathf.PI * 2.0f; float directionAngle = Mathf.Atan2(-direction.y, -direction.x) - anglesCache.AngleOffset - transform.rotation.eulerAngles.z * Mathf.Deg2Rad; float deltaAngle = Mathf.Acos(sin); float firstAngle = ((directionAngle - deltaAngle) % pi2 + pi2) % pi2; float secondAngle = ((directionAngle + deltaAngle) % pi2 + pi2) % pi2; fromLightToShadow = Mathf.RoundToInt(firstAngle / pi2 * edges - 1 + edges) % edges; fromShadowToLight = Mathf.RoundToInt(secondAngle / pi2 * edges - 1 + edges) % edges; return true; }
:
cpu, . , , 32 , , 42 36 ( 512 256 gpu).
:
, . â "" . , .
:
x y ( ) â c , .
bounding box:
Mesh.RecalculateBounds â . AABB .
:
- 4 : circleCenter â lightPosition, ;
- 4 â 4-, z ( 8 â , );
- .
- ( , z == 0)
- 16 â , ;
- AABB .
, , .

( )

( )

Bounding box ( )
, , .
ãããã«
, , . ïŒ
, , , . , , :
- ;
- ;
- .
:
- , , ;
- â ;
- 3 â , ;
- â .
- (, Gizmos), .
, ! ïŒ