1395/10/16، 09:21 عصر
سلام دوستان خیلی وقت بود دنبال اموزش کلیک و اشاره در یونیتی بودم و بلاخره تونستم خودم پیاده سازیش کنم و گفتم به شما هم اموزش بدیم و حالشو ببرید .
خب اول از همه بگم من زیاد توضیح دادنم خوب نیست (البته کد ها هم خیلی واضح هستن )
خب اول میریم سراغ متغییر ها :
1- متغییری از نوع اعداد صحیح برای شمارش دفعات تاچ شدن .
2- متغییری از نوع اعداد اعشاری = زمان دابل تاچ رو مشخص میکنه (مقدار منطقه زمانی شرط دابل تاچ)
3-متغیری از نوع اجسام بازی که بازیکن (کاراکتر ) رو درون اون میریزیم .
4-متغییری از نوع بردارها (سه جهت) برای ذخیره مکان تاچ شده .
5- متغییری از نوع اعداد اعشاری برای سرعت حرکت بازیکن .
6- متغییری از نوه بردارها (سه جهت) برای ذخیره موقعیت بازیکن .
خب میریم سراغ کد ها (توی این کد ما فقط با تابع update سروکار داریم و چندتا تابع شخصی )
در خط اول کد ها ما اومدیم متغییر playerposition رو برابر با مختصات playerblue که کاراکتر ما هست قرار میدیم ( کاربرد اون هم برای تغییر انیمیشن ها و چک کردن رسیدن به موقعیت تاچ شده است ) .
چند خط بعدی کد که بسیار واضح هستش میاد موقعیت مکانی بازیکن رو که داخل یک متغییر از نوع برداری ریخته بودیم رو با موقعیت مکانی جایی که تاچ کردیم میکنه و دستورات لازم مثل عوض کردن سمت کاراکتر و غیره ذالک .
خب حالا رسیدیم به قسمت اصلی کد یعنی ری زدن یا همون فرستادن اشعه . (توضیح کلی = دوستان ری زدن یا همون اشعه میاد از نقطه ای که ما مشخص کردیم خط یا همون اشه ای رو میفرسته که خیلی کاربرد داره (زیاد جزئی توضیح نمیدم بهتره این مباحثو بصورت ویدیویی مشاهده کنید ) خب ما اومدیم با استفاده از کلیک چپ موس یک شرط رو گزاشتیم که اگه کلیک چپ موس فشرده شد => ابتدا تابع OnClick رو فراخوانی میکنه و بعدش در خط اول میاد یک متغییر از نوع اشعه که ما اسمشو همون ری گزاشتیم رو از دوربین به جایی که ما کلیک کردیم میفرسته . در خطوط بعدی ما میاییم و برخورد اشعه رو چک میکنیم . و میگیم اگه با یک جسمی برخورد کرد بیاد اسم اون جسم رو برای ما پرینت کنه .
نکته ( دوستان برای اینکه ری ما بتونه برخورد رو تشخیص بده ما نیاز به یک جسم با کلایدر داریم .چون اگه کلایدر نباشه برخورد ری تشخیص داده نمیشه . و نکته بعدی هم اینه که بهتره منظقه تحت پوشش که قراره کاراکتر درونش بچرخه رو بهش کلایدر بدید و در خط کد بعدی استفاده کنید .
خب میریم ادامه ی کار در خط بعدی ما میایم میگیم که اگر نقطعه برخورد جسمی که پیدا کرده اسمش برابر با اسم مورد نظر ما باشه بیاد و متغییر newposition رو که برای گرفتن مکان کلیک شده بود رو برابر ایکس نقطه لمس شده و وای و زد مختصات خود پلیر کن .
نکته2 (من چون میخواستم پلیر فقط در محور ایکس حرکت کنه فقط مختصات ایکس نقطه تاچ شده رو بهش دادم شما میتونید برای بازی های 3 بعدی سه نقطه رو بدید یا دوتا . دیگه کدشو یاد گرفتید طبق سلیفه پیش برید )
خب در خط بعدی هم که هر لحظه چک یا بررسی میشه میام بازیکن رو از مختصات خودش به مختصات نیو پوزیشن که قبلا توضیح دادم چی بوده با سرعت دلخواه که قبلا معرفی کرده بودیم میبریم . time.deltatime میاد و زمان انجام کار رو تو تمام سیستم های مختلف به یک اندازه اجرا میکنه ( خیلی چیز خوبیه)
خب ی توضیح کلی میدم راجب چندتا کد بعدی که ماله دابل تاچ و سینگل تاچه . ببین دوستان ما ی زمانی داریم تو اون زمان اگه ما هر بار تاچ کنیم میاد یک عدد به متغییر mouseclick اضافه میکنه و بعدش با استفاده از خاصیت invoke بعد از گزشتن زمان mousetimerlimit تابع چک موس دابل کلیک فراخوانی میشه . خب حالا اصل کار
حالا میایم چک میکنیم و میگیم اگه متغیر موس کلیک (تو اون زمان که گفتیم ) بیشتر یک بود . بگه که دابل کلیک شده . (من واسه دابل کلیک سرعت کاراکترو 20 گزاشتم (متغییر speed) و با استفاده از کامپوننت انیماتور اومدم انیمیشن دویدن رو گزاشتم .
خط بعدی میگه اگر شرط قبلی برقرار نبود یا ب اصطلاح برعکس شرط قبلی برقرار بود بیاد و سینگل تاچ رو تشخیص بده و انیمیشن رو به راه رفتن و سرعت رو 5 بکنه بعدشم میایم واسه اینکه برای بار بعدی بتونیم استفاده کنیم متغییر تعداد تاچ ها و شرو شدن تاچ رو صفر و فالس میکنیم .
چندتا چیز کلی => خب اول از همه بگم که کلیک موس در اندروید همون حکم تاچ رو داره
اگه توجه کنید در شرط کلیک شدن من اومدم یدور سرعت رو صفر کردم . این هیچ تاثیری نداره میتونید برش دارید ولی بهتره بزارید بعضی وقتا ی باگ هایی پیش میاد .
این مقادیر و غیره همشون شخصی من هستن بیشتریاشونو میتونید تغییر بدید ولی اینا بهترین گزینه هاش هستن دیگه حالا بازم بستگی به کار خودتون داره
-------------------------------------------------------------------------------------------------------------------------------------------------
لینک فایل پروژه :
click and point (unity)
*
امیدوارم مفید واقع شده باشه خلاصه کم وکسری بود یا اشتباهی داشت به بزرگی خودتون ببخشید .
سپاس فراموش نشه شب خوش موفق باشید .
کد:
private bool mouseClicksStarted = false;
private int mouseClicks = 0;
public float mouseTimerLimit = .25f;
public GameObject playerBlue;
public Vector3 newposition ;
public float speed = 0 ;
public Vector3 playerposition ;
void Update() {
playerposition = new Vector3 (playerBlue.transform.position.x,playerBlue.transform.position.y,playerBlue.transform.position.z);
if(playerposition.x > newposition.x){
Debug.Log("player bishtare");
transform.localScale = new Vector3 (1,1,1);
}
if(playerposition.x < newposition.x){
Debug.Log("player kamtare " ) ;
transform.localScale = new Vector3 (-1,1,1);
}
if(playerposition == newposition){
Debug.Log("mosavi ast");
GetComponent<Animator>().SetInteger("action-player",0);
}
if(Input.GetMouseButtonDown(0)){ OnClick ();
Ray ray = (Camera.main.ScreenPointToRay(Input.mousePosition));
RaycastHit hit ;
speed = 0 ;
if(Physics.Raycast(ray,out hit ))
{
print(hit.transform.name);
if(hit.transform.name == "backgame" )
{
newposition = new Vector3 (hit.point.x , playerBlue.transform.position.y , playerBlue.transform.position.z);
}
}
}
playerBlue.transform.position = Vector3.MoveTowards(this.transform.position , newposition , speed * Time.deltaTime ) ;
}
public void OnClick(){
mouseClicks++;
if(mouseClicksStarted){
return;
}
mouseClicksStarted = true;
Invoke("checkMouseDoubleClick",mouseTimerLimit);
}
private void checkMouseDoubleClick()
{
if(mouseClicks > 1){
GetComponent<Animator>().SetInteger("action-player",1);
speed = 20 ;
}else{
GetComponent<Animator>().SetInteger("action-player",2);
speed = 5 ;
}
mouseClicksStarted = false;
mouseClicks = 0;
}
}
خب اول از همه بگم من زیاد توضیح دادنم خوب نیست (البته کد ها هم خیلی واضح هستن )
خب اول میریم سراغ متغییر ها :
1- متغییری از نوع اعداد صحیح برای شمارش دفعات تاچ شدن .
2- متغییری از نوع اعداد اعشاری = زمان دابل تاچ رو مشخص میکنه (مقدار منطقه زمانی شرط دابل تاچ)
3-متغیری از نوع اجسام بازی که بازیکن (کاراکتر ) رو درون اون میریزیم .
4-متغییری از نوع بردارها (سه جهت) برای ذخیره مکان تاچ شده .
5- متغییری از نوع اعداد اعشاری برای سرعت حرکت بازیکن .
6- متغییری از نوه بردارها (سه جهت) برای ذخیره موقعیت بازیکن .
خب میریم سراغ کد ها (توی این کد ما فقط با تابع update سروکار داریم و چندتا تابع شخصی )
در خط اول کد ها ما اومدیم متغییر playerposition رو برابر با مختصات playerblue که کاراکتر ما هست قرار میدیم ( کاربرد اون هم برای تغییر انیمیشن ها و چک کردن رسیدن به موقعیت تاچ شده است ) .
چند خط بعدی کد که بسیار واضح هستش میاد موقعیت مکانی بازیکن رو که داخل یک متغییر از نوع برداری ریخته بودیم رو با موقعیت مکانی جایی که تاچ کردیم میکنه و دستورات لازم مثل عوض کردن سمت کاراکتر و غیره ذالک .
خب حالا رسیدیم به قسمت اصلی کد یعنی ری زدن یا همون فرستادن اشعه . (توضیح کلی = دوستان ری زدن یا همون اشعه میاد از نقطه ای که ما مشخص کردیم خط یا همون اشه ای رو میفرسته که خیلی کاربرد داره (زیاد جزئی توضیح نمیدم بهتره این مباحثو بصورت ویدیویی مشاهده کنید ) خب ما اومدیم با استفاده از کلیک چپ موس یک شرط رو گزاشتیم که اگه کلیک چپ موس فشرده شد => ابتدا تابع OnClick رو فراخوانی میکنه و بعدش در خط اول میاد یک متغییر از نوع اشعه که ما اسمشو همون ری گزاشتیم رو از دوربین به جایی که ما کلیک کردیم میفرسته . در خطوط بعدی ما میاییم و برخورد اشعه رو چک میکنیم . و میگیم اگه با یک جسمی برخورد کرد بیاد اسم اون جسم رو برای ما پرینت کنه .
نکته ( دوستان برای اینکه ری ما بتونه برخورد رو تشخیص بده ما نیاز به یک جسم با کلایدر داریم .چون اگه کلایدر نباشه برخورد ری تشخیص داده نمیشه . و نکته بعدی هم اینه که بهتره منظقه تحت پوشش که قراره کاراکتر درونش بچرخه رو بهش کلایدر بدید و در خط کد بعدی استفاده کنید .
خب میریم ادامه ی کار در خط بعدی ما میایم میگیم که اگر نقطعه برخورد جسمی که پیدا کرده اسمش برابر با اسم مورد نظر ما باشه بیاد و متغییر newposition رو که برای گرفتن مکان کلیک شده بود رو برابر ایکس نقطه لمس شده و وای و زد مختصات خود پلیر کن .
نکته2 (من چون میخواستم پلیر فقط در محور ایکس حرکت کنه فقط مختصات ایکس نقطه تاچ شده رو بهش دادم شما میتونید برای بازی های 3 بعدی سه نقطه رو بدید یا دوتا . دیگه کدشو یاد گرفتید طبق سلیفه پیش برید )
خب در خط بعدی هم که هر لحظه چک یا بررسی میشه میام بازیکن رو از مختصات خودش به مختصات نیو پوزیشن که قبلا توضیح دادم چی بوده با سرعت دلخواه که قبلا معرفی کرده بودیم میبریم . time.deltatime میاد و زمان انجام کار رو تو تمام سیستم های مختلف به یک اندازه اجرا میکنه ( خیلی چیز خوبیه)
خب ی توضیح کلی میدم راجب چندتا کد بعدی که ماله دابل تاچ و سینگل تاچه . ببین دوستان ما ی زمانی داریم تو اون زمان اگه ما هر بار تاچ کنیم میاد یک عدد به متغییر mouseclick اضافه میکنه و بعدش با استفاده از خاصیت invoke بعد از گزشتن زمان mousetimerlimit تابع چک موس دابل کلیک فراخوانی میشه . خب حالا اصل کار
حالا میایم چک میکنیم و میگیم اگه متغیر موس کلیک (تو اون زمان که گفتیم ) بیشتر یک بود . بگه که دابل کلیک شده . (من واسه دابل کلیک سرعت کاراکترو 20 گزاشتم (متغییر speed) و با استفاده از کامپوننت انیماتور اومدم انیمیشن دویدن رو گزاشتم .
خط بعدی میگه اگر شرط قبلی برقرار نبود یا ب اصطلاح برعکس شرط قبلی برقرار بود بیاد و سینگل تاچ رو تشخیص بده و انیمیشن رو به راه رفتن و سرعت رو 5 بکنه بعدشم میایم واسه اینکه برای بار بعدی بتونیم استفاده کنیم متغییر تعداد تاچ ها و شرو شدن تاچ رو صفر و فالس میکنیم .
چندتا چیز کلی => خب اول از همه بگم که کلیک موس در اندروید همون حکم تاچ رو داره
اگه توجه کنید در شرط کلیک شدن من اومدم یدور سرعت رو صفر کردم . این هیچ تاثیری نداره میتونید برش دارید ولی بهتره بزارید بعضی وقتا ی باگ هایی پیش میاد .
این مقادیر و غیره همشون شخصی من هستن بیشتریاشونو میتونید تغییر بدید ولی اینا بهترین گزینه هاش هستن دیگه حالا بازم بستگی به کار خودتون داره
-------------------------------------------------------------------------------------------------------------------------------------------------
لینک فایل پروژه :
click and point (unity)
*
امیدوارم مفید واقع شده باشه خلاصه کم وکسری بود یا اشتباهی داشت به بزرگی خودتون ببخشید .
سپاس فراموش نشه شب خوش موفق باشید .