کد بهینه حرکت/پرش/دابل جامپ/راه رفتن دو بعدی player در یونیتی 5 با استفاده از Easy touch version 3 سیشارپ
دوشنبه, ۱۱ آبان ۱۳۹۴، ۰۹:۲۶ ق.ظ
منبع:gameover.blog.ir
حرکت دو بعدی پلیر در یونیتی به وسیله ی easy touch version 3
حرکت دو بعدی player
ویرایش:1/26/2016:
//optimized Player 2d move+shoot+jump+double jump //edited:1/2/2016 //csharp language //Author:Sajjad3011 //unity 5.2 final //Easy touch joystick version 3 //gameover.blog.ir //promakers.ir using UnityEngine; using System.Collections; using System.Reflection; using UnityEditor; public class player : MonoBehaviour { public float speed=0.1f,jumpForce=10f; private bool grounded=false; public Animator anim; private float xScale,yScale; public Rigidbody2D rb2d; private float signX; private Transform _transform; void Start () { xScale = transform.localScale.x; yScale = transform.localScale.y; _transform = this.transform;//cache for optimization } void FixedUpdate () { if (rb2d.velocity.y == 0) { grounded=true; anim.SetBool("onGround", true);//we are on air } else { grounded = false; } if(grounded && !Input.anyKey)//if we are on ground and no key pressed { rb2d.velocity = new Vector2 (0,0);//stop(x,y) //anim.SetInteger("state",1);//play idle animation StartCoroutine (switchAnimation (1)); } if (Input.GetKey (KeyCode.LeftArrow))//if Left { anim.enabled=true; //anim.SetInteger("state",2);//play Run animation StartCoroutine (switchAnimation (2)); //rb2d.velocity = new Vector2 (-speed ,rb2d.velocity.y);//move left _transform.position += new Vector3(-speed, 0, 0); _transform.localScale = new Vector2 (-xScale,yScale);//face left } if (Input.GetKey (KeyCode.RightArrow))//if Right { anim.enabled=true; //anim.SetInteger("state",2);//play Run animation StartCoroutine (switchAnimation (2)); //rb2d.velocity = new Vector2 (speed ,rb2d.velocity.y);//move right _transform.position += new Vector3(+speed, 0, 0); _transform .localScale = new Vector2 (xScale,yScale);//face right } if (Input.GetKeyUp (KeyCode.UpArrow)) StartCoroutine (jump ()); }// void On_JoystickMove( MovingJoystick move){ //anim.SetInteger("state",2);//run StartCoroutine (switchAnimation (2)); signX = Mathf.Sign (move.joystickAxis.x); _transform.position += new Vector3(signX*speed, 0, 0); //rb2d.velocity = new Vector2 (signX *speed ,rb2d.velocity.y); _transform.localScale = new Vector2(signX * xScale,yScale); if (move.joystickAxis.y > 0) StartCoroutine (jump ()); } IEnumerator switchAnimation(int state){ anim.SetInteger("state",state);//play idle animation yield return new WaitForFixedUpdate(); } IEnumerator jump(){ if (grounded) { rb2d.velocity = new Vector2 (rb2d.velocity.x, jumpForce); anim.enabled=true; anim.SetInteger ("state", 3);//play jump animation anim.SetBool ("onGround", false);//we are on air yield return new WaitForFixedUpdate(); }//end switch else ;//if on air //anim.SetInteger("state",4);//play double jump animation //anim.SetInteger("state",1);//play double jump animation }//jump() }
توضیح:
در این اسکریپت متغیر anim از نوع Animator و به صور
public تعریف شده یعنی کامپوننت انیماتور رو که به player دادیم با ماوس
باید بگیریم بندازیم روش(در inspector)
قسمت xScale و yScale هم مقدار مقیاس x و y رو خوندیم و ریختیم توی متغیرها. و با localScale.x کاراکتر رو به سمت چپ و راست می کنیم.
اگه منفی باشه به سمت چپ و اگه ثبت باشه به سمت راست. این مثبت و منفی رو هم با Mathf.Sign می خونیم(math کلاس ریاضی هست و sign علامت رو میده مثلا عدد منفی علامتش -1 هست و عدد مثبت علامتش +1 هست)
(این قسمت رو با دستور signX = Mathf.Sign (move.joystickAxis.x); با جوی استیک مرتبط می کنیم. چون اگه جوی استیک رو بکشیم به چپ مقدارش یه عدد منفی میشه و اگه به راست ببریم یک عدد مثبت)در کد فوق اگه دقت کنید فلش چپ و راست رو با transform نوشتم و فلش بالا رو با velocity از rigidbody2d .
velocity به معنی شتاب هست و در فیزیک معمولا پرش رو بهتره با اون بسازیم که جاذبه زیباتر بشه.
اما فلش چپ و راست رو چرا با velocity نساختم دلیلش این بود که وقتی فلش راست رو رها می کردم بلافاصله کاراکتر ایست نمی کرد و یکم راه می رفت بعدش می موند که این رو من نمی خواستم.
دقت کنید که اسم اسکریپت رو بذارید player چون اسم کلاس داخل سورس بالا player هست و حتما باید اسم اسکریپت و اسم کلاس یکسان باشه(توی سیشارپ)
نکته مهم: متغیر _transform برای cache کردن و بهینه سازی ساختیم.
در مثال فوق بای بهیته سازی ، تابع jump و حالات سوئیچ بین وضعیت های انیماتور رو هم coRoutine کردم (IEnumerator )
دانلود پکیج EasyTouch v3.:
http://gameover.blog.ir/1394/08/11/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D9%BE%DA%A9%DB%8C%D8%AC-%D9%BE%D9%84%D8%A7%DA%AF%DB%8C%D9%86-easy-touch-version-3-1-%D8%A8%D8%B1%D8%A7%DB%8C-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-5
۹۴/۰۸/۱۱