درود مهمان گرامی! ثبت نام

ساخت بازی

امتیاز موضوع:
  • 6 رأی - میانگین امتیازات: 4.67
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
کلمات کلیدی
برنامه نویسی و راهکارهایی در یونیتی

برنامه نویسی و راهکارهایی در یونیتی
#51
دادم ولی باز هم نمیشه.
هیچ وقت موقع حرف زدن غذا نخورید .
اندروید را با طعم جاوا بنوشید
https://telegram.me/joinchat/BTG1TQNIX1bnCIx1LW5hEA
http://promakers.ir/showthread.php?tid=1...#pid129749
resim



everyday is Ashura, every land is Karbala
پاسخ
#52
سوال رو در بخش پرسش و پاسخ بذار.(ضمنا خطا رو بگو چیه.)
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط raamz110 ، moien1
#53
دسترسی به متغیرهای فایل بیرونی جاوااسکریپت از داخل فایل سیشارپ در یونیتی:
Access javascript variables using csharp script in unity
--
یک پروژه جدید ایجاد کنید.

پوشه ای به نام Script و داخلش یک اسکریپت سیشارپ به نام CSharp1.Cs ایجاد کنید.

پوشه ای به نام 'Standard Assets' (حتما دقیقا همین باشه ویلا جواب نمی ده) و داخلش یک اسکریپت js به نام JS1.js ایجاد کنید.
--
کد اسکریپت JS1.js :
کد php:
//JS1.js //Don't forget to place the 'JS1.js' file inside the 'Standard Assets' folder
// Unity3D: JavaScript->C# or C#->JavaScript access
//This variable will be accessed through C#
public var message String "Text in js file."
کد اسکریپت CSharp1.Cs:
کد php:
// Unity3D: JavaScript->C# or C#->JavaScript access
//CSharp1.Cs
using UnityEngine;
using System.Collections;

public class 
CSharp1 MonoBehaviour
{
    
    private 
JS1 jsScript;
    
    
void Awake()
    {
        
        
jsScript this.GetComponent<JS1>();//Don't forget to place the 'JS1' file inside the 'Standard Assets' folder
    
}
    
    
//render text and other GUI elements to the screen
    
void OnGUI()
    {
        
//age ghermez kard mohem nist khata nmide
        
GUI.Label(new Rect(10,10,300,20),jsScript.message);
    }
    
    


یک گیم ابجکت ایجاد کنید و هر دو اسکریپت رو با ماوس بگیرید بندازید روش(توی Hierarchy روی گیم ابجکت دلخواه بندازید)
بازی رو اجرا کنید. می بینید که فایل سیشارپ،متغیر message از داخل فایل جاوااسکریپت رو می خونه و مقدارش رو توسط تابع GUI روی یک label صفحه نشون میده.

نکته مهم :
حتما یادتون نره فایل JS1.js رو داخل پوشه ای به نام 'Standard Assets' بذارید.
حتما فایل سیشارپ CSharp1.Cs رو داخل پوشه ی دیگه ای غیر از 'Standard Assets' بذارید.
resim
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط moien1 ، aminblog76 ، Microsoft2 ، qwerty13
#54
آموزش تاچ در یونیتی/آموزش کلاس Input و تشخیص لمس یا Touch در unity

برای اینکار از کلاس Input استفاده میشه و تعداد(count) انگشت ها رو هم میشه شمرد.
قبل از هرچیزی باید بررسی کنیم که دستگاه ما آیا از multi touch ساپورت می کنه یا نه.

کد php:
bool supportsMultiTouch Input.multiTouchEnabled;
print(
"MultiTouchSupport : " supportsMultiTouch); 

این آموزش فرضش اینه که موبایل لمسی شما از مالتی تاچ حمایت می کنه.برای گوشی های single-touch کافیه توی هر تایم یک تاچ رو چک کنیم.

مثال زیر همه ی تاچ(لمس) ها و موقعیت اونا رو نمایش تشخیص می ده :

کد php:
void Update ()

            {

                
int nbTouches Input.touchCount;


                if(
nbTouches 0)

                {

                    print(
nbTouches " touch(es) detected");


                    for (
int i 0nbTouchesi++)

                    {

                        
Touch touch Input.GetTouch(i);


                        print(
"Touch index " touch.fingerId " detected at position " touch.position);

                    }

                }

        } 


Input.touchCount تعداد تاچ ها رو تشخیص می ده.
می تونیمبا یک loop و تکرار با استفاده از Input.GetTouch تمام لمس ها رو تشخیص بدیم.

هر ساختار Touch شامل یک fingerId هست که یک نمونه یا موجودیت(instance ) برای آن lifetime(زمان) را شناسایی می کند و این کار را ادامه می دهد تا اینکه تاچ (لمس) stop کند(متوقف شود) با این امکان می توان برای تخیص تاچ های یکسان در فریم های مختلف استفاده کرد.

با استفاده از touch.position می تونیم مختصات ناحیه ی لمس شده روی screen(صفحه) رو تشخیص بدیم.

نکته بسیار مهم : یادتون باشه،مبداء بردار لمسی در پایین ترین گوشه ی سمت چپ صفحه می باشد.

متد دیگه برای تشخیص تاچ ها ، Input.touches است که یک لیست از ابجکت های لمس شده ی صفحه رو به ما میده.

با اینکه متد اول باید استفاده شود همانند Input.touches متغیرهای موقت و ممکن است کارایی بازی را کاهش دهند.

داده های ورودی ، دقیقا قبل ار تابع Update()، در هر فریم refresh می شوند.

به طوری که در آن شما باید تمام کدهای لازم مدیریت ورودی(input-management logic)را در آن قرار دهید.

انجام این کار اگر در تابع FixedUpdate انجام بشه،جلوی catching (یا خطایابی) داده های ورودی کاربر رو از ما می گیره.زیرا FixedUpdate اگرچه در گام های مختلف ولی در هر فریم از زمان اجرا نمیشه.

Touch Phases(فاز های لمسی):
در کد زیر با استفاده از خصوصیت phase شروع و پایان و لحظه ی تاچ را تشخیص می دهیم :

کد php:
void Update ()
        {
           
int nbTouches Input.touchCount;

           if(
nbTouches 0)
           {
              for (
int i 0nbTouchesi++)
              {
                 
Touch touch Input.GetTouch(i);

                 
TouchPhase phase touch.phase;

                 switch(
phase)
                 {
                    case 
TouchPhase.Began:
                       print(
"New touch detected at position " touch.position " , index " touch.fingerId);
                       break;
                    case 
TouchPhase.Moved:
                       print(
"Touch index " touch.fingerId " has moved by " touch.deltaPosition);
                       break;
                    case 
TouchPhase.Stationary:
                       print(
"Touch index " touch.fingerId " is stationary at position " touch.position);
                       break;
                    case 
TouchPhase.Ended:
                       print(
"Touch index " touch.fingerId " ended at position " touch.position);
                       break;
                    case 
TouchPhase.Canceled:
                       print(
"Touch index " touch.fingerId " cancelled");
                        break;
                    }
                }
           }
        } 

زمانی که کاربر در کشیدن انگشت خود(swipping) بر روی صفحه نمایش است،ما به جای موقعیت واقعی،تغییرات دلتای موقعیت(position) را دنبال می کنیم.این برای زمانی مفید است که عمل درگ(Drag=کشیدن و انداختن چیزی با ماوس یا لمس)را انجام می دهیم.


سپس با استفاده از deltaTime سرعت حرکت touch input رو محاسبه می کنیم :
کد php:
float touchSpeed touch.deltaPosition.magnitude touch.deltaTime

اگه اشتباهی رخ بده تاچ کنسل(cancel) می شه.به عنوان مثال هنگامی که یک منطقه بزرگ در برابر صفحه نمایش فشرده یا تاچ های بیش از آنچه دستگاه ساپورت می کنه انجام بشه.برای تشخیص موقعیت شروع لمس صفحه توسط کاربر از "Began" استفاده می کنیم.سپس می تونیم یک ray(اشعه) رو از موقعیت ورودی با اتفاده از دوربین،cast(پرتاب) و با استفاده از Raycast collision اشیایی رو که در امتداد اشعه هستند چک کنیم.

کد php:
void Update ()
            {
                
int nbTouches Input.touchCount;

                if(
nbTouches 0)
                {
                    for (
int i 0nbTouchesi++)
                    {
                        
Touch touch Input.GetTouch(i);

                        if(
touch.phase == TouchPhase.Began)
                        {
                            
Ray screenRay Camera.main.ScreenPointToRay(touch.position);

                            
RaycastHit hit;
                            if (
Physics.Raycast(screenRayout hit))
                            {
                    print(
"User tapped on game object " hit.collider.gameObject.name);
                                
handleTap(hit.collider.gameObject);
                            }
                        }

                    }
                }
        } 

در بعضی مواقع می خوایم دوبار لمس سریع کاربر رو بررسی کنیم.برای مثال یه وقتی می خوایم وقتی کاربر با انگشت به صفحه ضربه(tap) زد Player راه بره و اگه دوبار سریع ضربه زد(double tap) کاراکتر Player با سرعت راه بره.

کد php:
void Update ()
            {
                
int nbTouches Input.touchCount;

                if(
nbTouches 0)
                {
                    for (
int i 0nbTouchesi++)
                    {
                        
Touch touch Input.GetTouch(i);

                        if(
touch.phase == TouchPhase.Began)
                        {
                            if(
touch.tapCount >= 2)
                            {
                                
Run();
                            }
                            else
                            {
                                
Walk();
                            }
                        }

                    }
                }
                else
                {
                    
StopMoving();
                }
        } 

وقتی touch ما Begin می کنه(وقتی لمس آغاز میشه)، player با تک ضرب انگشت حرکت و با چند ضرب شروع به دویدن می کنه.
اگه هم هیچ تاچ یا لمسی صورت نگیره game character متوقف می شه.
زمانیکه متدهای مختلف مثل Walk را اجرا می کنیم شما همچنین بررسی می کنید کاربر در حال حاضر در حال راه رفتن است یا خیر.

نکته: بعضی اوقات unity نمی تونه لمس های سریع رو درست تشخیص بده.(سعی کنید یادتون باشه)
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط farid khoshnvis ، AliScan ، aminblog76 ، Microsoft2 ، moien1 ، qwerty13
#55
چشمک زدن یا شفاف کردن یا transparent کردن یک گیم ابجکت در یونیتی:
ابتدا یک کپسول بسازید و توی صحنه بذارید.
یک متریال(new material) با رنگ قرمز رو ایجاد کرده و بندازید روی کپسول.
سپس یک اسکریپت سیشارپ با نام transparent.Cs با ایجاد کرده و کد زیر رو بریزید توش:
کد php:
using UnityEngine;
using System.Collections;    
public class 
transparent MonoBehaviour {
    private 
float duration 1.0f;    
    
// Update is called once per frame
    
void Update () {
        
Color textureColor renderer.material.color;
        
textureColor.Mathf.PingPong(Time.timeduration) / duration;
        
renderer.material.color textureColor;
    }
    } 
اجرا کنید.
می بینید که گیم ابجکت شما شفاف(محو) و کدر می شه به حالت چشمک زن.
resim
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط AliScan ، aminblog76 ، Microsoft2
#56
فعال سازی و غیرفعال سازی تصادفی اشیا یا گیم ابجکت ها در یونیتی:
resim
ابتدا یک اسکریپت می سازیم (به زبان javascript) و می دیم به دوربین.
و سه ابجکت رو می دیم به متغیرهای c1و c2 و c3.
همچنین یک متغیر به اسم n تعریف می کنیم که مقدارش هی زیاد میشه و بین 1 تا 1000 می چرخه و اگه به هزار رسید دوباره از 0 شروع می شه. این n رو به مقدار دلخواه مثلا ضریب(مقسوم علیه) پیشفرض 30 (که قابل تغییر هست) تقسیم می کنیم و به قول خودم طی دوره های زمانی مختلف (هر 30 واحد زمانی که خودمون فرض کردیم) همه ی ابجکت ها رو غیر فعال می کنیم و سپس یکی از اونا رو به صورت تصادفی فعال می کنیم.
اینم اسکریپت:
کد php:
//randomActive.js
var c1 GameObject;
 var 
c2 GameObject;
 var 
c3 GameObject;
 
 private var 
random int;
 private var 
n:int=0;
 public var 
maghsoomAleih=30;
 function 
Start ()
 {
   
setActiveRandObj();
 }

 function 
Update (){
 
//---------------------
 
n+=1;
 if(
n>1000n=0;
 
Debug.Log(n);
 
//---------------------
setActiveRandObj();
}
function 
setActiveRandObj(){



     
random Random.Range(14);
 if(
n%maghsoomAleih==0){
 
c1.SetActive (false);
c2.SetActive (false);
c3.SetActive (false);
     if (
random == 1) {
      
c1.SetActive (true);
     }
     else if (
random == 2) {
      
c2.SetActive (true);
     }
     else {
      
c3.SetActive (true);
     }
}

https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط aminblog76 ، Microsoft2 ، qwerty13
#57
GameObject.SendMessage در یونیتی کارش چیه ؟
کار این تابع اینه که می یاد یک تابع رو با ورودی دلخواه اجرا برای گیکم ابجکت دلخواه به اجرا در میاره.

شکل کلی تابع :

کد:
void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
اگه option رو به SendMessageOptions.RequireReceiver تنظیم کنیم در صورت خطا پیامی print میشه.

مثال:
کد php:
//csharp code SendMessage
using UnityEngine;
using System.Collections;

public class 
Example MonoBehaviour {
    
void myFunction(float damage) {
        print(
damage);
    }
    
void Example() {
        
gameObject.SendMessage("myFunction"5.0F);
    }

طبق کد بالا،تابع myFunction (با ورودی 5.0f به جای متغیر damage) اجرا خواهد شد.

https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط Microsoft2 ، moien1
#58
رفع خطای نشناختن Mono.Data در یونیتی:
گاهی اوقات مثلا وقتی که با جاوااسکریپت توی یونیتی داریم کدنویسی می کنیم Mono.Data رو خطا می گیر.

مثلا کد :

کد php:
import   Mono.Data

خطا :

کد:
BCE0021: Namespace 'Mono.Data' not found, maybe you forgot to add an assembly reference?


برای رفع این مشکل در قسمت File->Build Settigs->Player Settings رفته و گزینه ی .NET 2.0 رو به جای .NET 2.0 Subset انتخاب کنید:
resim
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط qwerty13 ، Microsoft2 ، moien1
#59
رفع مشکل عمل نکردن تابع instantiate در بعضی مواقع در سیستم animator و .... :
چرا بعضی اوقات وقتی دشمنو تکثیر میکنیم فقط رو یکشون عمل میکنه ؟
پاسخ :
دلیلش اینه که متغیرها رو باید از نوع static تعریف کنیم.متغیرهایی از نوع static تعریف می شن آخرین مقدار خودشون رو نگه می دارن.
وقتی ما یک دشمن رو instantiate می کنیم اگه بخوایم همه ی دشمن ها عین هم عمل کنن و مثلا به طور هوشمند دنبالمون بیان یا به حالت idle برن باید نوع متغیری که در منطق یا logic خودمون ازش اتفاده می کنیم رو از نوع static تعریف کنیم.
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط Microsoft2 ، qwerty13
#60
نکاتی برای کاربران مبتدی در برنامه نویسی سیشارپ در یونیتی :

ما مستقیم نباید transform.position رو دستکاری کنیم و بهتره مقداری رو پردازش و محاسبه کنیم و توی یه متغیری بریزیم،سپس مقدار اون متغیر رو بریزیم توی بردار x یا y یا z از ساب کلاس position.

همچنین اگه یه مقدار اعشاری مثل 0.5 یا 0.6 یا ...(اینا مثال هست) رو نوشتیم اگه خطای تبدیل double به float داد باید حتما تبدیل نوع موقت رو انجام بدیم( به این صورت که یه پرانتز باز و بسته می کنیم قبل از اسم متغیر می ذاریم و توش نوع تبدیل رو می ذاریم مثل (float) .)

حالا این کد رو ببینید:

کد php:
    void Update(){
        if (
Input.GetKey (KeyCode.LeftArrow)) 
        {
            
pos transform.position;
            
pos.-= (float)0.5;
            
transform.position pos;
            
        } 

در کد بالا رویداد Update رو بکار بردیم.

گفتیم اگه کاربر فلش چپ رو زد پوزیشن رو دریافت کنه و 0.5 تا ازش کم کنه و نتیجه رو در متغیر pos ریختم و نهایتا pos رو نسبت دادم به transform.position.x.

اگه مستقیما می یومدم اینطوری کد می نوشتم خطا می داد :
کد:
if (Input.GetKey (KeyCode.LeftArrow))
        {
            //pos = transform.position;
            //pos.x -= (float) 0.5;
            transform.position.x -= (float) 0.5;

        }
خطاشم این بود :
کد:
error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.position'. Consider storing the value in a temporary variable
از خطا دریافت می کنیم باید قبلش مقداری رو در یک متغیر temporary یا موقتی بریزیم و سپس ربطش بدیم به position.x یا position.y یا position.z و ... .


توضیحات اضافی:

در یونیتی transform.position می تونه از نوع بردار دو بعدی (Vector2) بوده (یعنی فقط دو مقداری x و y) و سه بعدی (Vector3) باشه(سه تا بردار رو می تونیم دستکاری کنیم x و y و z)

x یعنی محور چپ و راست(اگه مقدار مثبت بدیم یعنی راست. اگه مقدار منفی بدیم یعنی چپ)
y یعنی محور بالا و پایین(اگه مقدار مثبت بدیم یعنی بالا، اگه مقدار منفی بدیم یعنی پایین)
z یعنی محور جلو و عقب(اگه مقدار مثبت بدیم یعنی جلو، اگه مقدار منفی بدیم یعنی عقب)

یادتون نره متغیر pos رو از نوع Vector3 در بالای برنامتون تعریف کنید. اینطوری:
کد php:
private Vector3 pos
البته اگه public رو به جای private بذارید عمومی میشه و وقتی اسکریپت رو به گیم ابجکت دلخواه ربط می تونید توی پنجره ی inspector خصوصیت pos به گیم ابجکت اضافه می شه و می تونید از ورودی مقدارشو بخونید.ولی من خصوصی(private) تعریف کردم چون نیاز نداشتم ولی بهتره شما public تعریف کنید.

یه نکته ی دیگه در مورد اسم کلاس های سیشارپ اینه که بعد از public class (معمولا حط اول اسکریپت های سیشارپی) حتما اسم کلاس باید همنام اسم اسکریپت باشه.مثلا اگه اسکریت شما اسمش هست ali سپس اینطوری میشه :
کد php:
public class ali:MonoBehaviour 
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط Mehrdad ، moien1 ، qwerty13




کاربرانِ درحال بازدید از این موضوع: 1 مهمان