רכבו על הפלטפורמה
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 51 מתוך 60.
CharacterController לא נישא על ידי המשטח שעליו הוא עומד: על פלטפורמה נעה הוא נשאר במקומו, והפלטפורמה מחליקה מתחתיו. שינוי transform.position שלו לא עוזר, כי הקריאה הבאה ל-Move מתחילה מהמקום שבו הפיזיקה ראתה אותו בפעם האחרונה ומבטלת את השינוי.
לכן השחקן מוסיף את התנועה של הפלטפורמה לתנועה שלו. OnControllerColliderHit(ControllerColliderHit hit) מופעל עבור כל מתנגש ש-Move נוגע בו; פגיעה מלמטה תציג ערך hit.normal.y קרוב ל-1. מעבורת שנושאת ארגז באותו אופן:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}אתגר
בינוניגרמו לשחקן לרכוב על הפלטפורמה הנעה.
- ב־
Player, הוסיפוprivate MovingPlatform platform;ואתOnControllerColliderHit: כאשרhit.normal.y > 0.5fולאובייקט ישMovingPlatform, שמרו אותו ב־platform. - ב־
Update(), הציבו את(move + velocity) * Time.deltaTimeבתוךVector3 motion. אםplatform != null, הוסיפו אתplatform.deltaוהגדירוplatform = null. - קראו ל־
controller.Move(motion).
לחצו על "שחק" וקפצו אל הפלטפורמה: היא תישא אתכם. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין