יישום זיהוי פגיעות באמצעות מפות אריחים
סביבת אימות
- חלונות
-
- חלונות 11
- עורך Unity
-
- 2021.3.3F1
- חבילת מערכת קלט
-
- 1.3.0
תנאים מוקדמים לטיפ זה
ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.
מהם התנאים המוקדמים לטיפ זה?
- יצירת מפה דו-ממדית מלמעלה למטה באמצעות מפות אריחים סטנדרטיות של Unity
- טיפול בהתנגשות עם פיזיקה סטנדרטית (2D)
אודות השאלת חומרי מפה
אנו מעבדים בהשאלה מהאתרים הבאים.
יישום דמויות מהלכות
ראשית, הטמיעו מפה ודמות שמבצעת זיהוי פגיעות. ניתן להזיז תו זה באמצעות מקשי הסמן בלוח המקשים. עם זאת, אם אתה מיישם הליכה נכונה, זה יהיה ארוך ורחוק מהמהות של טיפים הספר, אז הפעם אני רק להזיז תמונה אחת פשוטה.
אם ברצונך ליישם הנפשות הליכה, עיין בעצות הבאות:
לאחר יצירת הפרויקט, הוסף תמונת ספרייט של האובייקט שברצונך להעביר לפרוייקט.
בחרו בתמונה וקבעו את האפשרות 'פיקסלים ליחידה' על 32 מהמפקח. הסיבה לכך היא שהגודל של ריבוע אחד של שבב המפה הוא 32 פיקסלים, כך שהוא מתאים לזה. לאחר התצורה, לחץ על כפתור "החל" למטה.
מקם את הספרייט בתצוגה.
צור סקריפט כדי להזיז את הספרייט. זה דומה לטיפים הבאים:
השאר את שם Player
הסקריפט כ- .
קוד כדלקמן:
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
// スプライトの移動処理
if (keyboard.leftArrowKey.isPressed)
{
transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
transform.Translate(0, -0.1f, 0, Space.World);
}
}
}
חברו לספרייט שאתם רוצים להזיז.
הפעל את המשחק ובדוק אם ברצונך להזיז אותו באמצעות המקלדת.
הכנת MapTips
קודם כל, נכין שבב מפה וניצור מפה. הליך זה דומה לעצות הבאות: MapTips עם תוספות 2D Tilemap מסוגלים גם לזהות התנגשות, אבל הם לא ישמשו במאמר זה כי ההליך יהיה ארוך.
הכן את התמונה המקורית של MapTip והוסף אותה לפרוייקט. כדי להפוך את הפעולה לקלה יותר להבנה, אנא הכינו "מקום שניתן לטייל בו" ו"מקום שאינו ניתן להליכה" עבור חומר שבב המפה.
הגדר אותו עבור MapChips במפקח ולחץ על הלחצן החל. לאחר קביעת התצורה, פתח את עורך ספרייט.
זה טיפ מפה של 32 פיקסלים, אז אני אפצל אותו ל-32.
בחר בכרטיסיה לוח אריחים. אם לא, הצג אותו עם "חלון > 2D -> לוח אריחים" מהתפריט. צור לוח צבעים חדש. השם שרירותי, אבל לעת עתה נקרא לו "MapChipPalette".
צור תיקיית MapChipPalette בסצינות וציין אותה.
הוסף תיאור מפה על-ידי גרירתו ללוח הצבעים. שמור אותו בתיקיה MapChipPalette שיצרת קודם לכן.
יצירת מפה
הפעם, שיפוט פגע המפה יבוצע ביחידות של "Tilemap". לכן, ניצור שני Tilemaps, "Tilemap ללא זיהוי פגיעה" ו "Tilemap עם זיהוי פגיעה".
תחילה, צור שתי מפות אריחים בהירארכיה. ניתן ליצור שניים ברשת. השמות הם "TilemapObeject" ו- "TilemapGround" לשם הבהרה.
ראשית, ליצור "TilemapGround". מאז זה טווח מטלטלין, אתה יכול פשוט להניח את הקרקע. אם זה על הקרקע, אתה יכול לשנות את התבנית.
אגב, אם התו מוסתר, בחר בעצם התו והגדר את סדר השכבות של המפקח Sprite Renderer
על 2.
סדר השכבות הוא 0 כברירת מחדל ומפת האריחים היא 0, כך שאם תגדיל אותה מעל ערך זה, היא תוצג בחזית.
לאחר מכן בחר TilemapObject ומקם את תיאור המפה שברצונך ליצור ללא תנועה. קבעו תחילה את סדר השכבות על 1. זאת כדי לגרום לו להופיע מול הקרקע.
ככה זה נראה אם מסתירים את האדמה.
כמובן, בשלב זה, אין הגדרות הקשורות לזיהוי התנגשות, כך שתוכל לרכוב על קרקע גבוהה בדרך כלל. לאחר מכן, נקבע את זיהוי ההתנגשות.
הגדרות זיהוי התנגשות
ראשית, בואו נגדיר את הדמות. הגדרה זו כמעט זהה לטיפים הבאים, ולכן אדלג על הפרטים ואסביר בקצרה את ההליך.
בחר אובייקט תו מההירארכיה ובחר Physics 2D -> Circle Collider 2D מתוך Add Component. אם צורת האובייקט מלבנית, "Box Collider 2D" בסדר.
באופן דומה, הוסף "פיזיקה 2D -> Rigidbody 2D".
הגדר את סולם הכבידה ל- 0 כדי למנוע Rigidbody 2D
נפילה אוטומטית.
סמן את Z תחת אילוצים כדי למנוע מהספרייט להסתובב בעת התנגשות.
לאחר מכן, בחר "TilemapObject" שברצונך להכות ובחר "Tilemap -> Tilemap Collider 2D" מתוך "הוסף רכיב".
זה כל מה שיש בזה. אתה אפילו לא צריך שום תכנות. הפעל את המשחק ונסה לפגוע בחפץ שהופך לקיר. אני חושב שאתה יכול לוודא שזה מפסיק כמו שצריך.
עם זאת, כאשר אתה באמת מכה את זה, אני חושב שיהיו נקודות של דאגה בהתנהגות. הנה כמה פתרונות:
התנהגות לא נוחה של זיהוי פגיעות עם המפה והפתרונות
כאשר אתה נתקל בקיר, אתה עשוי למצוא כמה דברים שמטרידים אותך.
אם תזוז אל הקיר, תיתפס באמצע
Box Collider 2D
אני חושב שזה יקרה אם אתה משתמש בחפץ.
לדוגמה, מהסצנה למטה, כאשר אתה לוחץ על המקש בפינה השמאלית התחתונה, ברצונך שהוא ינוע שמאלה לאורך הקיר. עם זאת, לאחר התקדמות מסוימת, אני חושב שזה ייתקע במשהו ויפסיק.
זיהוי שקעים בקירות לפי מיקום
Circle Collider 2D
אני חושב שקל להבין אם אתה מצרף .
הקיר צריך להיות שטוח, אבל אם תזיזו אותו אל הקיר, תראו שהקיר זז כאילו הוא לא אחיד.
גורם ופתרונות ל snags ו bumps
נראה כי הסיבה לכך היא ש"קביעת פגיעה מבוצעת על בסיס שבב מפות". למעשה, בעת בחירת TilemapObject, מופיע קו ירוק במקום שבו נמצא זיהוי הפגיעה, וניתן לראות שזהו קו שצויר ביחידות MapTip.
לכן, אם האובייקט הנע נמצא על קו שווה ערך לשבב מפה אחד בדיוק, הוא יישפט כלהיט עם שבב מפה אחד. אם תתנגש בגבול שבבי המפה, שני שבבי מפה ייפגעו ויישפטו, כך שעוצמת הקפיצה תגדל.
אני חושב שהדרך הטובה ביותר לפתור בעיה זו היא לשלב את זיהוי הפגיעות עם שבבי המפות המצורפות. כך תוכל לעשות זאת:
בחרTilemap Collider 2D
"TilemapObject" עם זיהוי להיטים מהמפקח ובדוק "השתמש ב- composite" מתוך .
כפי שצוין באזהרה, זה לבדו אין השפעה, אז בחר "פיזיקה 2D -> Composite Collider 2D" מתוך "הוסף רכיב".
Rigidbody 2D נוסף יחד עם Composite Collider 2D.
זה קצת מבלבל, אבל אני חושב שאתה יכול לאשר שהקו הירוק בגבול בין שבבי מפות עם זיהוי פגיעות נעלם.
אני לא רוצה שמפת האריחים תזוז, אז אשאיר Rigidbody 2D
את סוג הגוף של הרכיב כ"סטטי".
עכשיו הפעל את המשחק ונסה להניע אותו. אני חושב שגם אם תזוז באלכסון לאורך הקיר, הוא לא ייתפס ותוכל לנוע בצורה חלקה ללא תנועה מהמורות.
סלק את דחיפת הדמויות מהקירות
אתה יכול לראות שאם אתה מזיז את הדמות כדי לדחוף את הקיר ואז להפסיק לזוז, זה יתנהג קצת כמו קופץ בחזרה מהקיר.
כדי לפתור זאת,Rigidbody 2D
בחר את אובייקט התו ושנה את "זיהוי התנגשות" ל "רציף" מהרכיב.
ההבדל בין "לא רציף" לבין "רציף" הוא כדלקמן.
לא רציף
זיהוי התנגשות הוא מנגנון שחושב לאחר תנועה. זוהי צורה המבצעת זיהוי התנגשות מהמצב שבו היא מועברת ומוטמעת בקיר. קל להבין אם אתה מקשר את זה עם טרמפולינות וגומי, אבל ככל שהוא מוטבע יותר, דוחה יותר הכוח יגדל, ואת הקפיצה יהיה חזק יותר. במקום זאת, החישוב מתבצע לאחר המעבר, ולכן עלות העיבוד נמוכה.
רציף
זה מעובד תוך קביעת מה בדרך. לקבוע אם יש קיר בין המיקום לפני ואחרי המעבר, אם יש קיר, הוא ישפוט את ההתנגשות שם ויעצור, כך שאין כמעט דחייה. במקום זאת, עלות העיבוד עולה מעט מכיוון שהחישוב נכלל באמצע התנועה.
לכוד בפינה של עצם מפה
בהתאם לתוכנית ולמיקום, חלקם נתפסים וחלקם לא, והסיבה לא השתנתה הרבה. אגב, זה קורה עם פינות זוויתיות כמו Box Collider 2D, ולא עם עיגולים מעוגלים.
גם אם תופעה מסתורית כזו מתרחשת, טוב שיש פינות מעוגלות של המתנגש כדי למנוע חבטות. הוא מוגבל ל- Box Collider 2D, אך כדי להפוך אותו לעגול, לרכיב Box Collider 2D של אובייקט התו יש "רדיוס קצה" ואתה שם ערך. אם תזין 1 כיחידה מספרית, יתרחש עיגול עבור גודל האובייקט. זה תלוי בגודל, אבל זה טוב לשים על 0.1.
אגב, שיפוט הלהיט גדל רק בגודל המעוגלות, אז אנא התאימו אותו אם הוא גדול. Box Collider 2D כולל לחצן Collider Edit המאפשר לך לשנות את גודלו ישירות בתצוגה על ידי לחיצה על הלחצן. מכיוון שהקו הירוק החיצוני הוא זיהוי הפגיעה בפועל, הגדר את הגודל כך שהוא לא יהיה טבעי.
לאחר מכן, הפעל את המשחק כדי לוודא שהוא לא נשרט ובצע התאמות.