gameover.blog.ir
حرکت پلیر سه بعدی با استفاده از کاراکتر کنترلر و دستور Input.GetAxis("Horizontal") بدون افت فریم ریت:
دستور Input.GetAxis چیست و چگونه کار می کند؟
این دستور کلیدهای افقی و عمودی WASD رو چک می کنه.
اگه هیچکدوم فشرده نبود صفر 0 برگشت میده ویلا یا منفی یک -1 یا مثبت یک +1 برگشت میده.
WS بالا پایین یا عمودی
AD چپ و راست یا افقی
خودمون تعیین می کنیم کدوم رو چک کنه.
اگه افقی فلش چپ و راست AD باید ورودی بدیم horizontal .
مثال:
Input.GetAxis("Horizontal")
اگه عمودی فلش بالا پایین WS باید ورودی بدیم vertical .
مثال:
Input.GetAxis("Vertical")
حالا کجا ازش استفاده میشه؟
برای حرکت کاراکتر میایم xz رو تنظیم می کنیم. x یعنی چپ راست و z یعنی جلو عقب بر حسب مثبت یا منفی بودن مقداری که بهشون میدیم.
پس برای مثال داریم:
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical"));
چون محاسبات محلی هست بایستی به جهانی تبدیل کنیم. پس داریم:
moveDirection = transform.TransformDirection(moveDirection);
دستور Transform Direction، مقادیر XYZ محلی را به مقادیر جهانی تبدیل میکنه.
بعدش یه فاکتور یا متغیر سرعت هم که قبلا باید تعریف کنیم در اون ضرب می کنیم تا مقدار زیاد بشه :
moveDirection *= speed;
در نهایت ازش استفاده میکنیم.
مثلا برای پرش میایم y رو تنظیم می کنیم:
if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; }
jumpSpeed هم متغیری هست قبلا فرض کردیم تعریف شده و سرعت پرش رو مشخص می کنه.
نکته: در حالت پیش فرض، کلید پرش، کلید space است.
ولی شخصیت ما چطوری بعد از پرش به زمین فرود بیاد؟
فرض می کنیم player ما کامپوننت rigidBody نداره .پس شرط بذارید تا زمانیکه y از صفر بیشتر بود این خط اجرا بشه:
moveDirection.y -= gravity * Time.deltaTime;
gravity هم جاذبه هست و از قبل تعریف می کنیم.
Time.deltaTime باعث میشه y طبق زمان کم بشه نه در فریم.(پس یه حرکت فرود نرم تر خواهد داشت)
در نهایت بای یک متغیر از نوع CharacterController بسازید و کامپوننت کاراکتر کنترلر بدید به player و drag کنید روی این متغیر:
public CharacterController controller;
برای حرکت نهایی هم این کد رو بنویسید:
controller.Move (moveDirection * Time.deltaTime) ;
این هم یک اسکریپت ساده برای پرش و حرکت کاراکتر با استفاده از space و فلش های جهت نما(نکته:یک کامپوننت Character Controller بدید به Player و بعدش این اسکریپت زیر رو):
using UnityEngine; using System.Collections; public class RotateCamera : MonoBehaviour { private Vector3 moveDirection = Vector3.zero; void Update (){ float speed=5; float jumpSpeed=5; float gravity=5; float x,y,z; CharacterController controller = GetComponent<CharacterController>(); if (controller.isGrounded) { // We are grounded, so recalculate // move direction directly from axes moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } } // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller controller.Move(moveDirection * Time.deltaTime); } }