«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
یونیتی+unity3d+uity2d+پکیج :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

قدیمیا دلم براتون تنگ شده... فقط معرفی کنید توی پیامک یا تماس یاد بیارید.
اگه جواب ندادم شاید موقعیت نداشته باشم.
بگید توی پیام از بچه های پرومیکرز هستید.

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

۷۲۶ مطلب با موضوع «یونیتی+unity3d+uity2d+پکیج» ثبت شده است

منبع:gameover.blog.ir
توی این فیلم با استفاده از پلاگین جانبی یاد می گیرید فایل json خروجی گرفته از spine رو ببرید توی یونیتی و انیمیشن رو اجرا کنید:

http://www.mediafire.com/download/xv159xd1rbcxxar/Importing_a_Spine_Animation_into_Unity3D_%255BYT-f22%255D%255Bx1umSQulghA%255D.mp4



اینم لینک پلاگین :
https://github.com/EsotericSoftware/spine-runtimes
بعد از باز کردن پوشه spine-unity رو ببرید توی یونیتی و به پوشه assets اضافه کنید. بقیه هم تو فیلم اموزش داده.
نظر یادتون نره.
۱ نظر موافقین ۰ مخالفین ۰ ۰۳ مهر ۹۴ ، ۱۶:۰۵
مدیرکل
منبع :gameover.blog.ir
تکستچرهایی که ابعاد اون ها توانی از 2 باشه(مثل 2،4،8،16،32،128 و الی آخر) رو می گن تکستچر اطلس.بهتره برای سرعت بهتر تکستچرهای اطلس بسازید . (مثلا توی فتوشاپ می تونید اندازه رو با ctrl+alt+i تنظیم کنید)اگه اطلس نسازید البته یونیتی خطا نمی ده ولی خودش مجبوره تبدیلات رو انجام بده.موفق باشید.
۱ نظر موافقین ۰ مخالفین ۰ ۰۳ مهر ۹۴ ، ۰۲:۲۴
مدیرکل
منبع:gameover.blog.ir
اسکریپت سیشارپ زیر رو بندازید روی ui->image ای که ساختید. کد زیر رو ببینید فکر کنید روش خودتون درک می کنید چطوری با event system کار کنید. من اومدم یه پیام ساده رو لاگ کردم وقتی روی image کلیک رو پایین می دیم همون بار اول پیام میده.
//EventSystem test for ui image in Unity
//Author:gameover.blog.ir
using
UnityEngine.EventSystems; using UnityEngine; using System.Collections; public class Example: MonoBehaviour { void Update () { if (Input.GetMouseButtonDown (0)) { EventSystem eventSystem = EventSystem.current; if (eventSystem.IsPointerOverGameObject ()) { Debug.Log ("mouse down"); }//if }//if }//Update }
اگه بخواید ماوس رو نگه دارید یه ضرب پیام رو لاگ کنه به جای Input.GetMouseButtonDown (0) از Input.GetMouseButton (0 استفاده کنید.
۲ نظر موافقین ۰ مخالفین ۰ ۰۳ مهر ۹۴ ، ۰۱:۱۵
مدیرکل

منبع :gameover.blog.ir

چرا بعضی اوقات وقتی دشمنو تکثیر میکنیم فقط رو یکشون عمل میکنه ؟
پاسخ :
دلیلش اینه که متغیرها رو باید از نوع static تعریف کنیم.متغیرهایی از نوع static تعریف می شن آخرین مقدار خودشون رو نگه می دارن.
وقتی ما یک دشمن رو instantiate می کنیم اگه بخوایم همه ی دشمن ها عین هم عمل کنن و مثلا به طور هوشمند دنبالمون بیان یا به حالت idle برن باید نوع متغیری که در منطق یا logic خودمون ازش اتفاده می کنیم رو از نوع static تعریف کنیم.

۰ نظر موافقین ۰ مخالفین ۰ ۰۲ مهر ۹۴ ، ۲۲:۳۲
مدیرکل

منبع:gameover.blog.ir

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

bool supportsMultiTouch = Input.multiTouchEnabled;
print("MultiTouchSupport : " + supportsMultiTouch);


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

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

            {

                int nbTouches = Input.touchCount;


                if(nbTouches > 0)

                {

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


                    for (int i = 0; i < nbTouches; i++)

                    {

                        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 شروع و پایان و لحظه ی تاچ را تشخیص می دهیم :
void Update ()
        {
           int nbTouches = Input.touchCount;

           if(nbTouches > 0)
           {
              for (int i = 0; i < nbTouches; i++)
              {
                 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 رو محاسبه می کنیم :
float touchSpeed = touch.deltaPosition.magnitude / touch.deltaTime;

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

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

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

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

                    }
                }
        }


در بعضی مواقع می خوایم دوبار لمس سریع کاربر رو بررسی کنیم.برای مثال یه وقتی می خوایم وقتی کاربر با انگشت به صفحه ضربه(tap) زد Player راه بره و اگه دوبار سریع ضربه زد(double tap) کاراکتر Player با سرعت راه بره.
void Update ()
            {
                int nbTouches = Input.touchCount;

                if(nbTouches > 0)
                {
                    for (int i = 0; i < nbTouches; i++)
                    {
                        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 نمی تونه لمس های سریع رو درست تشخیص بده.(سعی کنید یادتون باشه)
۲ نظر موافقین ۰ مخالفین ۰ ۰۲ مهر ۹۴ ، ۲۲:۲۸
مدیرکل
منبع : gameover.blog.ir
۰ نظر موافقین ۰ مخالفین ۰ ۰۲ مهر ۹۴ ، ۲۲:۰۶
مدیرکل
منبع :gameover.blog.ir

How to calculate a new position having angle and distance?

کد اول:
 var x = dist * cos(angle * Mathf.Deg2Rad);
 var y = dist * sin(angle * Mathf.Deg2Rad);
 var newPosition = currentPosition;
 newPosition.x += x;
 newPosition.y += y;


کد معادل:

var q = Quaternion.AngleAxis(angle, Vector3.forward);
newPosition = currentPosition + q * Vector3.right * distance;

هر دو کد به زبان javascript بود. کد معادل سیشارپ هم خیلی ساده هست دیگه var نداره و نوع x و y و newPosition و q رو قبل از اسمشون میاریم.

نکته: فاصله/distance همون شعاع/radius هست.

منبع :
http://answers.unity3d.com/questions/491719/how-to-calculate-a-new-position-having-angle-and-d.html

موفق باشید.

۰ نظر موافقین ۰ مخالفین ۰ ۰۲ مهر ۹۴ ، ۱۹:۳۵
مدیرکل

منبع:gameover.blog.ir

با تشکر از سجاد

این متد برای قطع انیمیشن های قبلی و سوئیچ بدون شرط (بدون condition های تعریف شده در پنجره animatior برای انتقال یا transision ها) بکار می رود. برای مثال ممکنه در پنجره Animator روی خطوط انتقال بین انیمیشن ها شرط گذاشته باشیم که مثلا فلان متغیر اگه مقدارش فلان چیز بود اگه روی انیمیشن 1 بود بره به انیمیشن 2 .

اما با استفاده از crossFade در هر وضعیتی که باشیم و هر انیمیشنی که داره اجرا میشه بدون هیچ شرطی قطع می شه و به صورت آنی و فوری سوئیچ میشه روی انیمیشن دلخواه.

مثال :

    Public AnimatorPlayerAnimator;
        if(Input.GetMouseButtonDown(1))
        {
        PlayerAnimator.CrossFade("Fire",1);
        }
        else
        {
        PlayerAnimator.CrossFade("Idle",1);
        }
      در مثال فوق متغیر anim از نوع Animator تعریف شد و چون public هست در inspector باید کامپوننت Animator رو بکشیم بندازیم روش.شرط اول می گه اگه کلیک ماوس پایین بود انیمیشن Fire اجرا بشه وگرنه انیمیشن Idle.


      stateName: اسم state ای که توی پنجره Animator controller اضافه کردیم.

      transitionDuration:مدت زمان انتقال یا سوئیچ به انیمیشن.

      normalizedTime: زمان شروع انیمیشن مقصد که به آن سوئیچ می کنیم بوده ومقدارش بین 0 و 1 است.
      این مقدار زمان نرمال source state (وضعیت ابتدایی)است.اگه هیچ مقداری به این پارامتر ندیم normalizedTime تنظیم می شود یا مقدار normalizedTime منفی بی نهایت(NegativeInfinity) شناور (float) فرض می شود این مقدار پیشفرض رو با float.NegativeInfinity معرفی می کنیم و وضعیت اگر در حال اجرا نباشد از اول play می شود.(یا از زمان جاری اجرا و هیچ Transition یا سوئیچی بین انیمیشن ها اتفاق نمی افتد).

      layer: اسم لایه ای که شامل انیمیشن مقصد هست که قرار است به آن سوئیچ کنیم .اگه مقدار لایه خالی باشد لایه منفی یک(-1) فرض می شود (منفی یک به معنی first state یا وضعیت اول با نام داده شده اجرا می شود یا هش(hash)اجرا خواهد شد.(hash اسم یک state به صورت درهم هست.حالا به چه دردی میخوره)

      stateNameHash: هش وضعیت(state hash) از وضعیت مقصد است.اگر مقدار 0 بگیرد،انتقال یا transition به خودش بر می گردد(self)

      ما نمی توانیم وضعیت جاری را در یک synchronized layer (لایه ی همگام) تغییر دهیم بلکه باید آن را در لایه ی رجوع شده(Refrenced layer) تغییر دهیم.

      منبع :
      http://docs.unity3d.com/es/current/ScriptReference/Animator.CrossFade.html
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۲ مهر ۹۴ ، ۰۰:۲۷
      مدیرکل

       منبع :gameover.blog.ir

      می تونید این کد رو توی Update بذارید:

      gameObject.transform.position = Input.mousePosition;
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۱ مهر ۹۴ ، ۱۳:۵۵
      مدیرکل
      using UnityEngine;
      using System.Collections;
      using UnityEngine.UI;
       
       
      public class SpriteTest : MonoBehaviour {
       
       
          public Image mySprite;
       
       
          void OnTriggerEnter()
          {
              Invoke("ActiveSprite",1);
          }
       
       
          void ActiveSprite()
          {
              mySprite.enabled = true;
          }
      }
      ۱ نظر موافقین ۰ مخالفین ۰ ۳۱ شهریور ۹۴ ، ۱۹:۰۰
      مدیرکل

      این گزینه نقش enabed رو بازی می کنه. اگه true باشه آیتم عمل می کنه و اگه false باشه آیتم عمل نمی کنه.

      معمولا در قسمت ui->canvas group یا اشیای زیرشاخه ی ui (واسط کاربری) در یونیتی 5 می تونید دکمه و کادر متن و عکس و ... رو به عنوان یوزر اینترفیس بسازید. و هر کدوم رو خواستید عمل نکنه گزینه ی interactable رو false کنید یا تیکشو بردارید.(توی inspector)

      http://s6.picofile.com/file/8213435050/interactable.jpg

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۱ شهریور ۹۴ ، ۱۳:۳۹
      مدیرکل
      کپی:gameover.blog.ir
      این کلمه برای تعریف متغیرهایی بکار می ره که نوعشون رو نمی دونیم یا بر حسب مقدار می خوایم نوع اون رو مشخص کنیم.
      مثال:
      // i is compiled as an int 
      var i = 5;
      
      // s is compiled as a string 
      var s = "Hello";
      
      // a is compiled as int[] 
      var a = new[] { 0, 1, 2 };
      
      // expr is compiled as IEnumerable<Customer> 
      // or perhaps IQueryable<Customer> 
      var expr =
          from c in customers
          where c.City == "London" 
          select c;
      
      // anon is compiled as an anonymous type 
      var anon = new { Name = "Terry", Age = 34 };
      
      // list is compiled as List<int>                              
      var list = new List<int>();
      
      منبع :
      https://msdn.microsoft.com/en-us/library/bb384061.aspx


      ۱ نظر موافقین ۰ مخالفین ۰ ۳۱ شهریور ۹۴ ، ۰۲:۰۰
      مدیرکل

      منبع: gameover.blog.ir
      ۱ نظر موافقین ۰ مخالفین ۰ ۳۰ شهریور ۹۴ ، ۲۰:۰۲
      مدیرکل
      منبع: gameover.blog.ir


      اجرای یک فیلم در ابتدای بازی و از بین رفتن بعد از چند (در اینجا 10) ثانیه:
      اسکریپت زیر رو میندازیم روی یک plane.
      سپس یک فیلم کوتاه mp4 رو به پروژه اضافه می کنیم (به صورت movie texture توسط یونیتی تبدیلات انجام میشه خودکار)
      یادتون نره quick Time هم باید نصب باشه) .
      سپس فیلم رو می کشیم روی پارامتر a که از نوع MovieTexture تعریف کرده بودیم.
      حالا اجرا می کنیم

      کد PHP:
      //movieTexture.js
      //author:sajjad3011
      var MovieTexture;
      var 
      i:float=0;
       var 
      myTimer float 10.0;
      function 
      Start () {
       
      renderer.material.mainTexture a;
      a.Play();
      }
       
      function 
      Update () {

      if(
      myTimer && a.isPlaying){ 
      myTimer -= Time.deltaTime
      if(
      myTimer <= 0){Destroy(transform.gameObject); }
      }
      }
      //update 
      روی صحنه ی دلخواه میریم تا نمای خوبی داشته باشیم سپس دوربین رو انتخاب می کنیم و ctrl+shit+F می زنیم تا روی صحنه ی جاری set بشه.
      فیلم اجرا میشه و بعد از 10 واحد زمانی نابود میشه.
      بعدش می تونید هر عملی دوست داشتید انجام بدید.

      کد معادل سیشارپ:
      معادل سیشارپ:
      public MovieTexture a;
      float myTimer =10f;
      void Start(){
      renderer.material.mainTexture = a;
      a.Play();
      }
      void Update () {
      if(myTimer > 0 && a.isPlaying){ 
      myTimer -= Time.deltaTime; 
      if(myTimer <= 0){Destroy(transform.gameObject); 
      }
      }

      ۱ نظر موافقین ۰ مخالفین ۰ ۳۰ شهریور ۹۴ ، ۱۹:۵۰
      مدیرکل
      منبع: gameover.blog.ir
      با تشکر از sajjad3011

      نابود شدن گیم ابجکت با کلیک روی آن:

      کد :
      void Update (){
              if (
      Input.GetMouseButtonDown (0))
                  
      Destroy (transform.gameObject);

      حرکت گیم آبجکت به سمت بالا در زمان بین 2 الی 6 ثانیه:
      کد :
      using UnityEngine;
      using System.Collections;

      public class 
      harkat MonoBehaviour {
          public 
      float speed=0.01f;
          
      // Use this for initialization
          
      void Start () {
          
          }
          
          
      // Update is called once per frame
          
      void Update () {
              if(
      2<=Time.time && Time.time <=6)
              
      transform.position = new Vector2 (transform.position.xtransform.position.Time.time speed);
          }

      از حرکت ایستادن گیم آبجکت بعد از برخورد با شی دیگر:
      برای اینکه به هر دو ابجکت کامپوننت Collider می دهیم.

      نامرعی کردن گیم ابجکت در یونیتی/مخفی کردن یا invisible کردن گیم ابجکت در یونیتی:
      کد :
      GetComponent<Renderer> ().enabled false

      بردارهای حرکت در یونیتی:
      کد:
      Vector3.zero    خلاصش میشه Vector3(0, 0, 0).
      Vector3.one    خلاصش میشه Vector3(1, 1, 1).

      Vector3.down    خلاصش میشه Vector3(0, -1, 0).
      Vector3.up    خلاصش میشه Vector3(0, 1, 0).

      Vector3.forward    خلاصش میشه Vector3(0, 0, 1).
      Vector3.back    خلاصش میشه Vector3(0, 0, -1).

      Vector3.left    خلاصش میشه Vector3(-1, 0, 0).
      Vector3.right    خلاصش میشه Vector3(1, 0, 0).
      سیستم ضرب برداری هم در اینجا بحث شده قبلا :
      http://promakers.ir/showthread.php?tid=12123

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ شهریور ۹۴ ، ۱۷:۰۰
      مدیرکل
      منبع: gameover.blog.ir

      اسکریپت حرکت به جایی که کلیک کردیم move2click در یونیتی:
      کد js :

      کد :
      // Click To Move script
      // Moves the object towards the mouse position on left mouse click
       
      var smooth:int=1; // Determines how quickly object moves towards position
       
      private var targetPosition:Vector3;
       
      function Update () {
          if(Input.GetKeyDown(KeyCode.Mouse0))
          {
              var playerPlane = new Plane(Vector3.up, transform.position);
              var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
              var hitdist = 0.0;
       
              if (playerPlane.Raycast (ray, hitdist)) {
                  var targetPoint = ray.GetPoint(hitdist);
                  targetPosition = ray.GetPoint(hitdist);
                  var targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
                  transform.rotation = targetRotation;
              }
          }
       
          transform.position = Vector3.Lerp (transform.position, targetPosition, Time.deltaTime * smooth);
      }
      اسکریپت بالا به زبون js هست.بندازید روی player.اجرا کنید. هرجا کلیک می کنید player میره اونجا.
      پارامتر smooth روی 1 تظیم شده.اگه مقدارش بیشتر بشه سرعت حرکت بیشتر میشه.
      نکته: اسکریپت فوق برای بازی های استراتژی از نمای کامل بالا کار نمی کنه)
      اسکریپت حرکت سه بعدی پلیر در یونیتی/اسکریپت کاراکتر کنترلر:

      این اسکریپت رو بدید به player .
      نکته: پلیر نباید کامپونتت rigid body داشته باشه.ضمنا یک کامپوننت character controller هم بدید به player.
      کد :

      #pragma strict
      
      function Start () {
      
      }
      private var moveDirection : Vector3 = Vector3.zero;
      function Update () {
         
       var speed=5;
       var jumpSpeed=5;
       var gravity=5;
              var controller : CharacterController = GetComponent(CharacterController);
              if (controller.isGrounded) {
                  // We are grounded, so recalculate
                  // move direction directly from axes
                  moveDirection = 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);
          
      
      }
      اسکریپت حرکت دو بعدی player به چپ و راست در یونیتی:
      کد :
      //Player.Cs
      //move 2d player Left/Right Unity
      //Author:Sajjad3011
      using UnityEngine;
      using System.Collections;
      
      public class player : MonoBehaviour {
      
          private Animator animator;
          private int walkSpeed=5;
      
          private float xScale,yScale;
          private bool run;
      
          void Start () {
              animator = this.GetComponent<Animator> ();
              xScale = transform.localScale.x;
              yScale = transform.localScale.y;
      
          }
      
          void Update(){ 
              if (Input.GetKey(KeyCode.RightArrow)) {
                  run=true;
                  GetComponent<Rigidbody2D>().velocity=new Vector2(walkSpeed,GetComponent<Rigidbody2D>().velocity.y);
                  transform.localScale=new Vector2(xScale,yScale);
              }
              if (Input.GetKey (KeyCode.LeftArrow)) {
                  run=true;
                  GetComponent<Rigidbody2D>().velocity=new Vector2(-walkSpeed,GetComponent<Rigidbody2D>().velocity.y);
                  transform.localScale=new Vector2(-xScale,yScale);
              }
              if (Input.anyKey==false){
                  GetComponent<Rigidbody2D>().velocity=new Vector2(0,GetComponent<Rigidbody2D>().velocity.y);
                  run=false;
              }
      
              if (animator != null) {
                  animator.SetBool ("run", run);
      
              }
      
          }
      }


      به این بخش مراجعه بفرمایید: http://promakers.ir/showthread.php?tid=12196



      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ شهریور ۹۴ ، ۱۶:۵۵
      مدیرکل

      منبع : gameover.blog.ir

      سعی کنید برای کدهاتون توضیح بذارید و dirty code رو به clean code ویرایش کنید.
      کد تمیز کدی هست که فهم و درک اون آسونتر و کد کثیف کدی هست که فهم و درکش سخت تر باشه.
      مثال:
      کد کثیف:

      کد:
      if (Input .GetAxis ("Horizontal")<0)//Left
      کد اصلاح شده تمیز:
      کد :
      if (Input.GetKey(KeyCode.LeftArrow))//Left 
      کد کثیف:
      کد:
      if (Input .GetAxis ("Horizontal")>0)//Right
      کد اصلاح شده ی تمیز:
      کد :
      if(Input.GetKey (KeyCode.RightArrow))//Right 
      کد کثیف:
      کد:
      if (Input .GetAxis ("Vertical")>0)//Up
      کد اصلاح شده ی تمیز:
      کد :
      if (Input.GetKey (KeyCode.UpArrow))//Up
      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ شهریور ۹۴ ، ۱۶:۵۵
      مدیرکل
      کپی از : gameover.blog.ir
      با اسکریپت زیر دشمن همیشه به player نیگا می کنه


      using UnityEngine;
      using System.Collections;

      public class 
      ExampleClass MonoBehaviour {
          public 
      Transform target;
          
          
      void Update() {
              
      // Rotate the camera every frame so it keeps looking at the target 
              
      transform.LookAt(target);
          }
      }


      متغیر target از نوع public تعریف شد.
      target یعنی هدفی که می خوایم دشمن بهش نگاه کنه.
      بنابراین می تونیم اسکریپت رو بندازیم روی دشمن و سپس player رو بکشیم بندازیم روی پارامتر target که به صورت پابلیک ساختیم.
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۷ شهریور ۹۴ ، ۲۳:۱۴
      مدیرکل
      چرخش حول محور z :
      transform.Rotate(0, 0, 100*Time.deltaTime);  //fast anti-clockwise rotation
       transform.Rotate(0, 0, 10*Time.deltaTime);   // slower  anti-clockwise rotation
       transform.Rotate(0, 0, 100* -Time.deltaTime);  // fast clockwise rotation
       transform.Rotate(0, 0, 10* -Time.deltaTime);   // slower clockwise rotation

      چرخش به سمت ماوس:
      void Update () {
      Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
      transform.rotation = Quaternion.LookRotation(Vector3.forward, mousePos - transform.position);
      }


      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ شهریور ۹۴ ، ۰۳:۴۰
      مدیرکل

      پاسخ:
      گاهی علت این است که به گیم ابجکت های خود collider های 2D داده ایم اما در اسکریپت خود از توابع 3D در اسکریپ های خود استفاده کرده ایم.

      برای حل مشکل از مثال زیر الگو بگیرید :

      کد سیشارپ:
              void OnTriggerEnter2D(Collider2D other) {
              
      Debug.Log("OnTriggerEnter 2D");
              } 

              
      void OnCollisionEnter2D(Collision2D coll) {
              
      Debug.Log("OnCollisionEnter 2D"); 
      نکته ی دوم اینه که هر دو گیم ابجکت باید collider 2d داشته باشد.
      نکته سوم : بلعکس موارد فوق هم ممکنه رخ بده که خودتون می تونید جابجا کنید توابع 2D رو با توابع 3D.
      ۱ نظر موافقین ۰ مخالفین ۰ ۲۴ شهریور ۹۴ ، ۰۲:۰۲
      مدیرکل

      gameover.blog.ir

      تکنیک یک : یونیکد

      🔶🔶🔶🔶تایپ فارسی در یونیتی/فارسی نویسی در یونیتی:(آموزش:سجاد)

      خوب اینم به خاطر سوال یکی از دوستان اشاره می کنم خودتون برید پی ش:

      1)این سایت برای پیدا کردن کد کاراکترهای فارسی و انگلیسی و غیره به کارتون میاد :
      https://unicode-table.com/en/#arabic

      2) این کد برای تبدیل کد هگزا دسیمال به کاراکتر مورد نظر هست(کدش به زبان سیشارپ هست و در یونیتی ازش استفاده می کنیم)

      char upArrow = '\u25B2';
      Debug.Log(upArrow.ToString());

      سایت رو می بینید؟ سمت چپش هر کاراکتر کد هگز داره

      مثلا 0620 میشه "ی" فارسی

      با بک اسلش یو،اومده می گه می خوام یونیکد تایپ کنی برام
      بعدش کد اسکی می ده که در مبنای شانزده یا هگزا دسیمال هست
      25B2

      برد یم دسیمال دهدهی

      decimal=مبنای ده

      اگه alt نگه داری 9650 بزنی اون کاراکتر تایپ میشه

      اگه هم توی یونیتی بخوای باید همین 9650 رو تبدیل به هگزا دسیمال کنی بعدش بدی به تابع ToString

      تبدیل کنه به رشته

      با \u


      char upArrow = '\u25B2';
      Debug.Log(upArrow.ToString());

      بلی

      باید برید تو سایت https://unicode-table.com/en/#arabic

      کد تمام حروف رو در بیارید

      از a تا z
      از الف تا ی
      و الی آخر


      و کد هگزا دسیمالشونو توی ارایه کپی کنی

      توی یونیتی

      بعدش از هر کدوم خواستی استفاده کنی

      کلمه دلخواه رو هم می تونی بنویسی

      یا رشته دلخواه


      اها تازه فهمیدم😃

      =====


      تکنیک دو:

      با استفاده از یک فارسی ساز می تونید متن فارسی رو به یونیتی انتقال داده و از فونت مجازش توی یونیتی استفاده کنید.
      به عنوان مثال فونت F_unwan.ttf (فونت هایی که اولشون F داره) برای فارسی ساز Leo moon کار می کنه که می تونید این فونت رو بکشید توی project و سپس یک ui canvas Text ایجاد کرده و فونت رو بکشید روی پارامتر Font در inspector.
      سپس متن تایپ شده در Leomoon رو کپی کنید توی فیلد Text در inspector .
      [تصویر: farsi_unity.gif]




      کل کاراکترهای فارسی رو با Leomoon کپی بگیرید

      ببر توی یک آرایه در یونتی ذخیر کنید


      برای اینکه متن فارسی با حروف درست وارد بشه و حروف جمله به ترتیب از راست ترین حرف وارد بشه  و سپس با تایپ به سمت راست بره ابتدا خصوصیت رو در inspector روی چپ چین بذارید سپس جمله ی فارسی رو در متغیری از نوع رشته ای ذخیره کنید مثال myString.
      سپس داریم:

      IEnumerator PlayText()
      {   
       for (int i=myString.Length-1;i>0i--) {
       
        TTX.text = myString[i] + TTX.text ;
          yield return new WaitForSeconds (0.125f);
      
       }
      }

      ۱ نظر موافقین ۱ مخالفین ۰ ۲۴ شهریور ۹۴ ، ۰۲:۰۱
      مدیرکل

      //move and jump -
      //attach this Script to ur Player
      //hot keys :  
      //            ArrowKeys=Move
      //            Space=Jump
      //Edided by : sajjad3011
          
      var speed float 6.0;
          var 
      jumpSpeed float 8.0;
          var 
      gravity float 20.0;

          private var 
      moveDirection Vector3 Vector3.zero;
          function 
      Start()
          {
                
      //this.gameObject.AddComponent(Rigidbody);//afzudane fizik
                
      this.gameObject.AddComponent(CharacterController);//afzudane character controller
          
      }
          function 
      Update() {
              var 
      controller CharacterController GetComponent(CharacterController);
              if (
      controller.isGrounded) {
                  
      // We are grounded, so recalculate
                  // move direction directly from axes
                  
      moveDirection Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical"));
                  
      moveDirection transform.TransformDirection(moveDirection);
                  
      moveDirection *= speed;
                  
                  if (
      Input.GetButton ("Jump")) {
                      
      moveDirection.jumpSpeed;
                  }
              }

              
      // Apply gravity
              
      moveDirection.-= gravity Time.deltaTime;
              
              
      // Move the controller
              
      controller.Move(moveDirection Time.deltaTime);
          }



      واسه تشخیص برخورد هم ابتدا گیم ابجکت دلخواه رو انتخاب می کنی و add component و سپس box collider (محدوده ی مکعبی شکل) یا sphere collider( محدوده ی کره ای شکل برای شخص کردن ناحیه برخورد) میدی بهشون.
      rigid body هم ندادم چون کمی مشکل ساز میشه
      کد خیلی ساده هست . با کد یک کاراکتر کنترلر اضافه کردم. می تونستم دستی هم تو بخش طراحی با دکمه add component و تایپ character controller و enter اضافه کنم که خودم کدنویسی رو چون دوست داشتم با کد اضافه کردم
      ۲ نظر موافقین ۰ مخالفین ۰ ۲۳ شهریور ۹۴ ، ۱۸:۰۹
      مدیرکل
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۳ شهریور ۹۴ ، ۰۲:۱۵
      مدیرکل
      کل مطلب در RayCast خلاصه میشه.
      ایده :

      http://answers.unity3d.com/questions/438175/enemy-ai-detect-player-when-seen.html


      ۰ نظر موافقین ۰ مخالفین ۰ ۲۲ شهریور ۹۴ ، ۲۰:۵۲
      مدیرکل

      اینو بذار تو update:
      واسه چرخش:

      کد:

      transform.Rotate (new Vector3(0, Time.deltaTime, 0) * rotationSpeed );
      به جای rotationSpeed هم سرعت دلخواه رو بده. پاراکتر اول و آخر Vector3 رو صفر دادم که x,z هستن.ما میخوام حول y بچرخه واسه همین پارامتر دوم رو هر لحظه با زمان افزایش میدیم و بردار بدست اومده رو در سرعت دلخواه ضرب می کنیم که زاویه چرخش هی زیاد میشه و همینطور می چرخه.
      واسه حرکت هم : مثال:
      کد:

      //transform.position.Set(new_x,new_y,new_z);
      transform.position.Set(transform.position.x,transform.position.y,new_z)
      ۴ نظر موافقین ۰ مخالفین ۰ ۱۷ شهریور ۹۴ ، ۱۹:۰۲
      مدیرکل


      Vector3.zero    خلاصش میشه Vector3(0, 0, 0).
      Vector3.one    خلاصش میشه Vector3(1, 1, 1).

      Vector3.down    خلاصش میشه Vector3(0, -1, 0).
      Vector3.up    خلاصش میشه Vector3(0, 1, 0).

      Vector3.forward    خلاصش میشه Vector3(0, 0, 1).
      Vector3.back    خلاصش میشه Vector3(0, 0, -1).

      Vector3.left    خلاصش میشه Vector3(-1, 0, 0).
      Vector3.right    خلاصش میشه Vector3(1, 0, 0).


      myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
      ادامه ی بحث:
      http://promakers.ir/showthread.php?tid=12123&pid=125881#pid125881
      ۰ نظر موافقین ۰ مخالفین ۰ ۱۷ شهریور ۹۴ ، ۱۴:۵۵
      مدیرکل
      منبع: gameover.blog.ir



      //test.Csharp
      //Switch between animations of Animator component by changing the condition variable 'state'
      //Author:Sajjad3011
      
          using UnityEngine;
          using System.Collections;
          public class test : MonoBehaviour {
              int state = 0;
              public Animator animator1;
              void Start () {
              }    
              // Update is called once per frame
              void Update () {
                  if (Input.GetKey (KeyCode.LeftArrow)) {
                      state = 1;
                      Debug.Log("left");
                  }
                  if (Input.GetKey (KeyCode.RightArrow)){
                      state = 2;
                      Debug.Log("right");
              }
                  if (animator1 == null) {
                      Debug.LogError("Animator is null!");
                  } else {
                       animator1.SetInteger("state", state);
                  }
          
              }
          }
      
      //S3011 
      در این اسکریپت متغیر animator1 رو به صورت Public تعریف کردیم تا بتونیم بعد از اختصاص این اسکریپت، توی پنجره inspector به صورت پارامتر ورودی تنظیم کنیم.

      متغیر state از کامپوننت Animator رو با فشردن کلید چپ و راست روی 1 و 2 تنظیم می کنیم و توی پنجره ی ماشین حالت Animator هم شرط یا condition ای به نام state از نوع Integer تعریف می کنیم و روی فلشی که به سمت انیمیشن سمت راست می ره می گیم اگه state مساوی(Equal) بود به 1 و روی فلشی که به سمت انیمیشن دویدن به سمت چپ می ره می گیم اگه state مساوی(Equal) بود به 2 .


      ۰ نظر موافقین ۰ مخالفین ۰ ۱۶ شهریور ۹۴ ، ۱۰:۵۳
      مدیرکل
      ۱ نظر موافقین ۰ مخالفین ۰ ۱۴ شهریور ۹۴ ، ۱۷:۱۲
      مدیرکل

      می خوای چیکار کنی با این کد؟ موبایل رو کج کنی به راست و چپ موتور یا ماشین فرمون بده به چپ و راست ؟
      با این عکسا روحیه بدم بهت؟ Gyroscope

      http://www.i-phone.ir/forums/uploadedpictures/8cc1d230c10801cfb2144d6bac42639f.jpg

      http://www.techtilt.com/wp-content/uploads/2010/06/iPhone-4-Gyroscope-640x410.jpg


      http://opizo.com/AJjJkF

      ۰ نظر موافقین ۰ مخالفین ۰ ۱۲ شهریور ۹۴ ، ۱۱:۴۷
      مدیرکل
      منبع :gameover.blog.ir
      1. if(!playerController.IsGrounded() && playerController.velocity.y < 0)
      2. {
      3. animation.CrossFade("FallDown", 0.5);
      4. animation["FallDown"].speed = 3;
      5. }


      منبع :
      http://answers.unity3d.com/questions/776750/fall-animation-when-character-is-falling.html

      ۰ نظر موافقین ۰ مخالفین ۰ ۱۰ شهریور ۹۴ ، ۱۲:۲۱
      مدیرکل

       منبع :gameover.blog.ir



      ctrl+shift+B

      Player settings

      Other settings

      miminum api Level

      android 2

      http://s3.picofile.com/file/8208463468/buildSettingMinimumAndroidRequirement.gif


      ۰ نظر موافقین ۰ مخالفین ۰ ۰۳ شهریور ۹۴ ، ۲۱:۱۳
      مدیرکل

       منبع :gameover.blog.ir


      velocity

      سرعت حرکت یا شتاب رو تعریف می کنه.سرعت دوربین+کامپوننت انیماتور+سیستم ذره ای پارتیکل(دود و جرقه و ....)+بدنه های فیزیکی جامد و سخت(rigid body)+کامپوننت character controller و .... .
      ۱ نظر موافقین ۰ مخالفین ۰ ۰۱ شهریور ۹۴ ، ۲۳:۴۰
      مدیرکل

      کپی از : gameover.blog.ir

      موقعی که دارم خروجی apk می گیرم خطای زیر رو میده.این خطا برای چیه ؟

      UnityException: Minimum platform required is Android 5.0 (API level 21)
      [تصویر: android5_0_api_level_21.jpg]

      ۳ نظر موافقین ۰ مخالفین ۰ ۰۱ شهریور ۹۴ ، ۲۲:۳۳
      مدیرکل
      gameover.blog.ir

      هوش دشمن (Enemy AI)


      ۱ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۲۷
      مدیرکل

      gameover.blog.ir

      تگ یا Tag عنی برچسب یا اسم مستعار.
      توی html ما قبلا به چند تا ابجکت id می دادیم که ثابت بود و هر ابجکت یه اسم ثابت داشت نمی تونستیم تغییرش بدیم ولی می تونستیم یه کلاس یا class تعریف کنیم و همه ی ابجکت های لخواه رو از نوع اون کلاس تعریف کنیم یا برچسب بزنیم. بعدش که میخواستیم تغییراتی روی اون ابجکت ها ایجاد کنیم دیگه دستی اینکار سخت بود. کافی بود اسم اون کلاس رو داشته باشیم و خصوصیاتشو دستکاری کنیم یا بهشون دستیابی داشته باشیم.
      توی html چیزی بود تو مایه های tagByName یا tagByID که بهش ایدی میدادیم و خودش همه رو لیست می کرد بعدش میریختیم توی ارایه و با یه حلقه ی تکرار به کل ابجکت های ریخته شده توی ارایه دسترسی داشتیم و یه سری عملیات کلی روی اونا انجام میدادیم.

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۲۴
      مدیرکل

      gameover.blog.ir

      AI = Artificial Intelligence به معنی هوش مصنوعی هست.

      هوش رو با منطق(logic) (دستورات شرطی مثل and و not و or و if و ... ) میسازن.

      بعضی جاهاشو هم با دستورات محاسبات یا ریاضیات (Mathematics) میسازن(مثل add و sub و ... و دستورات جمع و تفریق و ... که توی درس assembly یا ... می تونید بخونید توسط CPU انجام میشه)

      سال 86 یا 87 بود اگه اشتباه نکنم یه کد هوش مصنوعی با CPP نوشته بودم که واقعا فکر می کرد و می تونست یاد بگیره و مغزشو گسترش بده و تصمیم بگیره تا در کل یک منطقه به حرکت در بیاد. روش کار من الگوریتم پر کردن یک ناحیه ی بسته بود که با داشتن مختصات داخل اون میومدم چهار جهتش رو بررسی می کردم اگه اطرافش خالی بود مختصات نقاط اون چهار طرف بالا و پایین و چپ و راست رو save می کردم توی یک stack یا پشته یا آرایه و بعدش اونا رو دونه دونه از آرایه بیرون میاوردم و چهار جهت هر یک از اونا رو دوباره بررسی می کردم که جای خالی داریم یا نه اگه داشتیم مختصات اون نقاط رو بازم می ریختم توی آرایه و همینطور الی آخر تا همه جا رنگ آمیزی بشه.

      خوب این روش کمک های زیادی به ما می کنه و می تونیم چیزای زیادی برای درک خوش مصنوعی در زندگی و جاهای دیگه ازش یاد بگیریم.

      ماشینی رو فرض کنید توی یک پارکینگ هست و می خواد درب خروج رو پیدا کنه. باید فاصله های بالا و چپ و اطراف رو با انداختن نویز یا اشعه یا توابع مخصوص بررسی کنه تا ببینه اون نقاط جای خالی دارن واسه حرکت یا خیر.

      و همینطور باید جاهای بررسی شده تا رسیدن به اولین دیوار رو علامتگذاری کرد تا دوباره اون نقاط رو بررسی نکنه و وقت هدر نده.

      اینا همش از لحاظ تئوری،توضیحات بود که من براتون دادم.sajjad3011

      واسه اینکه هوش بنویسید باید توابع و روش ها و فکر خودتون رو شترش بدید و مهم از همه اینه که باید کد ببینید و فیلم های یوتیوب و سایت های ایرانی و غیره ... رو بررسی کنید یا مطالعه کنید.


      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۲۰
      مدیرکل

      منبع :gameover.blog.ir

      توی یونیتی این روش رو میشه با way points ایجاد کرد که بالاتر درس دادم.

      روش کار A star اینه که تمام مسیر ها رو باید توی آرایه یا یه لیستی ذخیره کنیم و فاصله ها رو محاسبه کنیم.(جستجوی مکاشفه ای یا huristic)

      بعدش نزدیک ترین راه رو انتخاب می کنیم.

      محاسبات قبلی برای پیدا کردن مسیر بهینه وجود داره که اونا رو دیگه خودتون می تونید با هر روشی انجام بدید.

      مثلا زمانی که player بیکار هست یا ایستاده می تونید محاسبات اضافه رو انجام بدید. یا وقتی کاراکتر روی فلان نقطه ( onCollisionEnter یا ...) هست فاصله ی نزدیک ترین مسیر و بهینه ترین مسیر رو پیدا کنیم بعدش دشمن رو حرکت بدیم بیاد سمت ما(player)

      مثلا این عکس رو ببینید :
      [تصویر: a_star_sajjad3011.jpg]

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۰۹
      مدیرکل

       منبع :gameover.blog.ir

      یک plane به عنوان زمین و چند تا cube به عنوان مانع بذارید روی plane .
      یه sphere با متریال زرد رنگ به نام player1 با تگ Player ایجاد کنید.
      یه cube با متریال قرمز رنگ به نام enemy به عنوان دشمن ایجاد کنید که قراره هوش بدیم بهش و یه rigid body component بدید بهش.(چطوری؟ بپرسید تازه کاراbroken heart )
      -

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۰۹
      مدیرکل

       منبع :gameover.blog.ir

      http://s5.picofile.com/file/8153967184/way_ai.jpg

      ۱ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۰۷
      مدیرکل

      منبع :gameover.blog.ir
      اسکریپت خود را به زبان js ایجاد در بخش تعریف متغیرهای سراسری (قبل از تابع Start) این را بنویسید:

      کد:
      var اسم دلخواه مجاز: Transform[];
      مثال:
      کد PHP:
      var waypoints Transform[]; 

      اسکریپت رو بندازید روی یه گیم ابجکت دلخواه.

      گیم ابجکت رو انتخاب و به زیر شاخه ی اسکریپت در کادر خصوصیات(inspector) نگاه کنید و پارامتر size رو بیابید.

      تغییرش بدید تا طول آرایه تغییر کنه.(مثال: اگه size رو دید 3 ، سه تا پارامتر Element0 و Element1 و Element2 ایجاد میشه.)

      نوع رو چون Transform گذاشته بودیم می تونیم گیم ابجکت های دلخواه رو بکشیم بندازیم توی هریک از این سه سلول آرایه.

      یک کاربرد : ساخت نقاط روی یک مسیر و استفاده برای مسیر یابی در بازی های مختلف(ورزشی،مسابقه ای،استراتژی و الی آخر...)

      در بخش AI in Unity انجمن (زیر شاخه ی بخش مقالات اموزشی Unity) ساخت یک موجود هوشمند ساده رو با همین روش و یه دو تا کد کوچولو یادتون میدم. خودتون مراجعه کنید بعدا.
      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۰۶
      مدیرکل


      مباحث ساده هوش مصنوعی
      http://promakers.ir/showthread.php?tid=8810
      http://promakers.ir/showthread.php?tid=1...#pid109686

      تشکرها کم بود ولی عیبی نداره . در درس بعدی Lerp رو یاد می دم و بعدش احتمال داره روی Slerp بحث کنم. با توجه به اینکه به سایت های
      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۴:۰۶
      مدیرکل

      کپی شده از gameover.blog.ir

      آموزش image effect (افزودن افکت بلور یا image blur Effect در یونیتی):
      --
      دوربین اصلی را انتخاب کنید.

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۳:۴۸
      مدیرکل
      وبلاگ gameover.blog.ir

      //treble jump unity _ 2d
      //gameover.blog.ir
       if (jumpkeydown) { if (grounded) { rigidbody2D.velocity.y = 0; rigidbody2D.AddForce(new Vector2(0, jumpForce)); candobulejump = true; } else if (candoublejump) { candoublejump = false; cantreblejump=true; rigidbody2D.velocity.y = 0; rigidbody2D.AddForce(new Vector2(0, jumpForce)); } else if (candtreblejump) { candtreblejump= false; rigidbody2D.velocity.y = 0; rigidbody2D.AddForce(new Vector2(0, jumpForce)); } }

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ مرداد ۹۴ ، ۰۲:۰۶
      مدیرکل
      با دستور yield می گیم چند ثانیه صبر کن بعدش برو دستور بعدی. مثال :
      using UnityEngine;
      using System.Collections;
      
      public class ExampleClass : MonoBehaviour {
          IEnumerator Example() {
              print(Time.time);
              yield return new WaitForSeconds(5);
              print(Time.time);
          }
      };

      ۲ نظر موافقین ۰ مخالفین ۰ ۲۴ مرداد ۹۴ ، ۱۸:۰۸
      مدیرکل

      می دونیم که در حالت پیشفرض مسیر ذخیره سازی روی حافظه ی داخلی هست(Write Access =Internal Only)

      دستور Application.persistentDataPath در یونیتی مسیر  SD card یا حافظه ی بیرونی رو می ده(به شرطی که گزینه ی  External Write Access  در Player Settings رو فعال کنیم) این یعنی Write Access = External (SDCard)

      ----
       Application.dataPath
       Application.streamingAssetsPath
       Application.temporaryCachePath
      EditorApplication.applicationContentsPath
       EditorApplication.applicationPath
      Directory.GetCurrentDirectory()  مسیر روت یا ریشه رو می ده
      PlayerSettings.Android.forceSDCardPermission مقدار بولین برای دسترسی به کارت جافظه موبایل
      یه گزینه هم هست به اسم  WRITE_EXTERNAL_STORAGE اگه Enable باشه کل دادها به مسیر  /mnt/sdcard/Android/data/data/com..... ارجاع داده می شن و اجازه ذخیره روی SD card

      ۲ نظر موافقین ۰ مخالفین ۰ ۲۴ مرداد ۹۴ ، ۱۶:۴۱
      مدیرکل
      طبق تحقیقم شاید بتونید از این کدها الهام بگیرید :
      var myTexture: Texture2D;
        
        function Startup()
        {
            SaveTextureToFile( myTexture,"picture.png");
        }
      
      +
      
      System.IO.File.WriteAllBytes("picture.png", myTexture.EncodeToPNG()); 
      
      +
      
      System.IO.File.WriteAllBytes(Application.dataPath + "/"+"picture5886.png", texture2.EncodeToPNG());    //app path n1!

      ۱ نظر موافقین ۰ مخالفین ۰ ۲۴ مرداد ۹۴ ، ۰۵:۳۹
      مدیرکل

      تا آخرش بخونید لطفا

      http://gameover.blog.ir

      منبع :

      http://promakers.ir/showthread.php?tid=10091&pid=108607

      در کدهای ارائه قبلی توسط سایر دوستان،تولید اعداد تصادفی محدود بود اما اینجا من یاد میدیم تا تعداد تقریبا نامحدود عدد تصادفی تولید کنیم.
      اینم الگوریتم و کد کاملا تست شده ای که بعد از چند روز فکر کردن بالاخره نوشتمش.

      //game maker script
      //Generating random numbers without repeating
      //Author:sajjad3011....gameover.blog.ir....
      //
      n=8
      a[0]=irandom_range(0,n)
      for(i=1;i<=n;i++)
      {
      a[i]=irandom_range(0,n);
      for(j=0;j<=(i-1);j++)
       {
         if(a[i]==a[j])
         {
          a[i]=irandom_range(0,n);
          j=0;i--;
         }//if
        }//for j
      }//for i
      -----------
      حالا برای VB6 :

      یک listview و یک command button بذارید روی فرم حله

      http://s5.picofile.com/file/8153302468/random_bi_tekrar_vb6.jpg

      اینم کد دیگه چی میخوایدbig grin :

      کد:
      'Author:sajjad3011
      Private Sub Command1_Click()
      List1.Clear

      Const n = 9
      Dim a(0 To n) As Integer


      ' Generate random value between 1 and n
      a(1) = CInt(Int((n * Rnd()) + 1))

      For i = 2 To n
      a(i) = CInt(Int((n * Rnd()) + 1))
      For j = 1 To i - 1
         If (a(i) = a(j)) Then
        
         a(i) = CInt(Int((6 * Rnd()) + 1))

          j = 1
          i = i - 1
         End If 'if
        Next j 'or j
      Next i 'for i

      For i = 1 To UBound(a)
      List1.AddItem (a(i))
      Next i
      End Sub




      '----------------------------
      حالا بهترین الگوریتم برای تولید اعداد تصادفی :
      منبع :
      https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
      در روش های قبلی از همون اول عناصر رو به رندوم تولید می کردیم و بررسی می کردیم و به صورت غیر تکراری توی عناصر آرایه می ریختیم این کار بهینه نیست.
      در این روش  دو مرحله ی ساده رو انجام می دیم:

      1. ابتدا اعداد 0 تا n-1 رو می ریزیم توی خونه های آرایه.
      2. سپس می یایم محتوای خونه های آرایه رو به صورت رندوم جابجا می کنیم با هم.
      اینم الگوریتمش :
      for i from 0 to n − 2 do
             j ← random integer such that i ≤ j < n
             exchange a[j] and a[i]
      نکته:
      توی یونیتی تابع تولید عدد تصادفی اینه (خودتون می تونید ازش الگو بگیرید با الگوریتم بالا):

      Random.Range(min,max)




      مثال سیشارپ:

      for(k=0;k<myarr.length-2;k++)
      {
      a = random.range(0,n);
      b = random.range(0,n);
      
      temp=myarr[a];
      myarr[a]=myarr[b];
      myarr[a]=temp;
      
      }
      ۲ نظر موافقین ۰ مخالفین ۰ ۱۴ مرداد ۹۴ ، ۱۱:۱۱
      مدیرکل

      gameover.blog.ir

      این پکیج رو ایمپورت کنید فایل سین level1 رو اجرا کنید بعدش با لپ تاپ یا گوشی تست بگیرید فیلم روی پلن اجرا میشه.


      http://s8.picofile.com/file/8313169984/maxresdefault.jpg


      هر مشکلی بود ساپورت با ماست

      فقط 500 تومان

      ۱ نظر موافقین ۰ مخالفین ۰ ۰۷ مرداد ۹۴ ، ۱۴:۳۴
      مدیرکل


      نکته : با تابع Debug.ClearDeveloperConsole() در بعضی مواقع درست کار نمی کنه.پس یک تابع دیگه می نویسیم.(در این آموزش از کتابخونه ی Reflection کمک می گیریم)

      کد سیشارپ:

      static void ClearConsole () {
              // This simply does "LogEntries.Clear()" the long way:
      var logEntries = System.Type.GetType
      ("UnityEditorInternal.LogEntries,UnityEditor.dll");
      
      var clearMethod = logEntries.GetMethod("Clear", 
          System.Reflection.BindingFlags.Static | 
          System.Reflection.BindingFlags.Public);
      
      clearMethod.Invoke(null,null);
          }
      هرجایی نیاز داشتید Debug.Log رو اجرا کنید می تونید قبلش ClearConsole() رو فراخوانی کنید تا لاگ(ثبت)های قبلی پاک بشه.
      کد فوق به زبون سیشارپ هست.شما هم سعی کنید با سیشارپ بیشتر اوقات کدنویسی کنید چون ساختارش منظقی تر و استاندارد تر هست.
      ۱ نظر موافقین ۰ مخالفین ۰ ۰۴ مرداد ۹۴ ، ۱۶:۳۴
      مدیرکل
      	// Detects clicks from the mouse and prints a message
      	// depending on the click detected.	function Update() {
      		if(Input.GetMouseButton(0))
      			Debug.Log("Pressed left click.");
      		if(Input.GetMouseButton(1))
      			Debug.Log("Pressed right click.");
      		if(Input.GetMouseButton(2))
      			Debug.Log("Pressed middle click.");
      	}
      ۱ نظر موافقین ۰ مخالفین ۰ ۰۴ مرداد ۹۴ ، ۱۴:۱۸
      مدیرکل

      gameover.blog.ir

      این کد زیاد functional نیست و یکم ارتباط باهاش ضعیف هست ولی فعلا اینو برای شما می ذاریم :

      کد به زبان سیشارپ هست در یونیتی :

      خیلی ساده می شه کدها رو تحلیل کرد.تابع Invoke هم اگه متوجه نمیشید توی Help یونیتی هست.یه خورده تحلیتون رو ببرید بالا.اگه شما کد بهتری سراغ دارید لینک بدید بذاریم تو وبلاگ:

      using UnityEngine;
      using System.Collections;
      
      public class double_click : MonoBehaviour {
      	bool mouseClicksStarted = false; 
      	int mouseClicks = 0; 
      	float mouseTimerLimit = .25f;	// Use this for initialization
      	void Start () {
      		}
      	void Update() {
      	
      		   if(Input.GetMouseButtonDown(0)) OnClick ();	
      		
      	}
      	
      	public void OnClick(){
      		mouseClicks++;
      		if(mouseClicksStarted){
      			return;
      		}
      		mouseClicksStarted = true;
      		Invoke("checkMouseDoubleClick",mouseTimerLimit);
      	}
      	
      	
      	private void checkMouseDoubleClick()
      	{
      		if(mouseClicks > 1){
      			Debug.Log("Double Clickedd");
      			
      		}else{
      			Debug.Log("Single Clicked");
      			
      		}
      		mouseClicksStarted = false;
      		mouseClicks = 0;
      	}}
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۴ مرداد ۹۴ ، ۱۴:۱۳
      مدیرکل
      منبع:gameover.blog.ir
      نکته : برای حالت سه بعدی هست مطلب زیر:
      کد js(جاوااسکریپت)
      var Xrotatespeed:float=10;
      var Yrotatespeed:float=10;
      
      function Start () {
      
      }
      
      function Update () {
          transform.Rotate(new Vector3 (0,Input.GetAxis("Mouse X")*Xrotatespeed,0));     
          //transform.Rotate(new Vector3 (Input.GetAxis("Mouse Y")*Yrotatespeed*-1,0,0));
          print(transform.rotation.eulerAngles); 
      } 
      


      اینم کد cs(سیشارپ) اگه اشتباه نکرده باشم اینطوری میشه :

      float Xrotatespeed=10f;
      float Yrotatespeed=10f;
      
      void Start () {
      
      }
      
      void Update () {
          transform.Rotate(new Vector3 (0,Input.GetAxis("Mouse X")*Xrotatespeed,0));     
          //transform.Rotate(new Vector3 (Input.GetAxis("Mouse Y")*Yrotatespeed*-1,0,0));
          Debug.Log(transform.rotation.eulerAngles); 
      }
      

      توضیح:
      دلتا تایم رو حذف کردم تا سرعت دست خودم باشه و با x ماس انجام بشه.
      ضمنا چرخش بالا و پایین (حول محور X ) رو حذف کردم چون خیلی وقتا لازم نیست و بیشتر کاربر رو گیج می کنه.

      توضیحات اضافی برای یادگیری بیشتر و درک سیستم ماوس و مختصات:

      ماوس دو تا پارامتر داره x,y
      تابع Rotate سه تاپارامتر داره x,y,z که زاویه چرخش رو حول محور دلخواه میدیم به پارامترهاش.

      چرخش بالا و پایین (روی محور y ماوس):
      اگه بخوایم چرخش به بالا و پایین رو انجام بدیم باید حول محور x بچرخیم یعنی پارامتر اول رو مقدار میدیم و دومی و سومی رو صفر می کنیم. و ضمنا زاویه ی چرخش بالا و پایین رو با حرکت بالا و پایین ماوس انجام میدیم و چون ماوس وقتی بالا می ره y اش تغییر می کنه پس پارامتر اول که قرار بود حول محور x چرخش بشه رو در Mouse Y ضرب کردیم.

      چرخش به چپ و راست(روی محور x ماوس):
      اگه بخوایم چرخش به چپ و راست رو انجام بدیم باید حول محور y بچرخیم یعنی پارامتر دوم رو مقدار میدیم و اولی و آخری رو صفر می کنیم. و ضمنا زاویه ی چرخش چپ و راست رو با حرکت چپ و راست ماوس انجام میدیم و چون ماوس وقتی چپ وراست می ره x اش تغییر می کنه پس پارامتر دوم که قرار بود حول محور y چرخش بشه رو در Mouse X ضرب کردیم.

      راستی: rotation دوربین اصلی رو روی 0و0و0 بذار و اسکریپت رو هم بنداز روی دوربین اصلی


      راستی برای اینکه خود کاراکتر بچرخه و مثلا روو کنه به نقطه ی دلخواه باید از تابع lookat استفاده کنید.الگوی استفاده و نحوه ی استفاده رو خیلی ساده می تونید با بررسی نمونه اسکریپت ها یا یک جستجوی ساده در اینترنت پیدا کنید.اگه سایت اصلی هم بسته باشه با شیلتر یا ... بازش کنید یا بپرسید.



      روش دوم :

      استفاه از خصوصیت rotation هست که از نوع Quaternion هست و با استفاده از تابع اویلر باید مقدار بهش بدیم اینطوری:
      void Update () {
      transform.rotation =
      		Quaternion.Euler(new Vector3(0, Input.mousePosition.x, 0));
      	}

      به دقت کنید. پارامتر اول و آخر یعی x و z رو صفر گفتیم چون چرخشی حول محور x(میله ای از چپ به راست که چرخش حول آن یعنی چرخش از جلو و عقب)، و چرخشی حول محور Z (میله ای از عقب به جلو که چرخش حول آن یعنی چرخش از پهلو) نداریم.

      فقط پارامتر دوم یعنی چرخش حول محور Y(میله ای از پایین به بالا که چرخش حول آن یعنی چرخش به چپ و راست) را با مقدار حرکت ماوس به چپ و راست تنظیم کردیم تا اگر ماوس به چپ حرکت کند دوربین به چپ و اگر به راست حرکت داده شد دوربین به راست نگاه کند.
      ۱۰ نظر موافقین ۰ مخالفین ۰ ۰۴ مرداد ۹۴ ، ۱۳:۵۵
      مدیرکل
      می تونی hit بدی و تگ.اگه برخورد کرد یا در فاصله ی دلخواه بود parent اسلحه رو مساوی با player کن که هر جا player میره اسلحه هم باهاش بره و همچنین Rotation و Position اسلحه رو مساوی با چرخش و پوزیشن شی empty ای قرار بده که فرزند player هست و روی نوک دست player قرارش دادی.

      اینم دو تا مدل برای تعویض (switch) اسلحه و برداشتن(pickup)اسلحه.


      http://pastebin.com/7zmZS7ze
      http://pastebin.com/TwpnNjdk


      شما مشکلت اینه که فکر نمی کنی. باید کدها رو حفظ نکنی بلکه باید نمونه کد پیدا کنی و تحلیل کنی.

      اگه بتونی مسئله رو با ذهنت حل کنی خیلی راحت می تونی کدها رو دستکاری کنی طبق چیزی که نیازت هست.

      تا جایی که می تونی سعی کنید مسئله رو با فکر کردن حل کنید نه صرفا کپی پست کردن کدها.

      کپی پیست هم عالیه ولی به شرطی که کدتون رو تمیز بنویسید با توضیحات و اسم متغیرهای مناسب.

      -

      اگه مبحث انیمیت کردن تفنگ رو میخواید بدونید اینو بخونید:

      http://forum.unity3d.ir/%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE/5048-%D8%A8%D8%B1%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-%D8%AA%D9%81%D9%86%DA%AF-%D8%A7%D8%B2-%D8%B1%D9%88%DB%8C-%D8%B2%D9%85%DB%8C%D9%86.html

      بازم توی تحلیل کد مشکل بود بپرسید.

      البته نیازی نیست گرافیک یا انیمیشن بدید تا پیچیده بشه.

      می تونی خیلی ساده کد سوئیچ اسلحه رو بنویسید که وقتی به محدوده رسید(محدوده رو با مکعب collider با حجم دلخواه اطراف بازیکن تنظیم می کنید.البته من توصیه می کنم Trigger یا Ray و hit بدید(hit به معنی برخورد بازیکن با شی اسلحه یا ... هست و Ray به معنی اشعه است.در اصطلاح تابعی برای اینکار در یونیتی هست که توی خود help یونیتی از منوی help می تونید برید بخش Scripting reference و سرچ کنید مثلا hit رو بزنید)

      ۱ نظر موافقین ۰ مخالفین ۰ ۰۲ مرداد ۹۴ ، ۱۷:۳۱
      مدیرکل
      gameover.blog.ir


      یک اسکریپت سیشارپ به نام fasele (همنام با کلاسی که توی کد زیر نوشتم) بسازید.

      دو متغیر go1 و go2 برای دریافات دو گیم ابجکت از inspector تعریف کنید که public باشه.((اگه private باشه خصوصی هست و تو inspector دیده نمیشه))

      سپس توسط تابع محاسبه ی فاصله ی بین دو بردار سه بعدی (Vector3.Distance) فاصله رو حساب می کنیم و نمایش می دیم.


      مثال csharp:
      using UnityEngine;
      using System.Collections;
      
      public class fasele : MonoBehaviour {
          public GameObject go1;
          public GameObject go2;
          private float dist;
      
          void Update () {
              dist = Vector3.Distance (go1.transform.position, go2.transform.position);
              Debug.Log (dist);
          }
      }


      یادتون نره به دو گیم ابجکت رو که می خواید فاصله ی بینشون رو به طور داینامیک محاسبه کنید با ماوس توی inspector بندازید روی متغیرهای go1 و go2.

      نکته : Vector3.Distance(a,b) معادل (a-b).magnitude هست. همینور معادل:

      float distance = (g.transform.position - this. transform. position).sqrMagnitude;



      فرق Vector3.Distance و Vector3.magnitude و Vector3.sqrMagnitude :



      Vector3.Distance:
      // C#
           public static float Distance(Vector3 a, Vector3 b)
           {
               Vector3 vector = new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
               return Mathf.Sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
           }
      Vector3.magnitude:
      // C#
           public static float Magnitude(Vector3 a)
           {
               return Mathf.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
           }


      Vector3.sqrMagnitude:
      // C#
           public static float SqrMagnitude(Vector3 a)
           {
               return a.x * a.x + a.y * a.y + a.z * a.z;
           }

      sqrMagnitude سریع از Magnitude هست.

      Vector3.Distance هم می یاد بر حسب تفریق برداری و سپس مجموع مربع هر یک از پارامترهای xو y و z فاصله رو محاسبه می کنه.(در کتب ریاضی می تونید اثبات این فرمول ها رو پیدا کنید)
      ۵ نظر موافقین ۰ مخالفین ۰ ۰۲ مرداد ۹۴ ، ۱۴:۱۰
      مدیرکل

      نکاتی از یونیتی :


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

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

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


      کد :
          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 در بالای برنامتون تعریف کنید. اینطوری:
      کد :
      private Vector3 pos
      البته اگه public رو به جای private بذارید عمومی میشه و وقتی اسکریپت رو به گیم ابجکت دلخواه ربط می تونید توی پنجره ی inspector خصوصیت pos به گیم ابجکت اضافه می شه و می تونید از ورودی مقدارشو بخونید.ولی من خصوصی(private) تعریف کردم چون نیاز نداشتم ولی بهتره شما public تعریف کنید.

      یه نکته ی دیگه در مورد اسم کلاس های سیشارپ اینه که بعد از public class (معمولا حط اول اسکریپت های سیشارپی) حتما اسم کلاس باید همنام اسم اسکریپت باشه.مثلا اگه اسکریت شما اسمش هست ali سپس اینطوری میشه :
      کد :

      public class ali:MonoBehaviour
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۲ مرداد ۹۴ ، ۱۰:۱۰
      مدیرکل

      یک فایل صوتی مثل mp3 رو بکشید توی پروژه تا اضافه بشه به پروژه.

      یک اسکریپت js با کد زیر ساخته و بندازید روی دوربین اصلی :

      کد PHP:
      var myClip AudioClip;
           
          function 
      Start () {
           
      AudioSource.PlayClipAtPoint(myCliptransform.position);
          } 
      سپس در hierarchy(لیست اجزای پروژه) دوربین اصلی رو انتخاب کنید تا توی inspector بتونیم متغیر My Clip رو در زیر شاخه ی اسکریپت اضافه شده ببینیم.

      حالا فایل صوتی mp3 رو با ماوس بگیرید بندازید روی متغیر My Clip.

      بازی رو اجرا کنید تا موزیک پخش بشه.
      http://s5.picofile.com/file/8136414518/play_sound.jpg
      --
      این روش تنظیمات نداره و من اینو توصیه نمی کنم.

      روش دیگه روش object oriented و شی گرا هست که به صورت ویژوال توی محیط از طریق کامپوننت ها صدا رو اضافه می کنیم و پارامترهای مختلف مثل فرکانس و ... رو توی کادر خصوصیاتدر inspector برای اون کامپوننت تنظیم می کنیم و بعد از طریق کد سعی می کنیم اون کامپوننت رو کنترل کنیم و الی آخر.
      اینکار توسط افزودن کامپوننت Component->Audio->Audio Source انجام میشه.
      اگه شما یونیتی 4 دارید و help به درستی نصب باشه،کافیه این لینک رو توی فایرفاکس اجرا کنید. معمولا help توضیحات لازم رو برای کسی که یونیتی رو نصب داره میاره و آدرسش واسه اونایی که windows 7 دارن اینه :
      file:///C:/Program%20Files%20%28x86%29/Unity/Editor/Data/Documentation/Documentation/Manual/Sound.html
      حالا بازم اگه این لینک کار نکرد بگید من خود help رو save و zip و upload کنم روی picofile یا جاهای دیگه بذارم واسه دانلود شما سروران گرامی.

      روش دم رو به فارسی توضیح میدم تا دیگه عذاب نکشن بعضیا:
      یک گیم ابجکت empty ایجاد کنید.(بلد نیستید سوال کنید آی مبتدی ها)

      از مسیر Component->Audio->Audio Source ، کامپوننت audio source رو به ابجکت empty یا هر ابجکتی که دوست دارید اضافه کنید (فقط دقت کنید بهتره که دوربین باشه و دوربین اصلی باشه که player رو دنبال می کنه تا صدا هم همراش بیاد وگرنه وقتی از صدا دور میشیم ممکنه صدا کم بشه و نشنویم)

      http://s5.picofile.com/file/8136417592/audioSource_component.jpg
      تنظیمات مثل loop تکرار ، قطع شدن صدا / mute و اولویت (priority) و غیره رو هم توی inspector انجام بدید.

      اگه واسه این کامپوننت می خواید کد بنویسید و کنترلش رو در دست بگیرید می تونید از توابع Play + Stop + Pause + PlayOneShot و خصوصیات Enabled و .... واسه اجرا و توقف و استاپ و از کار انداختن صدا و ... استفاده کنید.

      مثلا توی inspector می تونید مستقیم متغیر Pitch(دانگ صدا) رو با نوار لغزان زیاد و کم کنید و موقع اجرا نتیجه رو ببینید که صدا رو تند و کند می کنه و خیلی خنده داره میشه.

      کد مربوط هم برای AudioSource.pitch اینه :
      کد:
      //js
      var pitch : float
      //Description

      //The pitch of the audio source

      audio.pitch = 1.0;

      اگه به جای 1 مثلا 1.94 بدید صدا خیلی خنده دار میشه و عین بچه ها می خونه.

      بقیه ی کدها رو هم اگه خواستید درو کنید این سایت روسی رو ببینید. البته تو بخش رفرنس ها مطالب انگلیسی هست چون مجبور بودن استاندارد رو رعایت کنن و خوب این به نفع ماست که روسی بلد نیستیم و انگلیسی کمی بلدیم.
      http://docs.unity3d.ru/ScriptReference/AudioSource.html
      --
      بازم مشکل ترجمه داشتید می تونید مستقیم یک سایت روسی یا ... رو بدید به مترجم های google مثل site translator یا ... که براتون به فارسی ای انگلیسی یا غیره ترجمه کنن.
      منبع :
      http://promakers.ir/showthread.php?tid=9544&pid=122371#pid122371
      ۱ نظر موافقین ۰ مخالفین ۰ ۰۲ مرداد ۹۴ ، ۰۸:۵۵
      مدیرکل

      asset یعنی عکس ها ، اسکریپت ها،پریفب ها(کپی یا نمونه ای مدل های بازی که به صورت موقت از پنجرهی اجزای محیط بازی به  پنجره ی اجزای پروژه ی بازی انتقال یافته است و می توانیم در لحظه ی اجرای بازی با استفاده از کدنویسی و نام پریفب آن را تکثیر کنیم)،فایل های متنی،صوتی،ویدئو ،مدل ها و کلیه فایل هایی که به بازی اضافه می کنیم.

      ۰ نظر موافقین ۰ مخالفین ۰ ۳۱ تیر ۹۴ ، ۲۳:۵۱
      مدیرکل
      ۰ نظر موافقین ۰ مخالفین ۰ ۳۱ تیر ۹۴ ، ۱۷:۴۸
      مدیرکل

      آموزش خوب متنی رو از دست ندید. حفظ نکنید بلکه فهم کنید کدها رو ... تحلیل کنید یاد می گیرید...

      کاربرد این آموزش: خیلی کاربرد داره به ویژه بازی های اندرویدی. مثال : حرکت player به جایی که کلیک کردیم مثلا رفتن به سمت درب اگر روی درب کلیک کردیم.(البته تابع Slerp هم هست توی همون لینک آموزش توی پرومیکرز می تونید Slerp و transform رو بیاموزید)

      -

      http://cdn2.raywenderlich.com/wp-content/uploads/2014/01/zombie_circles.gif


      آموزش فارسی:

      http://promakers.ir/showthread.php?tid=10144&pid=109531#pid109531




      منبع :
      www.raywenderlich.com/61532/



      ۴ نظر موافقین ۰ مخالفین ۰ ۳۱ تیر ۹۴ ، ۱۷:۳۵
      مدیرکل

      http://s5.picofile.com/file/8149102168/book.jpg

      در سایت زیر بیشتر کتب برنامه نویسی مربوط به بازی سازی از جی مانکی گرفته تا استنسیل و گیم میکر و تورک 3Dو فلش و ایکس ان ای و کرای انجین و یو دی کی و یونیتی و خلاصه هرچی که فکرشو می کنید توی این سایت کتابش رایگان هست.
      برید حالشو ببرید.

      http://it-ebooks.info

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۸ تیر ۹۴ ، ۰۰:۴۴
      مدیرکل

      gameover.blog.ir

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۷ تیر ۹۴ ، ۲۳:۵۵
      مدیرکل

      چطوری یه گیم ابجکت رو جوری تو کد بسازمش که زیر مجموعه ی یک شی بشه
      مثلا این ابجکت f نقش افکت اتیش اسلحه رو داره


      Var pref_fire:GameObject;//------------pref_fire moteghayyeri hast ke az voroodi atish ro midim behesh
      f = Instantiate(pref_fire,transform.position,Quaternion.identity);
      ولی وقتی که به وجود میاد ترنسفرمش زیر مجموعه ی اسلحه نیست.
      اول یک گیم ابجکت تهی یا empty بساز سپس بکش بنداز روی اسلحه بعدش روی هر موقعیتی که می خوای بذار . این شد از لحاظ ویژوال.
      حالا برای اینکه همینو از لحاظ کد بهش نیگا کنی دیدت باز میشه. در position این شی empty پریفب آتش یا پاتیکل یا هرچیزی دوست داری رو Instantiate کن. ضمنا یک زمان هم در نظر بگیر که پس از این دوره ی زمانی خون نابود بشه . برای این کار یک اسکریپت به خون بده و توی Start اینو بذار مثلا بعد از 5 واحد زمانی از بین بره :
      کد سیشارپ:

      void Start(){
      Destroy (this, 5.0f);
      }


      سوال :

      من میخوام fire وقتی اینستنتیت میشه زیر مجموعه ی گان باشه پاکم نشه ازش روش بمونه. چطوری یه شی و جوری تو کد بسازمش که زیر مجموعه ی یک شی بشه.مشکل من اینه که وقتی که آتیش به وجود میاد ترنسفرمش زیر مجموعه ی اسلحه نیست.

      پاسخ:

      ابتدا یک متغیر از نوع GameObject به صورت public تعریف کنید که بشه از ورودی ، پریفب آتش رو در کادر hierarchy بهش نسبت داد یا مثل مازل فلش یا پریفب تیر یا هرچیز دیگه ای.

      سپس کد Istantiate رو در رویداد کلیک ماوس بنویسید.کد رو به یک گیم ابجکت empty میشه داد که موقعیت و جهت حرکت تیر رو تعیین کنه و خودمون باید Rotation و Position رو تنظیم کنیم.البته به جای S.Transform و S.Rotation بهتره this بدیم. چون this به شی جاری اشاره می کنه یعنی گیم ابجکت empty .(اما S به خود گیم ابجکتی که از ورودی وارد کردیم.ما به جهت و موقعیت اون کاری نداریم و باید ورودی رو روی نقطه ی دلخواه تنظیم کنیم)



      public input_GameObject_NokAslahe_Spawn:GameObject;
      
      void Update(){
      
      this.Position= input_GameObject_NokAslahe_Spawn.Position;
      
      }


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

      ساخت پریفب رو که بلدید؟ بلد نیستید؟ پریفب یعنی یه ابجکت بساز و رنگش کن و تکستچر بده و هر بلایی دوست داری سرش بیار و هر ابجکتی دوست داشتی بکش روش رها کن مثلا یه لوستر بساز با چند تا لامپ و هر لامپش متریال خودشو داره یکی سبز و الی آخر.... یا یه ماشین با چهار چرخ و درب و شیشه و غیره بسازید و اسکریپت های لازم رو بهش ربط بدید . بعدش توی کادر پروژه راست کلیک و new prefab و سپس اون ماشین یا لوستر رو از توی کارد اجزای صحنه(hierarchy) بکشید روی این پریفب توی کار پروژه رها کنید تا یک پریفب ازش ساخته بشه.بعدش اون ماشین رو از  تو صحنه حذف کنید و سپس هر جا توی بازی نیاز بود می تونید چند نمونه از این پیفب تیر یا لوستر یا خون یا ماشین یا هرچیز دیگه ای هست رو ازش نمونه سازی یا کپی یا Instantiate کنید.

      دوستان هر سوالی از یونیتی دارید بپرسید بلد بودم پاسخ می دم انشاءا... .


      ۰ نظر موافقین ۰ مخالفین ۰ ۲۷ تیر ۹۴ ، ۱۴:۱۱
      مدیرکل

      گاهی اوقات مثلا وقتی که با جاوااسکریپت توی یونیتی داریم کدنویسی می کنیم Mono.Data رو خطا می گیر.

      مثلا کد :

        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 انتخاب کنید:


      http://s6.picofile.com/file/8199014742/monoData_nameSpace.gif


      ۰ نظر موافقین ۰ مخالفین ۰ ۱۹ تیر ۹۴ ، ۱۳:۱۴
      مدیرکل

      یک اسکریپت JS با این کد ایجاد کنید :

      //button gui
      // JavaScript
      function OnGUI () {
          if (
      GUI.Button (Rect (10,10,150,100), "sajjad3011")) {
              print (
      "You clicked the button!");
          }
      }

      این اسکریپت رو بکشید روی یکی از gameObject های موجود در صحنه. مثلا من انداختم روی car (ماشین).
      دکمه ای مستطیلی با مختصات 10,10,150,100 ایجاد خواهد شد.


      اینم واسه دکمه ی Toggle(مثل همون Option box های VB ) :

      //js
      var toggleBool true;

      function 
      OnGUI () {
          var 
      toggleBoolNew GUI.Toggle (Rect (252510030), toggleBool"Toggle");

          
      // Check if the toggle was toggled
          
      if (toggleBoolNew != toggleBool) {
              if (
      toggleBoolNew == true)
                  
      Debug.Log("Toggle was enabled");
              else
                  
      Debug.Log("Toggle was disabled");

              
      toggleBool toggleBoolNew;
          }
      }

      ۰ نظر موافقین ۰ مخالفین ۰ ۱۱ تیر ۹۴ ، ۲۲:۴۸
      مدیرکل


      [تصویر: randomActive.jpg]
      ابتدا یک اسکریپت می سازیم (به زبان javascript) و می دیم به دوربین.
      و سه ابجکت رو می دیم به متغیرهای c1و c2 و c3.
      همچنین یک متغیر به اسم n تعریف می کنیم که مقدارش هی زیاد میشه و بین 1 تا 1000 می چرخه و اگه به هزار رسید دوباره از 0 شروع می شه. این n رو به مقدار دلخواه مثلا ضریب(مقسوم علیه) پیشفرض 30 (که قابل تغییر هست) تقسیم می کنیم و به قول خودم طی دوره های زمانی مختلف (هر 30 واحد زمانی که خودمون فرض کردیم) همه ی ابجکت ها رو غیر فعال می کنیم و سپس یکی از اونا رو به صورت تصادفی فعال می کنیم.
      اینم اسکریپت:

      کد js:

      //randomActive.js
      //author:sajjad3011
       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>1000) n=0; Debug.Log(n); //--------------------- setActiveRandObj(); } function setActiveRandObj(){ random = Random.Range(1, 4); 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); } } }
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۹ تیر ۹۴ ، ۲۳:۰۴
      مدیرکل

      شما ابتدا یک انیماتور ایجاد کن که حاوی مثلا دو انیمیشن باشه.
      مثلا
      anim_tank_loleBala شامل انیمیشن از قبل ساحته شده ی بالا رفتن لوله ی تانک
      anim_tank_loleRast شامل انیمیشن از قبل ساخته شده راست رفتن لوله ی تانک
      این دو تا رو بکش روی پنجره ی انیماتور (بعد از اانتخاب تانکی که قبلا کامپوننت Animator رو بهش add کردی)

      http://s5.picofile.com/file/8131743118/ANIMATOR.jpg

      --
      این دو انیمیشن رو بکش توی پنجره ی Animator1 که قبلا کامپوننت انیماتور(دقت کن انیمار نه انیمیشن) رو به تانک اضافه کردی.
      --
      حالا می خوایم وقتی فلش بالا میزنیم لوله تانک بره بالا و وقتی فلش راست می زنیم لوله تانک بره راست.
      --
      توی پنجره ی انیمیاتور Animator1 که به تانک اضافه کردیم، یک پارامتر به اسم state از نوع integer ایجاد کن.
      --
      بین انیمیشن ها اتصال بده(راست کلیک می کنی و make Transition و سپس کلیک روی اون یکی و بلعکس) (مثل شکل قبلی که به هم وصل کردیم و بینشون فلش هست)
      --
      طبق شکل ، روی فلشی که جهتش از بالا به پایین هست کلیک کن و شرط if state=2 رو set کن :

      http://s5.picofile.com/file/8131743884/state_equal_2.jpg

      --
      دستورات بالا می گن اگه state=2 انتقال انیمیشن طبق شکل از اون بالایی به پایینی set بشه یا state=1 شد طبق شکل انتقال انیمیشن طبق شکل از پایینی به بالایی set بشه .
      ---
      حالا ما باید یک اسکریپت جاوا بنویسیم و بندازیم روی تانک(تانکی که توی صحنه هست و از قبل ریگ شده و شامل انیمیشن های لوله بالا و لوله راست هست و set کردن اوتا رو هم اگه بلد نیستید توی بخش انیمیاتور آموز های من بخونید توی promakers.ir)
      ---
      اینم از کد js که اگه فلش راست زدیم مقدار متغیر state رو 2 می کنه و اگه فلش بالا زدیم state=1 می شه و بقیش دیگه مربوط به انیمیاتور هست که همه چیزو انجام میده

      کد PHP:
      public Animator animator;
       
      void Update () {
       
      if(Input.GetKey(KeyCode.UpArrow)) animator.SetInteger( "state", 1);
      if(Input.GetKey(KeyCode.RightArrow)) animator.SetInteger( "state", 2);
      
      }
      --
      نکته ی مهم: تیک گزینه ی اوتوماتیک Automatic رو توی انیماتور بردارید تا خودش انیمیشن ها رو خودکار اجرا نکنه .
      سوالی بود و هر چی رو بلد نبودی بپرس دوست من big grin
      اگه انیمیشن هم نداری و خواستی بسازی بگو یه sample بدم از روی اون کار کنی.
      و باید فریم های مثلا 1 تا 10 رو واسه بالا رفتن لوله توی blender یا 3dmax بسازی اول.
      بعدش فریم های 11 تا 20 رو واسه راست رفتن لوله ی تانک.
      بعدش باید روی مدل ریگ شده در پنجره ی assets کلیک کنی و در پنجره inspector سه تا سربرگ Model و Rig و Animation میده که ما باید بریم روی Animation و توی اون گزینه ها یه قسمتی به اسم Clips داره که کلیپ ها یا برش های انیمیشن رو باید براش تعریف کنیم و روی فریم های 1 تا 10 و 11 تا 20 اسم بذاریم. اینم سادست روی + یا بعلاوه کلیک می کنیم و
      اگه انیمیشن هم نداری و خواستی بسازی بگو یه sample بدم از روی اون کار کنی.
      و باید فریم های مثلا 1 تا 10 رو واسه بالا رفتن لوله توی blender یا 3dmax بسازی اول.
      بعدش فریم های 11 تا 20 رو واسه راست رفتن لوله ی تانک.
      بعدش باید روی مدل ریگ شده در پنجره ی assets کلیک کنی و در پنجره inspector سه تا سربرگ Model و Rig و Animation میده که ما باید بریم روی Animation و توی اون گزینه ها یه قسمتی به اسم Clips داره که کلیپ ها یا برش های انیمیشن رو باید براش تعریف کنیم و روی فریم های 1 تا 10 و 11 تا 20 اسم بذاریم. اینم سادست روی + یا بعلاوه کلیک می کنیم و Start و End رو روی فریم های مربوط میذاریم مثلا 1 تا 10 رو اسمشو من گذاشته بودم anim_tank_loleBala و 11 تا 20 رو anim_tank_loleRast
      اون انیمیشن Default رو هم می تونیم با کلیک روی منها حذف کنیم تا پیشفرضی در کار نباشه واسه اجرا
      --
      نکته:
      گزینه has exit time رو هم تیکشو بردارید تا سوئیچ بی انیمیشن ها طول نکشه سریع باشه.
      همچنین دو تا انیمیشن که روی هم هست پایان انیمیشن قبل و شروع انیمیشن بعد رو با ماوس تنظیم کنید روی یک خط باشه و زمان بینشون نباشه.

      اینم حرکت دو بعدی پلیر به جایی که کلیک کردیم در حالت پلتفرم:
      http://gameover.blog.ir/1394/08/23/%D8%AD%D8%B1%DA%A9%D8%AA-%D8%AF%D9%88-%D8%A8%D8%B9%D8%AF%DB%8C-%D9%BE%D9%84%D8%AA%D9%81%D8%B1%D9%85-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%D8%AC%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%DA%A9%D9%84%DB%8C%DA%A9-%DB%8C%D8%A7-%D8%AA%D8%A7%DA%86-%DA%A9%D8%B1%D8%AF%DB%8C%D9%85-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%DA%A9%D8%AF-%D8%B3%DB%8C%D8%B4%D8%A7%D8%B1%D9%BE
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۵ تیر ۹۴ ، ۰۴:۱۱
      مدیرکل
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۴ تیر ۹۴ ، ۲۱:۱۱
      مدیرکل

      ابتدا یک کپسول بسازید و توی صحنه بذارید.
      یک متریال(new material) با رنگ قرمز رو ایجاد کرده و بندازید روی کپسول.
      سپس یک اسکریپت سیشارپ با نام transparent.Cs با ایجاد کرده و کد زیر رو بریزید توش:

      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.a = Mathf.PingPong(Time.time, duration) / duration;
              renderer.material.color = textureColor;
          }
          }

      اجرا کنید.
      می بینید که گیم ابجکت شما شفاف(محو) و کدر می شه به حالت چشمک زن.
      http://s3.picofile.com/file/8194820926/transparent.jpg

      منبع :

      http://forum.unity3d.com/threads/changing-an-objects-transparency-during-runtime.46134/


      ۰ نظر موافقین ۰ مخالفین ۰ ۳۱ خرداد ۹۴ ، ۰۶:۵۱
      مدیرکل

      برای اینکار از کلاس Input استفاده میشه و تعداد(count) انگشت ها رو هم میشه شمرد.

      قبل از هرچیزی باید بررسی کنیم که دستگاه ما آیا از multi touch ساپورت می کنه یا نه :D :


      bool supportsMultiTouch = Input.multiTouchEnabled;
      print("MultiTouchSupport : " + supportsMultiTouch);
      این آموزش فرضش اینه که موبایل لمسی شما از مالتی تاچ حمایت می کنه.
      ۱۶ نظر موافقین ۰ مخالفین ۰ ۳۰ خرداد ۹۴ ، ۱۸:۵۲
      مدیرکل
      ۰ نظر موافقین ۰ مخالفین ۰ ۳۰ خرداد ۹۴ ، ۱۶:۵۸
      مدیرکل

      Access javascript variables using csharp script in unity

      ---

      یک پروژه جدید ایجاد کنید.

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

      پوشه ای به نام 'Standard Assets' (حتما دقیقا همین باشه ویلا جواب نمی ده)  و داخلش یک اسکریپت js به نام JS1.js ایجاد کنید.

      --
      کد اسکریپت JS1.js :
      //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:

      // 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.js' 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' بذارید.
      http://s3.picofile.com/file/8194713900/cs_js_access.jpg
      منبع :
      http://www.41post.com/1935/programming/unity3d-js-cs-or-cs-js-access

      اینم واسه سیشارپ:
      http://stackoverflow.com/questions/25930919/accessing-a-variable-from-another-script-c-sharp
      ۱ نظر موافقین ۰ مخالفین ۰ ۳۰ خرداد ۹۴ ، ۱۶:۲۸
      مدیرکل
      ۵ نظر موافقین ۰ مخالفین ۰ ۲۶ خرداد ۹۴ ، ۲۲:۳۹
      مدیرکل

      کلاس Random در یونیتی :
      این کلاس برای تولید اعداد تصادفی به کار می رود.
      متغیرهای static از کلاس Random عبارتند از :

      متغیر insideUnitCircle:
      یک نقطه تصادفی از بردار دو بعدی داخل دایره ای به شعاع 1 تولید می کند.
      با کمی تغییر می تونیم کارهای دیگه ای هم انجام بدیم.
      شکل کلی :

      کد:
      static var insideUnitCircle: Vector2;

      متغیر insideUnitCircle : برای ایجاد نقطه ی تصادفی دو بعدی داخل یک دایره :
      مثال : اسکریپ زیر موقعیت ابجکت جاری را داخل دایره ای به شعاع 5 و موقعیت مرکزی صفر(x=0,y=0,z=0) تنظیم می کند.
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          public 
      Vector2 newPosition Random.insideUnitCircle 5;
          
      void Example() {
              
      transform.position.newPosition.x;
              
      transform.position.newPosition.y;
          }

      متغیر insideUnitSphere : ایجاد نقطه ی تصادفی داخل کره
      کد:
      static Vector3 insideUnitSphere;
      مثال :
      اسکریپت زیر مثل اسکریپت فوق است فقط برای یک کره(sphere):
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      void Example() {
              
      transform.position Random.insideUnitSphere 5;
          }


      متغیر onUnitSphere: برای ایجاد نقطه ی تصادفی روی کره به شعاع 1
      مثال :
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      void Example() {
              
      rigidbody.velocity Random.onUnitSphere 10;
          }


      متغیر rotation: برای ایجاد یک چرخش تصادفی
      مثال :
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      void Example() {
              
      transform.rotation Random.rotation;
          }


      متغیر rotationUniform:برای ایجا یک چرخش تصادفی با توزیع یکنواخت
      مثال:
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      void Example() {
              
      transform.rotation Random.rotationUniform;
          }



      متغیر Random.seed :مجموعه دانه(seed) برای مولد عدد تصادفی.
      مولد عدد تصادفی است واقعا تصادفی نیست، بلکه تولید اعداد در دنباله از پیش تعیین شده (ارزش در دنباله "jump" در اطراف محدوده در چنین راهی که آنها ظاهر می شود تصادفی برای اغلب اهداف).
      با استفاده از مقدار ineger تصادفی که تولید میشه می تونیم game play های غیر قابل پیش بینی رو برای دشمن ایجاد کنیم و کاربر نتونه اونا رو حدس بزنه.به طور معمول از برخی از مقادیر دلخواه مانند ساعت سیستم قبل از توابع عدد تصادفی استفاده می شود.
      مثال:
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          private 
      float[] noiseValues;
          
      void Start() {
              
      Random.seed 42;
              
      noiseValues = new float[10];
              
      int i 0;
              while (
      noiseValues.Length) {
                  
      noiseValues[i] = Random.value;
                  print(
      noiseValues[i]);
                  
      i++;
              }
          }


      متغیر Random.value : عددی بین 0.0 و 1.0 را بر می گرداند.
      هر دو مقدار باید به طور مناسب تولید شوند. این تابع با توابع تولید عدد تصادفی دیگر کمی فرق دارد که عددی کچکتر تر از اما دقیقا مساوی با 1.0 تولید می کند.
      مثال :
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      Color RandomColor() {
              return new 
      Color(Random.valueRandom.valueRandom.value);
          }


      توابع کلاس Random :

      Random.Range : عدد تصادفی بین دو عدد رو بر می گردونه که حداقل min و حداکثر max باشه:
      شکل اول:
      کد:
      static float Range(float min, float max);
      مثال:
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          public 
      GameObject prefab;
          
      void Start() {
              
      Vector3 position = new Vector3(Random.Range(-10.0F10.0F), 0Random.Range(-10.0F10.0F));
              
      Instantiate(prefabpositionQuaternion.identity) as GameObject;
          }


      شکل دیگر:
      کد:
      static int Range(int min, int max);
      مثال:
      کد PHP:
      using UnityEngine;
      using System.Collections;

      public class 
      Example MonoBehaviour {
          
      void Example() {
              
      Application.LoadLevel(Random.Range(0Application.levelCount));
          }

      مقدار برگشتی هرگز max نیست مگر اینکه min و max برابر باشند.
      مترجم:sajjad3011
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۴ خرداد ۹۴ ، ۰۵:۴۵
      مدیرکل
      بردار همون نقطه تو فضای سه بعدی هست یا چهار بعدی یا n بعدی.
      در این ضرب هر آیتم در آیتم متناظر ضرب میشه و حاصل جمع میشه.
      توی ویکی پدیا گفته:

      http://fa.wikipedia.org/wiki/%D8%B6%D8%B1%D8%A8_%D8%AF%D8%A7%D8%AE%D9%84%DB%8C


      حاصل ضرب داخلی دو بردار یک عدد هست. حالا این عدد به چه دردی می خوره؟

      در ریاضیات فضای ضرب داخلی یک فضای برداری است.

       ضرب داخلی یا ضرب اسکالر به ما این امکان را میدهد که مفاهیم هندسی از قبیل زاویه و طول یک بردار را تعریف نماییم.

      با وجود آنکه در این نوع ضرب دو بردار در هم ضرب میشوند ولی حاصلضرب این دو بردار یک عدد اسکالر است.

      ضرب داخلی در ریاضیات،مهندسی،وفیزیک کاربردمای فراوانی دارد.

      ---

      مثال :

      اگر ضرب داخلی دو بردار غیر صفر، برابر 0(صفر) شود آن دو بردار بر هم عمودند.

      ----------
      تابع Quaternion.Dot ضرب نقطه ای(داخلی/اسکالر) بین دو  چرخش (rotation) است.اما توضیح چندانی در help یونیتی در مورد آن ندیدیم.

      اما در باره ی تابع  Vector3.Dot  شاید بد نباشد توضیح دهیم.
      این تابع ضرب نقطه ای(داخلی/اسکالر) بین دو بردار است.
      شکل کلی و توضیحات :

      Vector3.Dot 

      static function Dot (lhs : Vector3, rhs : Vector3) : float

      Description

      Dot Product of two vectors.

      Returns lhs . rhs.

      For normalized vectors Dot returns 1 if they point in exactly the same direction; -1 if they point in completely opposite directions; and a number in between for other cases (e.g. Dot returns zero if vectors are perpendicular).

      For vectors of arbitrary length the Dot return values are similar: they get larger when the angle between vectors decreases.

      // detects if other transform is behind this object
      var other : Transform;
      function Update()
      {
      if (other) {
      var forward = transform.TransformDirection(Vector3.forward);
      var toOther = other.position - transform.position;
      if (Vector3.Dot(forward,toOther) < 0)
      print ("The other transform is behind me!");//ابجکت دیگر پشت سر من است
      }
      }
      ترجمه فارسی:
      تابع Dot ، برای بردارهای نرمال،
      مقدار 1 را برمی گرداند اگر آن نقطه دقیقا در همان جهت باشد.
      اگر در جهت معکوس باشد مقدار منفی یک(-1) را بر می گرداند.
      مقدار صفر برگشت داده می شود اگر دو بردار عمود باشند.

      تابع Dot  برای بردارها با طول دلخواه،مقادیر یکسان را برمی گرداند: اگر زاویه ی بین بردارها کوچکتر شود،آنها بزرگتر می شوند.

      using UnityEngine;
      using System.Collections;
      
      public class test : MonoBehaviour {
      	void Start() {
      		transform.rotation = Quaternion.AngleAxis(90, Vector3.up); 
      		print( Quaternion.Dot(transform.rotation, Quaternion.identity));
      	}
      }
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۳ خرداد ۹۴ ، ۰۴:۴۲
      مدیرکل

      gameover.blog.ir


      AI = Artificial Intelligence به معنی هوش مصنوعی هست.

      هوش رو با منطق(logic) (دستورات شرطی مثل and و not و or و if و ... ) میسازن.

      بعضی جاهاشو هم با دستورات محاسبات یا ریاضیات (Mathematics) میسازن(مثل add و sub و ... و دستورات جمع و تفریق و ... که توی درس assembly یا ... می تونید بخونید توسط CPU انجام میشه)

      سال 86 یا 87 بود اگه اشتباه نکنم یه کد هوش مصنوعی با CPP نوشته بودم که واقعا فکر می کرد و می تونست یاد بگیره و مغزشو گسترش بده و تصمیم بگیره تا در کل یک منطقه به حرکت در بیاد. روش کار من الگوریتم پر کردن یک ناحیه ی بسته بود که با داشتن مختصات داخل اون میومدم چهار جهتش رو بررسی می کردم اگه اطرافش خالی بود مختصات نقاط اون چهار طرف بالا و پایین و چپ و راست رو save می کردم توی یک stack یا پشته یا آرایه و بعدش اونا رو دونه دونه از آرایه بیرون میاوردم و چهار جهت هر یک از اونا رو دوباره بررسی می کردم که جای خالی داریم یا نه اگه داشتیم مختصات اون نقاط رو بازم می ریختم توی آرایه و همینطور الی آخر تا همه جا رنگ آمیزی بشه.

      خوب این روش کمک های زیادی به ما می کنه و می تونیم چیزای زیادی برای درک خوش مصنوعی در زندگی و جاهای دیگه ازش یاد بگیریم.

      ماشینی رو فرض کنید توی یک پارکینگ هست و می خواد درب خروج رو پیدا کنه. باید فاصله های بالا و چپ و اطراف رو با انداختن نویز یا اشعه یا توابع مخصوص بررسی کنه تا ببینه اون نقاط جای خالی دارن واسه حرکت یا خیر.

      و همینطور باید جاهای بررسی شده تا رسیدن به اولین دیوار رو علامتگذاری کرد تا دوباره اون نقاط رو بررسی نکنه و وقت هدر نده.

      اینا همش از لحاظ تئوری،توضیحات بود که من براتون دادم.

      واسه اینکه هوش بنویسید باید توابع و روش ها و فکر خودتون رو شترش بدید و مهم از همه اینه که باید کد ببینید و فیلم های یوتیوب و سایت های ایرانی و غیره ... رو بررسی کنید یا مطالعه کنید.



      هوش با هوش فرق می کنه.

      مدلی از هوش مصنوعی رو توی ماشین های مسابقه ای مثل need for speed(نیاز برای سرعت) می بینیم که یک مسیر مشخص رو بعضی ماشین ها با فکر دنبال می کنن.

      مدلی از هوش رو توی بازی کمبات می بینیم که دشمن در شرایط مختلف توسط توابع و درخت تصمیم(decision tree) یا گراف و ... می یاد تصمیماتی رو اتحاذ می کنه

      و مدلی از هوش رو در بهترین برنامه های هوش داریم مثل شطرنج و فوتبال


      در بحث کل کل کردن با هم همه استادیم و ابتدا تلاش های زیادی می کنیم تا کل همدیگرو بخوابونیم.
      ولی در عمل می بینیم خیلی از ما ایرانی ها هنوز بلد نیستیم چطوری از فکرمون استفاده کنیم.
      در مورد بازی فوتبال به صورت تئوری خودم قصد نوشتن یک فوتبال رو داشتم .مدت ها پیش تصوراتی توی ذهنم بود. توی فکرم این بود که konami از چه روشی استفاده می کنه جدای از گرافیک و سیار مباحث مثل فیزیک و ... .
      اونچیزی که توی ذهنم بود این بود که بازیکن ها در فاصله هایی از هم قرار دارن و می تونن نسبت به هم تصمیم بگیرن.
      تصمیم حرکت نزدیک ترین فرد تیم حریف به سمت کسی که توپ زیر پاش هست و توسط player داره کنترل می شه. حالا این کنترل می تونه توسط character controller یونیتی باشه و play کردن animation با استفاده از درخت ادغام(bledn tree) در animator componet یا توسط چیزای دیگه.

      در هر صورت هرکس روش هایی رو بدست میاره و خودش درک می کنه.

      اما مهم ترین چیز در یادگیری هوش اینه که دانش های همدیگه رو روی هم بذاریم و به document تبدیل کنیم و این کاری هست که من دنبال خواهم کرد و امیدوارم دوستان دیگه هم به ما کمک کنن تا در راستای هدف پیش بریم.

      در درس بعد یکی از ساده ترین پروژه های هوش رو که از روی یک فیلم نیگا کردم بهتون خواهم آموخت.
      زبان های پرولوگ و C و زبان های زیادی واسه نوشتن هوش بکار می رن(شما هم می تونید با زبون دلخواه script بسازید).

      اما درگیر جزئیات نبشید و سعی کنید مسائل رو به شیوه ی خودتون و با راهکار(AlgoRithm) های مناسب خودتون حل کنید و یک clean code(به جای یک dirty code) بنویسید.

      یه پروژه بسازید و یک plane و یک سیلندر و یک مکعب بذارید . مکعب اسمشو بذارید enemy(دشمن) و اسم سیلندر رو بذارید player(بازیکن)
      (دشمن می خواد بازیکن رو پیدا کنه و دنبالش کنه)
      [تصویر: player_enemy.jpg]
      واسه هر دو تا ابجکت enemy و player کامپوننت rigidbody رو add کنید(بلد نیستید پیام خصوصی بزنید چون این سوالات مبتدی جاش اینجا نیست)
      من واسه plane تکستجر انداختم و نرمال مپ کردم و واسه دو تا ابجکت هم متریال به رنگ دلخواه ساختم. شما می تونید اونا رو دلخواه تنظیم کنید مهم نیستن زیاد.
      plane رو انتخاب کنید و سپس گزینه ی static رو توی کادر خصوصیات فعال کنید.
      از منوی window گزینه ی navigation رو انتخاب کنید.
      [تصویر: navigation.jpg]
      در inspector وارد سربرگ bake شده و دکمه ی bake زو بزنید وچند لحظه صبر کنید تا plane در اصطلاح bake بشه.(باعث میشه چیزی رو که به این bake نسبت میدیم فقط بتونه روی همین plane حرکت کنه و از این محدوده خارج نتونه بشه)
      چند لحظه صبر کنید اگه bake کامل بشه رنگ plane رو آبی می کنه
      [تصویر: bake.jpg]
      ابجکت دشمن enemy رو انتخاب کنید و سپس از منوی component گزینه ی navigation و سپس nav mesh agent رو انتخاب کنید.
      [تصویر: navMeshAgent.jpg]
      یه اسکریپت سیشارپ بسازید و بعد از ذخیره بکشیدش روی enemy رها کنید:
       void Update () {
              enemy.SetDestination(player.transform.position);
          }

      البته کد رو توی تابع آپدیت نباید بذاریم چون در هر فریم از زمان اجرا میشه و وقت پردازنده رو می گیره و بهینه نیست . خودتون شرط بذارید هر وقت خواستید.
      enemy رو انتخاب کنید و در پنل inspector در قمت اسکریپت اضافه شده به متغیرهای player و enemy ابجکت های enmey و player رو نسبت بدید(اونا رو بکشید و رها کنید توی کادر مربوط):
      [تصویر: script_variables.jpg]
      اجرا بگیرید و ببینید چه اتفاقی میفته .

      نوعی از هوش رو با پلاگین های اماده می سازن. مثل AI Driver Toolkit 3.3 که واسه ایجاد رقابت بین ماشین های مسابقه ای ازش استفاده می کنن.
      [تصویر: ai_driver_toolkit.jpg]
      [تصویر: ai_driver_toolkit_2.jpg]
      یه چیزی داریم توی هوش مصنوعی که توی یونیتی تحت عنوان rayCast ازش استفاده میشه . واسه پرتاپ سیگنال برای اینکه چک کنیم مانعی در سر راه gameObject وجود داره یا نه.
      [تصویر: rayCasts.jpg]
      مثال : توی درس طراحی الگریتم دانشگاه یه متنی رو ترجمه کردم راجع به حرکت ربات مسیر یاب. روش کار رو براتون شرح میدم و در کنارش عکسی از پرتاب سیگنال در یونیتی رو میذارم که از فیلم خارجی ای برداشتم.
      یک ربات مسیر یاب زیرش چند تا سنسور(حسگر) داره و چند تا چراغ قرمز.
      فرض کنید این رباط م خواد روی یه زمین آبی روشن و دقیقا روی یک خط سفید حرکت کنه.
      اما این دوتا هر دوشون روشن هستن و تشخیص اونا سخته.
      در روانشناسی رنگ ها، جسمی که تیره تر باشه نور رو کمتر منعکس می کنه و جسمی که رنگش روشن تر باشه نور رو بیشتر انشار میده(یا emit می کنه)
      چراغ های زیر ماشین(چراغ های زیرین چپ و راست) نوری رو با زمین پرتاب می کنن و سنسور های زیر ماشین (سنسورهای زیرین چپ و راست) منتظر دریافت نورهای پرتاب شده هستند که توسط زمین زیرین ماشین باید منعکس بشن.
      فرض کنید ماشین روی خط سفید هست و کمی به سمت چپ کج شده . یعنی لاستیک چپ روی خط سفید نیست و روی زمین آبی هست.
      تمام لامپ های قرمز زیر ماشین دارن نور رو پرتاب می کنن.
      اما فقط در این لحظه سنسورهای زیرین روبات که در سمت راست هستن نور رو دریافت کردن. چون سمت راست ماشین روی خط سفید بود و طبق روانشناسی رنگ ،خط سفید نور بیشتری رو باید بازتاب کنه. پس سنسورهای راست باید دستور بدن که ماشین فرمون بده به سمت راست و بگه که ماشین باید کمی سرشو راست کنه.(یعنی به چرخ چپ دستور چرخش به راست و چرخش رو می ده)

      بعد از چند لحظه ماشین جلو میره و اینبار سرماشین به راست خم شده و سنسورهای چپ روی line سفید قرار دارن. پس ماشین دستور می ده که به سمت چپ فرمون بده و همینطور الی آخر.

      در حقیقت اگه دقت کنید ماشین های line Tracker یا line Follower یا دنبال کننده ی خط با روش چپ و راست کردن و چرخش چرخ ها توی مسیر به حرکت در میان واسه همینه که وقتی توی تلویزیون می بینید روبات ها روی خط دارن راه می رن کمی چپ و راست می کنن.

      البته اگه تعداد چراغ ها و سنسور ها زیاد تر باشه دقت بیشتر میشه و همینکه روبات از روی خط کمی چپ و راست شد سریع میاد روی خط و سعی می کنه توی همون line حرکت کنه
      توی یونیتی هم ما چیزی به اسم rayCast داریم که کار همون چک کردن مانع ها(obstacle) رو انجام میدن(یعنی rayCast می کنه که جلوش چیزی هست یا نه).
      حالا اینکار رو میشه با اسکریپت نویسی دستی انجام داد یا توابع مربوط که میان خودشون همه ی کار رو انجام می دن و فقط بررسی می کنن مانع در سر راه یا در زاویه ی فلان و فاصله ی فلان وجود داره یا خیر وبه ما یه خروجی بلی یا خیر میدن:
      true ( یا عدد 1) : وجود دارد/پاسخ مثبت است یا ...
      false(معمولا عدد 0 تا هر چیزی غیر از 1 رو می گیم false) : وجود ندارد/پاسخ منفی است یا ....
      [تصویر: ai_sensor_raycast.jpg]
      [تصویر: ray_1.jpg]
      تابع RayCast رو هم اینجا توضیح دادیم قبلا:
      http://gameover.blog.ir/1394/08/18/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-raycast-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C

      مثالی از هوش :

      کپسول: دارای تگ یا برچسب Player
      مکعب : دشمن یا Enemy

      خوب فکر کنید می خوایم کاری کنیم که اگه هر گیم ابجکتی با تگ یا برچسب "Player" در محدوده یا trigger دشمن باشه متغیر takDamage(وضعیت خطر) فعال یا true بشه و به محض خروج اون گیم ابجگت از محدوده ی دشمن،takDamage غیر فعال یا false بشه.

      تا بعدا با بررسی مقدار true یا false بودن این متغیر ، عمل تیر اندازی یا تعقیب یا ... توسط دشمن انجام بشه.

      برای تنظیم اینکار به کاراکتر دشمن یک کامپوننت فیزیک box Collider می دیم و siez.xyz رو در کادر inspector کمی زیاد می کنیم تا یک محدوده ی دلخواه برای دشمن ایجاد بشه.


      [تصویر: box_collider_1.jpg]

      اینم اسکریپتی js ای که باید بدیم به دشمن یا  Enemy :

      (نکته:باز هم توصیه می کنیم شما سعی کنید با سیشارپ کدتون رو بنویسید چون استاندارد تره)

      //js 
      var health=10;//اینم نیاز نبود، حالا واسه سلامتی درست کردیم
      var TakeDamage:boolean;
      
      function OnTriggerEnter(other : Collider){
      if(other.tag=="Player"){
      TakeDamage=true;
      }
      }
      
      function OnTriggerExit(other:Collider){
      if(other.tag=="Player"){
      TakeDamage=false;
      }
      }

      واسه تابع update هم می تونیم کدی بنویسیم که مثلا اگه کلیدی رو فشار داده باشیم پایین،مقدار متغیر health رو کم کنه و اگه از منفی یک (-1) کمتر شد اونو نابود کنه و یه پیام بده.

      function Update(){
      if(TakeDamage) //or if(TakeDamage==true)
      {
      if(Input.GetButtonDown("Fire1"))//or if(Input.GetKey("هر حرفی که دوست داریم"))
       {
        health -- ; // health = health  - 1;
        }
       }
        
      //اگه سلامتی صفر شد پیام بده دشمن مرد و گیم ابجکت دشمن رو نابود کن:
      if(health < -1)
      {
      print("doshman mord");
      health=0;
      Destroy(gameObject);
      }
      
      }//update

      نکته : اگه Tag یا برچسب رو نمی دونید چیه اینجا رو مطالعه کنید :

      http://gameover.blog.ir/1394/11/22/%D8%AA%DA%AF-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%DA%86%DB%8C%D8%B3%D8%AA-what-is-tag-in-unity

      اینم یک سری اسکریپت در یونیتی:

      http://gameover.blog.ir/1394/01/22/%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%AF%D8%B4%D9%85%D9%86-%D9%88-%D8%AD%D9%85%D9%84%D9%87-%D9%88-%D8%AC%D9%88%D9%86-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C




      ۰ نظر موافقین ۰ مخالفین ۰ ۰۸ خرداد ۹۴ ، ۰۴:۳۳
      مدیرکل
      منبع:gameover.blog.ir


      برای اجرای یک کد بعد از چند ثانیه باید نوع Start رو IEmulator بگیرید و از تابع WaitForSeconds استفاده کنید. مثال:



      public float Delay = 2.0f;//دو ثانیه تاخیر
           IEnumerator Start()
           {
               yield return new WaitForSeconds(Delay);
               کد دلخواه رو اینجا بذارید
           }

      ۱ نظر موافقین ۰ مخالفین ۰ ۰۷ خرداد ۹۴ ، ۱۱:۲۷
      مدیرکل
      یادتون نره به ابجکت ها collider بدید(توی کادر اجزای صحنه یا hierarchy انتخاب کرده و در کادر خصوصیات insoector روی دکمه ی add component بزنید و تایپ کنید collider و کالیدر یا برخوردکننده ی مربوط رو انتخاب کنید)


          // Destroy everything that enters the trigger

          
      function OnTriggerEnter (other Collider) {
              
      Destroy(other.gameObject);
          }


      ۰ نظر موافقین ۰ مخالفین ۰ ۳۱ ارديبهشت ۹۴ ، ۲۰:۱۷
      مدیرکل

      از بخش global settings تنظیمات کلی به سربرگ Loadig رفته و بخش show your own image while loading رو فعال کرده و سپس با کلیک رو دکمه ی change image عکس دلخواه برای صفحه ی loading رو انتخاب کنید و در نهایت ok.

      http://s3.picofile.com/file/8189031392/loading_gm81.jpg

      در مورد نظر دوستمون مهراب باید بگم،راه دیگه رو نمی دونم.توصیه می کنم یونیتی کار کنید.

      --

      اینم ایجاد لودینگ در یونیتی:



      private AsyncOperation async null;

      IEnumerator Start()
      {
      async Application.LoadLevelAsync("test");
      yield return async;
      }

      void OnGUI
      {
      GUI.Label(new Rect(10,10,50,50),(100*async.progress).ToString());
      }

      void Update()
      {
      if((
      async.progress 100)>=100)
      {
      this.enabled false;
      }
      }



      ۲ نظر موافقین ۰ مخالفین ۰ ۲۸ ارديبهشت ۹۴ ، ۱۳:۴۰
      مدیرکل

      اسپرایت چیست.
      سورس چیست.
      اسکریپت چیست.
      الگوریتم چیست.
      ابجکت چیست.
      هوش مصنوعی چیست.
      زبان های برنامه نویسی چه فرقی دارند وکدام خوب است.
      کسی بازی ساخته میشه ازاول توضیح بدید باید چه طوری بازی ساخت تا آخرش.
      چیزهایی که لازم درمورد ساخت بازی بگید ازاول تاآخر.
      موتور بازی چیست.
      برای کسی که بازی نساخته کدام موتورخوبه.
      موتورهای بازی ازجمله game maker, Construct , XNAFramework, Unreal,Unity,Anvil,XRay,Euphoria,CryEngine این موتورها هریک ازکدام زبان برنامه نویسی ساخته شده اند. وباهمون زبان برنامه نویسی باید بازی ساخت.
      این موتورها میشه توضیح بدید چه خوبی هایی دارند. هرکدام ومقایسه کنید.
      ازکجامیشه متوجه شد بازی که ساخته شده ازچه موتوربازی استفاده کرده است.
      این موتورها کاربری که باهاش بازی ساخت میشه بگه.
      game maker خوبه یا professional و گیم میکر استودیو برای ساخت بازی و چه فرقی باهم دارند.
      گیم میکر7با8 چه فرقی دارند. ودیگرموتورکه ورژن های دیگردارند.
      لینگ دانلود این موتورهای بازی به همراه کرک میشه بدید.
      آموزش هایی درباره ای ساخت بازی وموتوربازی چه پی دی اف وچه ویدیو هست لینگ بدید.
      به جزموتور بازی برای ساخت بازی به نرم افزاری نیازهست یانه.
      کدام این موتورهای بازی برای دوبعدی خوبه وسه بعدی است. کدام این موتورها برای ساخت بازی خوب است. هریک ازاین موتورها برای بازی مورد نظر هستند یا فرقی نداره هرچی میشه ساخت. وکدام این موتورها معروف هستند. شرکت بازی سازی ازموتورهای رایگان بازی استفاده می کنند یانه.
      کدام این موتورهای بازی سازی میشه برای اندورید ساخت.
      بازی که ساخته میشه میشه به صورت آنلاین هم میشه بازی کرد چه طوری میشه این کارکرد.
      موتوربازی رایگان چه فرقی باپولی دارند.
      برای ساخت بازی کدام زبان برنامه نویس یاد بگیریم.
      چه مدت طول می کشه بازی بشه ساخت.

      ------

      پاسخ:





      sprite این هست :
      [تصویر: form_sprite.jpg]
      یا این :
      [تصویر: sprite.jpg]


      سورس یعنی منبع یا فایل لایه باز که بتونیم بازی رو تغییر بدیم.البته سورس شامل اسکریپت و برنامه ها هم میشه.

      اسکریپت کدهایی هست که می نویسیم.
      مثل این شکل:
      http://docs.yoyogames.com/source/dadiospice/002_reference/001_gml%20language%20overview/programexample.png
      البته می تونیم در زیر شاخه ی script هم بعضی از اسکریپت ها رو با نام دلخواه ایجاد و فراخوانی کنیم تا کدهاش اجرا بشه

      AlgoRithm مجموعه‌ای متناهی از دستورالعمل‌ها است، که به ترتیب خاصی اجرا می‌شوند و مسئله‌ای را حل می‌کنند.(

      واژه الگوریتم از نام ریاضیدان و ستاره‌شناس و جغرافی‌دان نامی ایرانی، ابوجعفر محمد بن موسی خوارزمی (الخوارزمی)، گرفته شده است)
      اگه همونو با شکل نشون بدیم میشه فلوچارت یا چارت Flow که flow یعنی جریان و روند کار و اجرا دستورات به ترتیب:
      http://fa.wikipedia.org/wiki/%D8%A7%D9%8...8%AA%D9%85

      object = شی یا کنترل هایی که اسپرایت رو ربط میدیم بهش. مثل ابجکت توپ یا ابجکت قارچ خور:
      [تصویر: form_object.jpg]

      هوش مصنوعی ساخت کد و برنامه یا تابعی است که بتواند اطلاعاتی را در حافظه ذخره و بازیابی کرده و بر حسب داده ها تصمیم بگیرد و خودش به طور مستقل به جای انسان بتواند فکر کند.

      زبونای برنامه نویسی هر کدوم اربرد خودشون رو دارن و به طور کلی همیشه نمیشه گفت کدوم بهتره یا کدوم بدتره:
      C/Java/Objective-C/C++/C# csharp/PHP/(Visual) Basic/Python/Perl/Ruby/JavaScript/vb.net/Lisp/Transact-SQL/Pascal/Bash/Delphi or Object Pascal/PL/SQL/Assembly/Lua
      معمولا جاوا معروف تر و کاربردی تره و روی اکثر سیستم ها اجرا میشه و کاربردی ترین و تقریبا بهترین زبون جاوا هست .البته بازم می گم هر چی کار می کنی باید کاربردشو بدونی. لازم نیست خسته کنی یه عالمه کتاب بخری پولاتو هدر بدی.
      میری توی گوگل و سرچ می کنی و زود به جواب میرسی بعدش می پرسی .
      خود جاوا هم صد شاخه هست برنامه نویسی سیستم داره برنامه نویسی وب JSP=JAVA server pages داره و برنامه نویسی اندروید.
      باید ببینی کدوم محیش خوبه بهتره مثل ECLipse بعدش بری دنبال مثلا برنامه نویسی اندوید .(تا یه چیز خوب رو خوب یاد نگرفتی سمت چیز خوب دیگه نرو)

      آره من بازی ساختم. بازی های دو بعدی و حتی سه بعدی(ساده).
      خوب اولش با game maker شروع کردم و یک ابجکت ساختم بپره تیر بزنه . سورس ها رو دیدم تحقیق کردم توی امضام هم یه آموزش گذاشتم بخونی و همت کنی راه میفتی به اذن پروردگار مهربان و عزیز انشاءا... .

      انجین بازی یا موتور بازی نرم افزاری هست که باهاش می تونیم بازی هامون رو سریع تر بسازیم و توسعه بدیم و بسته به خروجی و انعطاف و مدیریت منابع میان به انجین های مختلف نمره میدن

      گیم میکر 7 یا 8 یا ... هر چا بالا تر میره خوب امکاناتش بهتر میشه و شماره ورژن یا نسخش مشخص می کنه کدوم جدید تره. نو که بیاد به بازار .. کهنه میشه دل آزار(البته معمولا) ضمنا الان game maker ها خروجی اندروید نمی دون و توصیه می کنیم game maker studio رو دانلود بفرمایید و همینور پکیج های اندروید مروبطه که اونم توی قسمت دیگه ای از انجمن هست کگه توی کادر بالای انجمن می تونید بنویسید خروجی apk در گم میکر تا تاپیک مربوط رو پیدا کنید

      لینک دانلود موتور های بازی هم باید اسمشو توی بالای انمجن سرچ کنید میاد نیومد برید توی google.com و تایپ کنید مثلا : دانلود game maker studio با کرک یا ...

      در مورد آموزش هم توی صفحه اول انجمن تیتر و عنوان ها رو بخونید. اگه با مروگر FireFox کار می کنید ctrl+F بزنید و مثلا تایپ کنید game maker بعدش می رید روی عنوان مربوط و زیر شاخه هاش و الی آخر یا اون کادر بالای انجمن برای جستجو هست.

      موتور رایگان مجانی هست پولی هم پولی هست البته خیلیا می زنن کرک می کنن مجانی میشه عین خودمون که وضع مالیمون بد هست شاید مجبوریم

      انجین unity و game maker و construct و unreal و احیانا یکی دو انجین دیگه معروف ترین هستند.
      اما از بین اون بالایی ها بیشتر توی ایران و جهان game maker studio و unity کار میشه که من توصیه می کنم شما که خیلی مبتدی هستید با game maker شروع کنید

      واسه سه بعدی همون یونیتی اما بازم توی مبحث Rigging و هوش مصنوعی نیاز به استاد هست چون واقعا کار دشواری هست.

      در مورد بازی ساز شدن شما باید خودتون تلاش کنید و دنبال برید و پرس و جو کنید. این یک. اما دوم اینکه در کشور عزیزمون دانش و کتب بازیسازی و امکانات برای همه به یک میزان فراهم نیست. هرچند بعضیا میگن امکانات مطرح نیست اما اینجانب معتقدم بی تاثیر هم نیست.
      در هر صورت شما میزان توانایی و امکانات خودتون اعم از اینترنت استاد و و و غیره رو ببینید و سعی کنید در حد توانتون بازی سازی رو ادامه بدید و با توکل به خدای عزیز و تمرین پی در پی سعی کنید پیش برید. هیچ وقت عجله ی بیش از حد نکنید و سعی کنید گام به گام بپرسید تا یاد بگیرید. پرسیدن رو فراموش نکنید ولی قبلش هم یه جستجو توی اون کادر بالای انجمن بزنید.
      -
      ---
      کپی از:
      http://promakers.ir/showthread.php?tid=11196

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ ارديبهشت ۹۴ ، ۰۴:۲۶
      مدیرکل

      نرم افزار open sourceساخت مدل آماده ی انسان با مو و لباس و کفش 

      http://sajjad3011.persiangig.com/makeHuman.jpg


      این نرم افزار رایگان اپن سورس واسه ساخت انسان و تغییر رنگ چشم و لباس و تیشرت و کفش و غیره هست که با تغییراتی می تونید تکستچرهاشو بعدا ببرید توی فتوشاپ و ویرایش کنید... خیلی راحت می تونید خروجی mhx بگیرید و توی blender هم ببرید و import کنید و اونجا تمام ایتم های لازم واسه rigify و متحرک سازی و تمام دستگیره یا handle های ریگ کردن اسون توی بلندر واستون میاد.
      برای اطلاعات بیشتر و دانلود این نرم افزار مفید که خودم هم باهاش یک کاراکتر رو export کردم و بردم توی بلندر ریگ کردم به این سایت برید:
      http://www.makehuman.org/
      کار باهاش اسونه... فقط باید کمی انگلیسیتون خوب باشه.
      مشکل ترجمه دارید http://translate.google.com
      --
      چون وقتم کمه به جای اینکه بهتون ماهی بدم ماهیگیری رو یادتون دادم.. شما باید کمی انگلیسیتون رو خوب کنید لا اقل توی ترجمه با استفاده از google
      --
      سوالی بود بپرسید ..
      التماس دعا


      از جمله امکاناتی که این نرم افزار داره رو خودم می گم براتون :
      می تونید این ایتم ها رو انتخاب کنید و تغییرات قسمت های بدن فرد همونجا اعمال میشه:
      مرد یا زن بودن
      رنگ چشم:ابی. سبز. قهوه ای
      لباس: تیشرت. آستین بلندر
      شلوار: لی جین
      رنگ کفش
      ایا انسان افریقایی هست یا خیر: scroll داره اگه زیادش کنید رنگ پوستش سیاه تر میشه
      آیا اهل asia هست یا نه : اگه زیاد کنید چشم هاش بادومی میشه
      انتخاب مو
      انتخاب تعداداستخوان ها در بخش pose/animation برای game یا basic
      دقت کنید روی basic بذارید تا 73 استخوان کامل رو اکسپورت کنه..
      --
      بعدش mhx خروجی بگیرید
      می تونید ببرید توی بلندر و اونجا ریگ کنید(ریگ یا rigging و انیمیت کردن یا ایمیشن سازی یا هر اصطلاح تخصصی در زمینه ی بازیسازی رو نمی دونید ازم بپرسید)
      انیمیشن ساز اپن سورس بلندر هم می تونید از اینجا رایگان دریافت کنید :
      http://www.blender.org/
      توی make Human می تونید قد و چاق یا لاغری،اندازه ی بازو و ماهیچه ها، و حتی دندان ها رو انتخاب کنید تا توی بلندر هم بتونید دهن کاراکتر رو باز و بسته کنید با استخون های لازم
      در سربرگ face می تونید میزان پیری رو در بخش Edge (سن و سال) مشخص کنید تا خودش مدل رو چروکیئده و غوز کرده کنه
      گردی دور صورت رو در بخش face می تونید توسط پارمتر های oval و .... دستکار کنید یا مربعی بودن...
      اندازه افقی،عمودی،میزان قوس کمر و سایر تنظیمات 
      درازی گردن
      تنظیم فاصله ی بین چشم ها،و ابروها روی هر چشم دلخواه 
      کشیدگی انگشتان دست و پا
      اینم مدلی که خودم توی چند ثانیه باهاش ساختم :
      http://s5.picofile.com/file/8126288434/makeHuman2.jpg
      ضعف : قابلیت import مدل رو نداره فکر می کنم.
      http://s5.picofile.com/file/8127263476/basic_mkHuman.jpg
      سپس ctrl+E بزنید واسه export و عملیات ریگ سازی در بلندر(نرم افزار open source blender واسه انیمیشن سازی و مدلسازی و ...)
      --
      من پروژه ای رو به اسم exp1 در مسیر C:\Users\john\Desktop\exp اکسپورت کردم و سپس توی بلندر فایل exp1.mhx رو ایمپورت کردم
      (واسه ایمپورت این مدل باید پلاگین rigify رو توی سربرگ add-ons از پنجره ی preferences( که با ctrl+alt+u باز میشه) فعال کنید.(توی کادر جستجو بزنید میاد)

      توی import فایل mhx توی بلندر ممکنه دچار خطای فایل io_import_scene_mhx.py بشید. این چیزا اشکالات رایج بلندر هست. ممکنه بعضی وقتا به خاطر کامپایلر python یا مفسر باشه، می تونید برای رفع این مشکل بلندر رو ببندید (ورژن مورد استفاده ی من blender 2.70 هست)
      و فایل io_import_scene_mhx.py رو از سایت های اصلی مثل
      https://svn.blender.org/svnroot/bf-exten...ene_mhx.py
      دانلود و در ویندوز 7 در مسیر
      C:\Program Files\Blender Foundation\Blender\2.70\scripts\addons\io_import_scene_mhx.py
      جایگزین کنید و سپس بلندر رو باز کنید و mhx رو ایمپورت کنید.
      نکته: واسه دانلود باید add exception یا اجازه ی تایید به مرورگر رو بدید مثل fireFox.
      فعال سازی rigify برای ایمپورت mhx در بلندر :
      http://s5.picofile.com/file/8127269676/rigify_addons.jpg
      نکته : موقع خروجی گرفتن مدل در نرم افزار makeHuman سعی کنید در بخش geometry(هندسه) در بخش teeth (دندان ها) یک نوع دندان رو انتخاب کنید(اگه روی none باشه دیگه مدل ما دارای دندان نیست و توی بلندر ابزار ریگ کردن و ابز و بسته کردن دهان و متحرک سازی اون رو نخواهیم داشت)
      http://s5.picofile.com/file/8127269850/teeth.jpg
      همچنین موقع خروجی گرفتن در make human در سربرگ files و سپس سربرگ export گزینه ی export for Rigify رو فعال کنید اینطوری بهتره.
      http://s5.picofile.com/file/8127270426/export_for_rigify.jpg
      و در نهایت وارد بلندر بشید و فایل mhx اکسپورت گرفته از قبل رو ایمپورت کنید
      (از منوی files->import->import make human_mhx)
      حالا هر اهرمی رو خواستید با راست کلیک روش توی بلندر می تونید انتخاب کنید و Rigging رو انجام بدید.
      می تونید گردن کاراکتر رو خم کنید
      می تونید واسش انیمیشن بسازید که راه بره یا jump (پرش کنه) یا ....
      که انیمیشن سازی هم اسونه قبلا یاد دام. بازم بلد نبودید توی بخش blender و در بخش پرسش و پاسخ بپرسید .
      http://s5.picofile.com/file/8127271276/mk_rig.jpg
      یه راهنمایی هم می کنم واسه ریگ کردن. هیچ کاری نداره:
      (R می زنید و سپس x و ماوس رو حرکت می دید حول محور X می چرخوند اهرم انتخاب شده رو. اگه y یا z هم بزنید روی اون محور ها میچرخن)
      G واسه حرکت دادن یا Grabbing هست که بعد از G می تونید X بزنید و ماوس رو حرکت بدید مثل قبل و الی آخر.
      واس انیمیت کردن هم می تونید فریم های کلیدی بسازید(کلید i واسه درج تغییرات هست و ماوس رو هر جا ببرید همون جا i بزنید و ...)
      بعدشم نوار انیمیشن رو می برید جلو و دوباره مدل رو تغییر می دید و بازم i می زنید تا ثبت بشه به همین آسونی.
      --
      همه چی بستگی به تلاش خودتون داره تا یک ادم رو خوب ریگ کنید .(اما یه نکته ای: Rigging به طور دستی مصیبت هست و متاسفانه فقط پولدارهایی که دستگاه موشن کپچر دارند می تونند کاراکترها رو طبیعی ریگ کنند)

      نکته : من در makeHuman در سربرگ Pose/animation نوع استخوان رو Muscles (ماهیچه ها) گذاشتم و بیشترین تعداد استخوان یعنی 107 استخون رو به من داد و این بهترین حالت واسم بود. در سربرگ file و تب export هم گزینه ی export for rigify رو غیرفعال کردم مشکلی نبود.
      این بار تونستم فک کاراکتر رو هم حرکت بدم توی بلندر و دهان کاراکتر رو باز کنم و دندون هاشم ببینم :

      http://s5.picofile.com/file/8127273268/dandoon.jpg

      ۶ نظر موافقین ۰ مخالفین ۰ ۲۳ ارديبهشت ۹۴ ، ۰۲:۳۰
      مدیرکل


      مسیر دقیق پوشه های نصب android sdk manager برای خروجی گرفتن اندروید در unity و game maker studio و basic4android :



      محتوای پوشه ی android-SDK:

      کد:
      add-ons
      AVD Manager.exe
      build-tools
      extras
      platform-tools
      platforms
      samples
      SDK Manager.exe
      SDK Readme.txt
      system-images
      tools
      uninstall.exe
      پوشه های داخل پوشه ی add-ons:
      کد:
      addon-google_apis-google-13
      addon-google_apis-google-7
      addon-google_apis-google-8
      محتوای پوشه build-tools :

      کد:
      android-4.2.2
      android-4.4.2
      android-4.4W

      محتوای پوشه platforms:
      کد:
      android-10
      android-11
      android-12
      android-13
      android-14
      android-15
      android-16
      android-17
      android-18
      android-19
      android-20
      android-7
      android-8
      __MACOSX
      محتوای پوشه ی platform-tools:
      کد:
      adb.exe
      AdbWinApi.dll
      AdbWinUsbApi.dll
      api
      dmtracedump.exe
      etc1tool.exe
      fastboot.exe
      hprof-conv.exe
      NOTICE.txt
      source.properties
      sqlite3.exe
      systrace

      محتوای پوشه ی samples :
      زیاد مهم نیست ولی اینان:
      کد:
      1.txt
      AccelerometerPlay
      ActionBarCompat
      AndroidBeamDemo
      ApiDemos
      BackupRestore
      BasicGLSurfaceView
      BluetoothChat
      BluetoothHDP
      ContactManager
      content_hash.properties
      CrossCompatibility
      CubeLiveWallpaper
      GestureBuilder
      Home
      HoneycombGallery
      JetBoy
      LunarLander
      MultiResolution
      NFCDemo
      NotePad
      NOTICE.txt
      RandomMusicPlayer
      RenderScript
      SampleSyncAdapter
      SearchableDictionary
      SipDemo
      SkeletonApp
      Snake
      SoftKeyboard
      source.properties
      SpellChecker
      Spinner
      SpinnerTest
      TicTacToeLib
      TicTacToeMain
      ToyVpn
      TtsEngine
      USB
      VoicemailProviderDemo
      VoiceRecognitionService
      WeatherListWidget
      WidgetPreview
      WiFiDirectDemo
      Wiktionary
      WiktionarySimple
      XmlAdapters

      محتوای پوشه ی system-images :

      کد:
      android-14
      android-17
      armeabi-v7a

      محتوای پوشه ی tool :

      کد:
      adb.Bat
      adb.exe
      AdbWinApi.dll
      adb_has_moved.txt
      android.bat
      ant
      apps
      ddms.bat
      dmtracedump.exe
      draw9patch.bat
      emulator-arm.exe
      emulator-mips.exe
      emulator-x86.exe
      emulator.exe
      emulator64-arm
      emulator64-mips
      emulator64-x86
      emulator_NOTICE.txt
      etc1tool.exe
      hierarchyviewer.bat
      hprof-conv.exe
      Jet
      jobb.bat
      lib
      lint.bat
      mksdcard.exe
      monitor.bat
      monkeyrunner.bat
      NOTICE.txt
      proguard
      source.properties
      sqlite3.exe
      support
      systrace
      templates
      traceview.bat
      uiautomatorviewer.bat
      zipalign.exe

      اینم عکس :
      http://s6.picofile.com/file/8184662100/a...folder.jpg
      http://s6.picofile.com/file/8184662476/add_ons.jpg
      http://s6.picofile.com/file/8184662492/build_tools.jpg
      http://s6.picofile.com/file/8184662550/platforms.jpg
      http://s4.picofile.com/file/8184662592/p..._tools.jpg
      http://s6.picofile.com/file/8184662600/samples.jpg
      http://s4.picofile.com/file/8184662726/s...images.jpg
      http://s6.picofile.com/file/8184662668/tools.jpg

      خود خروجی گرفتن apk (اندروید) در گیم میکر استادیو قبلا اینجا اموزش داده شده:
      http://promakers.ir/showthread.php?tid=7709


      خرید آموزش b4a فارسی با قیمت کم:
      http://gameover.blog.ir/1395/04/03/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A7%D9%85%D9%88%D8%B2%D8%B4-b4a-%D8%B3%D8%A7%D8%AE%D8%AA-%DA%AF%DB%8C%D9%85-%D8%A2%D9%88%D8%B1
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۵ ارديبهشت ۹۴ ، ۰۴:۰۸
      مدیرکل

      برای رفع این مشکل ، در قسمت File->Build Settings ، روی گزینه ی PC , Max & Linux Standalone و سپس دکمه ی Player settings کلیک کرده و از قسمت راست گزینه ی Direct 3d 11 را غیر فعال نمایید.ضمنا دقت کنید نوع فایل تکستچر شما بهتر است PNG باشد نه jpg.

      http://s4.picofile.com/file/8184261942/d3d_11_disable_for_redChannel_unity.jpg

      ۰ نظر موافقین ۰ مخالفین ۰ ۰۳ ارديبهشت ۹۴ ، ۰۷:۵۵
      مدیرکل

      گیم ابجکتی که میخواید  فیزیک نداشته باشه بهش collider بدید سپس از قسمت collider تیک IsTirgger رو بزنید . برای بررسی برخورد با جسم دیگر یا وجود جس دیگر با تگ فرضی otherTag این کد سیشارپ رو استفاده کنید:


      void OnTirggerEnter ( Collision Other ) {
      if ( Other.gameObject.tag== "otherTag"){
      Debug.Log("barkhord ba vojood");
      }
      }
      ۹ نظر موافقین ۰ مخالفین ۰ ۰۳ ارديبهشت ۹۴ ، ۰۳:۵۰
      مدیرکل

      gameover.blog.ir
      دانلود فایل و ذخیره در محل پروژه توسط سیشارپ در یونیتی(روی اندروید هم ج میده) :
      کد سیشارپ(دقت کنید اسم اسکریپت بذارید NewBehaviourScript   ) :


      using UnityEngine;
      using System.Collections;
      
      public class NewBehaviourScript : MonoBehaviour {
          public string url = "http://sajjad3011.xzn.ir/sajjad3011.avi";
          IEnumerator Start() {
              WWW www = new WWW(url);
              yield return www;
              //renderer.material.mainTexture = www.texture;
              //save downloaded File
              System.IO.File.WriteAllBytes("sajjad3011.avi", www.bytes);
              Debug.Log (Application.persistentDataPath);
          }
      }
      عکسی از اجرای اسکریپت و فایل avi دانلودی و ذخیره در مسیر جاری پروژه:
      http://s4.picofile.com/file/8183626768/downloadFileAndSave.jpg

      نکته 1: لینک دانلود باید مستقیم باشه. نه اینکه مثل picofile ابتدا دکمه ی دانلود رو بزنیم و بعدش لینک دانلود بیاد.
      نکته 2: بعضی اوقات با خطایی مثل این مواجه بشیم:
      کد:
      couldn't connect to host
      که به علت دستکاری تنظیمات پ_ر_ا_ک_30 یونیتی یا قندشکن شما ممکن هست باشه .منظورم همون تنظیماتی هست که برای دانلود از asset store در بخش environment variables از device manager انجام دادید.
      یادتون نره طبق شکل Android رو انتخاب کرده و به قسمت Player settings رفته و در زیر شاخه ی Other settings گزینه ی write access رو روی SD Card(یا اجازه دسترسی کارت حافظه) قرار بدید.
      گزینه bundle indentifier (شناسه کاربری) هم اسم اپلیکیشن شما بعد از نصب روی دستگاه اندروید هست.(مثال : com.gameover.test1  که گیم آور اسم شرکت و test1 اسم اپلیکیشن هست).
      http://s4.picofile.com/file/8184039568/playerSettings_SD_card_setting_for_android.jpg

      ۲ نظر موافقین ۰ مخالفین ۰ ۰۲ ارديبهشت ۹۴ ، ۰۱:۴۰
      مدیرکل

      وقتی یک مدل رو unwrap می کنیم و مثلا از توی بلندر میبریم توی یونیتی، باید حتما تسکتچر هر بخش ساخته شده رو جدا جدا توی یونیتی ایمپورت کنیم و سپس set کنیم روی متریال جدیدی که حالا bumped هست(شامل تو texture یکی نرمال مپ و یکی دیفیوس)، یا diffuse یا ..
      . .
      پس دقت کنید که اگه یک تکستچر جدید میسازید که روی مدلتون توی بلندر دوباره ویرایش شده باشه باید حتی اون مدل قبلی رو از توی یونیتی حذف کنید و دوباره مدل ویرایش شده رو(دقت کنید علاوه بر تکستچر ها باید خود مدل رو هم) دوباره اسکپورت و سپس توی یونیتی دوباره ایمپورت کنید وگرنه ممکنه بعضی جاهای خالی جدای از UV شما(مثل اون بخش های شطرنجی یا حالا هرچیز اضافی) روی مدل قبلی تاثیر داشته باشه.


      نکته ی بعدی اینه که:

      شما نباید یک عکس png یا حالا jpg و .. رو مستقیم بکشید روی مدلتون توی یونیتی.

      بلکه شما باید ابتدا یک material جدید رو new کنید و سپس متریال رو انتخاب کنید و سپس تکستچر رو بکشید روی کادر مربوط توی inspector توی قسمت تکستچر از متریال ایجاد شده تا تکستچر شما روی متریال set بشه .

      و نهایتا باید قسمت دلخواه مدل رو توی یونیتی جدای از بقیه در حالت انتخاب قرار بدید(روش کلیک کنید تا انتخاب بشه) و سپس این متریال رو بکشید روش. با اینکار دقیقا همون تکستچر گذاری دقیقی که قبلا توی بلندر بود رو توی یونیتی خواهید دید.

      نکته ی بعدی که مربوط به بلندر هست ولی اینجا بازم یاد آوری می کنم اینه که برای اینکه توی بلندر در مد uv editing براش یا قلم شما روی تکستچر دلخواهتون set بشه و رنگ که می کنید با تکستچر روی مدل بندازه،باید توی بخش نقاشی روی کادر تکستچر بزنید و تکستچری رو که قبلا load کرده بودید رو انتخاب کنید نه color paint رو.
      --
      نکته ی آخر که واسه مبتدیا بگم اینه که :

      نرمال مپ که می گن همون bumped texture هست که چیز خاصی نداره فقط یک متریال ایجاد می کنید و نوع تکستچر رو از کادر مربوط توی inspector روی bumped می ذاریم خودش دو تا گزینه میاره یکش واسه تکستچر diffuse هست و یکیش واسه normal map. تکستچر دیفیوس همون تکستچری هست که ساختیم و می کشیم روی همین گزینه.
      برای ساخت تکستچر normal map کاقیه نرم افزار crazy bumped رو داشته باشید که یکی از بهترین نرم افزار ها هست که فقط همون تکستچر عادی یا diffuse رو توش open می کنید و موقع save فقط save normal to file رو می زنید که یک فایل png آبی و صورتی تولید می کنه که در حقیقت واسه ایجاد یک جور برجستگی روی مدل هست همون می گیم تصویر نرمال یا normal map texture که بعد از ساخت، کافیفه png file رو ببریم توی یونیتی و بعد از ایمپورت شدن بکشیم روی همون کادر normal map تا تکستچر نرمال مپ هم set بشه و در نهایت روی دکمه ی fix فقط یکبار کافیه کلیک کنید تا نتیجه رو روی مدل توی صحنه ی بازی ببینید. البته دقت کنید که معمولا برای شاهده ی بهتر کافیه یک directional light (نور مستقیم) بندازید توی صحنه و در زاویه ی مناسب.
      --
      سوالی بود بگید تا تصویر بذارم. چون ممکنه بعضیا بگن سطح مطلب بالا بود و متوجه نشن.
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۳ فروردين ۹۴ ، ۱۴:۵۵
      مدیرکل

      منبع:gameover.blog.ir

      ابتدا یه rigifbody هم بدید به اشیاتون و سپس این اسکریپت رو بندازید روی ابجکتی که میخواید با ماوس بگیرید و جابجاش کنیم(نکته : دوربین رو از نمای بالا قرار بدید) :

      منبع : سایت سازنده یونتیی

      کد سیشارپ:

      using UnityEngine;
      using System.Collections;
       
      [RequireComponent(typeof(Rigidbody))]
      public class Dragable : MonoBehaviour
      {
       
      	public int normalCollisionCount = 1;
      	public float moveLimit = .5f;
      	public float collisionMoveFactor = .01f;
      	public float addHeightWhenClicked = 0.0f;
      	public bool freezeRotationOnDrag = true;
      	public Camera cam  ;
      	private Rigidbody myRigidbody ;
      	private Transform myTransform  ;
      	private bool canMove = false;
      	private float yPos;
      	private bool gravitySetting ;
      	private bool freezeRotationSetting ;
      	private float sqrMoveLimit ;
      	private int collisionCount = 0;
      	private Transform camTransform ;
       
      	void Start () 
      	{
      	    myRigidbody = rigidbody;
      	    myTransform = transform;
      	    if (!cam) 
      		{
      	        cam = Camera.main;
      	    }
      	    if (!cam) 
      		{
      	        Debug.LogError("Can't find camera tagged MainCamera");
      	        return;
      	    }
      	    camTransform = cam.transform;
      	    sqrMoveLimit = moveLimit * moveLimit;   // Since we're using sqrMagnitude, which is faster than magnitude
      	}
       
      	void OnMouseDown () 
      	{
      	    canMove = true;
      	    myTransform.Translate(Vector3.up*addHeightWhenClicked);
      	    gravitySetting = myRigidbody.useGravity;
      	    freezeRotationSetting = myRigidbody.freezeRotation;
      	    myRigidbody.useGravity = false;
      	    myRigidbody.freezeRotation = freezeRotationOnDrag;
      	    yPos = myTransform.position.y;
      	}
       
      	void OnMouseUp () 
      	{
      	    canMove = false;
      	    myRigidbody.useGravity = gravitySetting;
      	    myRigidbody.freezeRotation = freezeRotationSetting;
      	    if (!myRigidbody.useGravity) 
      		{
      			Vector3 pos = myTransform.position;
      	        pos.y = yPos-addHeightWhenClicked;
      	        myTransform.position = pos;
      	    }
      	}
       
      	void OnCollisionEnter () 
      	{
      	    collisionCount++;
      	}
       
      	void OnCollisionExit () 
      	{
      	    collisionCount--;
      	}
       
      	void FixedUpdate () 
      	{
      	    if (!canMove)
      		{
      			return;
      		}
       
      	    myRigidbody.velocity = Vector3.zero;
      	    myRigidbody.angularVelocity = Vector3.zero;
       
      		Vector3 pos = myTransform.position;
      	    pos.y = yPos;
      	    myTransform.position = pos;
       
      	    Vector3 mousePos = Input.mousePosition;
      	    Vector3 move = cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, camTransform.position.y - myTransform.position.y)) - myTransform.position;
      	    move.y = 0.0f;
      	    if (collisionCount > normalCollisionCount)		
      		{
      	        move = move.normalized*collisionMoveFactor;
      	    }
      	    else if (move.sqrMagnitude > sqrMoveLimit) 
      		{
      	        move = move.normalized*moveLimit;
      	    }
       
      	    myRigidbody.MovePosition(myRigidbody.position + move);
      	}
      }

      کد جاوا اسکریپت:


      var normalCollisionCount = 1;
      var moveLimit = .5;
      var collisionMoveFactor = .01;
      var addHeightWhenClicked = 0.0;
      var freezeRotationOnDrag = true;
      var cam : Camera;
      private var myRigidbody : Rigidbody;
      private var myTransform : Transform;
      private var canMove = false;
      private var yPos : float;
      private var gravitySetting : boolean;
      private var freezeRotationSetting : boolean;
      private var sqrMoveLimit : float;
      private var collisionCount = 0;
      private var camTransform : Transform;
       
      function Start () {
          myRigidbody = rigidbody;
          myTransform = transform;
          if (!cam) {
              cam = Camera.main;
          }
          if (!cam) {
              Debug.LogError("Can't find camera tagged MainCamera");
              return;
          }
          camTransform = cam.transform;
          sqrMoveLimit = moveLimit * moveLimit;    // Since we're using sqrMagnitude, which is faster than magnitude
      }
       
      function OnMouseDown () {
          canMove = true;
          myTransform.Translate(Vector3.up*addHeightWhenClicked);
          gravitySetting = myRigidbody.useGravity;
          freezeRotationSetting = myRigidbody.freezeRotation;
          myRigidbody.useGravity = false;
          myRigidbody.freezeRotation = freezeRotationOnDrag;
          yPos = myTransform.position.y;
      }
       
      function OnMouseUp () {
          canMove = false;
          myRigidbody.useGravity = gravitySetting;
          myRigidbody.freezeRotation = freezeRotationSetting;
          if (!myRigidbody.useGravity) {
              myTransform.position.y = yPos-addHeightWhenClicked;
          }
      }
       
      function OnCollisionEnter () {
          collisionCount++;
      }
       
      function OnCollisionExit () {
          collisionCount--;
      }
       
      function FixedUpdate () {
          if (!canMove) return;
       
          myRigidbody.velocity = Vector3.zero;
          myRigidbody.angularVelocity = Vector3.zero;
          myTransform.position.y = yPos;
          var mousePos = Input.mousePosition;
          var move = cam.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y, camTransform.position.y - myTransform.position.y)) - myTransform.position;
          move.y = 0.0;
          if (collisionCount > normalCollisionCount) {
              move = move.normalized*collisionMoveFactor;
          }
          else if (move.sqrMagnitude > sqrMoveLimit) {
              move = move.normalized*moveLimit;
          }
       
          myRigidbody.MovePosition(myRigidbody.position + move);
      }
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۲ فروردين ۹۴ ، ۰۳:۴۹
      مدیرکل

      function OnCollisionEnter (myCollision Collision) {

           if(
      myCollision.gameObject.name == "Platform"){
            if(!
      myCollision.gameObject.rigidbody){
             
      myCollision.gameObject.AddComponent(Rigidbody);
            }
           }
          }
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۲ فروردين ۹۴ ، ۰۰:۲۱
      مدیرکل
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۱ فروردين ۹۴ ، ۰۴:۳۵
      مدیرکل


      برای تشخیص شیب از Raycasting() استفاده می شه.
      اگه میخوای شیب زمین رو تشخیص بدی پیشنهاد میشه از Colider.Raycast() به جای Physics.Raycast() استفاده کنی.
      کد نمونه(js) :

      نمی دونم تا چه حد کمکت می کنه ولی یه متنی رو برات ترجمه کردم امیدوارم از هیچی بهتر باشه.
      برای تشخیص شیب از Raycasting() استفاده می شه.
      اگه میخوای شیب زمین رو تشخیص بدی پیشنهاد میشه از Colider.Raycast() به جای Physics.Raycast() استفاده کنی.
      کد نمونه(js) :


      var hit RaycastHit;
      var 
      ray = new Ray(transform.positionVector3.down);
      if (
      someCollider.Raycast(rayhit)) {
      var 
      slope hit.normal;
      //Adjust character based on normal

      کد بالا یک سطح نرمال رو نسبت به شیب ،پس می ده . مثل عکس زیر
      http://s6.picofile.com/file/8180183634/surface_normal.jpg

      اسکریپت های زیادی برای تنظیم جهت چرخش ابجکت در راستای یک سطح نرمال وجود داره.
      مثال:

      var someCollider Collider;
      var 
      hit RaycastHit;
      var 
      ray = new Ray(transform.positionVector3.down);
      if (
      someCollider.Raycast(rayhit1000)) {
      transform.rotation Quaternion.FromToRotation(transform.uphit.normal) * transform.rotation;

      اسکریپت رو بداز روی player.
      همچنین در inspector، زمین(terrain) شیب دار خودتو با ماوس Drag کن(بگیر) و بنداز روی متغیر someCollider در کادر خصوصیات inspector.
      به player هم می تونی چند تا کالیدر بدی مثل برخورد کننده ی کپسولی(capsule collider).
      برای جلوگیری از فرو رفتن ابجکت هم می تونی چرخش در جهت بردار انتخابی رو freeze کنی و یا اینکه می تونی مقدار پارامتر Drag در کامپوننت rigidbody رو که به ابجکتت دادی زیاد کنی.
      منبع :
      http://answers.unity3d.com/questions/509...ction.html


      ------------------------

      حرکت یک گیم آبجکت روی سطح شیب دار :

      http://s4.picofile.com/file/8180221934/gif_walker_perimeter.gif

      منبع: http://www.asteroidbase.com/devlog/7-lea...w-to-walk/
      مترجم : sajjad3011

      یک روش آن است که از raycast برای چک کردن collider زیر player (یا شی در حال حرکت روی سطح شیب دار که در اصطلاح به آن Walker هم می گوییم) استفاده کنیم.اما Walker در حین حرکت به اطراف و با توجه به تغییرات باید مثل سنجاب نگاه کند.(منظورش زاویه چرخش هست).در عوض ما دو اشعه(ray) را پرتاب می کنیم.هر کدام برای یک طرف Walker:

      bool doubleRaycastDown(TerrainMovementRayProperties movementRay, float rayLength,
              out RaycastHit leftHitInfo, out RaycastHit rightHitInfo)
      {
          Vector3 transformUp = transform.up;
          Vector3 transformRight = transform.right;
          Ray leftRay = new Ray(transform.position + movementRay.originOffsetY * transformUp
              + movementRay.distanceFromCenter * transformRight, -transformUp);
          Ray rightRay = new Ray(transform.position + movementRay.originOffsetY * transformUp
              – movementRay.distanceFromCenter * transformRight, -transformUp);
      
          return Physics.Raycast(leftRay, out leftHitInfo, rayLength, DefaultTerrainLayerMask)
              && Physics.Raycast(rightRay, out rightHitInfo, rayLength, DefaultTerrainLayerMask);
      }

      اگر هر دو ray به یک کالیدر با لایه ی مناسب برخورد کرد،ما میانگین position و بردارهای normal نتیجه شده ی ابجکت های RaycastHit را بکار برده و از آنها به ترتیب برای تنظیم و موقعیت دهی Walker استفاده خواهیم کرد.این کار آسان است:

      void positionOnTerrain(RaycastHit leftHitInfo, RaycastHit rightHitInfo,
              float maxRotationDegrees, float positionOffsetY)
      {
          Vector3 averageNormal = (leftHitInfo.normal + rightHitInfo.normal) / 2;
          Vector3 averagePoint = (leftHitInfo.point + rightHitInfo.point) / 2;
      
          Quaternion targetRotation = Quaternion.FromToRotation(Vector3.up, averageNormal);
          Quaternion finalRotation = Quaternion.RotateTowards(transform.rotation, targetRotation,
              maxRotationDegrees);
          transform.rotation = Quaternion.Euler(0, 0, finalRotation.eulerAngles.z);
      
          transform.position = averagePoint + transform.up * positionOffsetY;
      }

      به Walker اجازه دهید تا بچرخد .شاید در هنگام مواجهه با چاله ها و شکاف ها،در هر فریم کمی حرکت تند و عصبی داشته باشد.برای رفع این مشکل کافیست میزان چرخش را با استفاده از Quaternion.RotateTowards محدود نماییم.

      در این روش،برای اینکه یک حرکت واقع گرایانه تری داشته باشیم باید کمی بیشتر راه رویم.همچنین Walker تمایل به گیر کردن در انواع خاصی از چاله ها و گودی ها دارد.برای غلبه بر این مشکل ما یک اشعه ی افقی کوتاه را در جهت حرکت،اضافه کردیم که تا حد لبه ی بدن کاراکتر بسط می یابد.اگر این ray با هر قطعه از زمین برخورد(collide) کند،اشعه ی رو به پایین(downward ray)آن سمت از Walker را باطل می کند.

      if(rigidbody.velocity.sqrMagnitude > 0)
      {
          //if moving left
          if(MathUtilities.VectorSimilarity(rigidbody.velocity, selfTransform.right) > 0)
          {
              RaycastHit overrideLeftHitInfo;
              Ray overrideLeftRay = new Ray(transform.position
                  + horizontalRayProperties.originOffsetY * selfTransform.up, selfTransform.right);
              if(Physics.Raycast(overrideLeftRay, out overrideLeftHitInfo,
                  horizontalRayProperties.attachedRayLength, DefaultTerrainLayerMask))
              {
                  leftHitInfo = overrideLeftHitInfo;
              }
          }
          //if moving right
          else
          {
              RaycastHit overrideRightHitInfo;
              Ray overrideRightRay = new Ray(transform.position
                  + horizontalRayProperties.originOffsetY * selfTransform.up, -selfTransform.right);
              if(Physics.Raycast(overrideRightRay, out overrideRightHitInfo,
                  horizontalRayProperties.attachedRayLength, DefaultTerrainLayerMask))
              {
                  rightHitInfo = overrideRightHitInfo;
              }
          }
      }


      در شکل زیر نحوه ی علکرد این سیستم را می بینید.

      خطوط زرد و قرمز اشعه های پرتابی از طرف Walker را نشان می دهند.

      خطوط بنفش و سبز،نرمال های تولید شده از ray های برخوردی با زمین را نشان می دهند.

      خط آبی فیروزه ای ،میانگین آن نرمال ها،از نقطه ی وسط Walker در برخورد با زمین است.

      اشعه ی باطل کردن افقی(horizontal override ray) در شکل نشان داده نشده.

      دشمن کهکشانی در حال حرکت رو ترکیبی از collider ها مثل sphere collider و capsule collider می باشد اما این سیستم مثل همان mesh collider به خوبی کار می کند.

      http://s4.picofile.com/file/8180219642/gif_walker_rays.gif

      ۱ نظر موافقین ۰ مخالفین ۰ ۱۲ فروردين ۹۴ ، ۱۹:۳۱
      مدیرکل

      gameover.blog.ir


      #یونیتی 

      آموزش بردار نرمال در یونیتی /کاربرد متد نرمالایز در یونیتی/کاربرد normalize/کاربرد تابع normalize در یونیتی/حرکت به سمت مقصد توسط بردار نرمال(بردار عمود بر هدف یا بردار حرکت مستقیم به سمت هدف


      تابع Lerp از کلاس Vector3 :


      در شکل به وضوح می بینید اگر ما فاصله تا هدف رو 5 قسمت کنیم تابع نرمال xyz ای میده که اگر جمع کنیم با پوز فعلی، یک واحد به سمت هدف حرکت انجام میشه.


      🔶 #یونیتی


      نکته: بی نرمالایز هم به سمت هدف حرکت انجام میشه ولی ابتدا سرعت زیاد و وقتی به هدف نزدیک میشیم،سرعت کمه،چون تفاضل فاصله ها کم شده در speed ضرب کنیم سرعت ثابت نیست،ولی با نرمال سرعت همیشه ثابت هست. لرزش هم داریم در انتها.




      🔶🔶🔶نکته ی بعدی : متد لرپ یا تابع Lerp در حرکت نرم ،نسبت به روش normalize بهتر و جدیدتر هست. اما مقایسه ما از این جهت هست که قدرت تابع لرپ تکمیل تر از نرمالایز هست. یعنی لرپ امکانات بیشتری هم داره ولی اینکه بگیم nomalize منسوخ هست نه اینکار هم نمی کنیم. فعلا اون توی جایگاه خودش بمونه ولی فقط قصد ما اثبات قدرت لرپ بود. همین(بیسواد)


      مثال ساده :


      Public Transform target;

      void Update(){

      transform.position = Vector3.Lerp(transform.position, target.position, speed  * Time.deltaTime);

      }




      ادامه (کاربرد تابع Lerp)

      حرکت به اندازه ای که تابه لرپ نسبت به ضریب 0.1f  از مبدا t1 به مقصد t2 محاسبه می کنه.
      نمی تونیم بگیم 0.1f قدر. چون کار تابع لرپ اینه که اگه پارامتر سوم 1 باشه پوزیشن t2  و اگه 0 باشه پوزیشن t1 و اگه 0.5 باشه پوزیشن بین  t1 و t2 رو برگشت می ده.





      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class NORMAL : MonoBehaviour {

          public Transform t1, t2;
          float speed = 0.01f;
          void Update()
          {
              if (Input.GetKeyUp(KeyCode.A))
              {

              t1.position = Vector3.Lerp(t1.position, t2.position, 0.1f);

              }

          }
      }

      در این مثال با فشردن کلید A ، جسم مبدا به سمت مقصد حرکت می کنه. 
      هر بار  به اندازه ای که خود تابع لرپ نسبت به ضریب 0.1f محاسبه می کنه.(دقت کنید نگفتم به طول یک، چون طول یک رو تابع نرمالایز می داد و جلو تر روش پیاده سازی نرمالایز رو با لرپ می گم )

      اسکریپت رو بندازید روی هر جسمی که دوست دارید .

      سپس گیم ابجکت اول  و دوم رو به ترتیب درگ کنید روی متغیر t1 و t2.

      اجرا بگیرید. جسم مقصد رو جابجا کنید تا جسم مبدا بیاد دنبالش.






      پیاده سازی normalized با استفاده از lerp/پیاده سازی متد نرمالایز با استفاده از متد لرپ/ساخت normalized با استفاده از Lerp/شبیه سازی تابع/متد normalized با استفاده از متد/تابع Lerp


      'تمام محاسبه و کد توسط گیم اور انجام شده و کپی از جایی نیست.

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class NORMAL : MonoBehaviour {

          public Vector3 t1, t2;
          float speed = 0.01f;
          void Start()
          {
              t1 = new Vector3(0, 0, 0);
              t2 = new Vector3(1, 2, 2);
          
          }
          void Update()
          {
              if (Input.GetKeyUp(KeyCode.A))
              {
                  Debug.Log(Vector3.Lerp(t1, t2, 1.0f/Vector3.Distance(t1,t2)));
                  Debug.Log((t2-t1).normalized);
              Debug.Log("Thank u bisavad ma behet eftekhar mikonim");
              }

          }
      }

      دقت کنید که خروجی هر دو، برداری هست که اگر با بردار اول جمع بشه به اندازه ی یک واحد به سمت بردار دوم حرکت میشه کرد.



      تابع لرپ/متد لرپ/تابع Lerp/متد Lerp  از کلاس Vector3

      شکل کلی


      public static Vector3 Lerp(Vector3 a, Vector3 b, float t);


      خروجی:
      اگر t=0 بردار a
      اگر t=1 بردار b
      اگر t=0.5  بردار بین a,b 

      در غیر اینصورت برداری روی فاصله ی بین بردار a و b
      بر گشت داده میشه.

      اگه  بخوایم  تابع normalized رو با Lerp پیاده سازی کنیم باید عدد 1 رو تقسیم به فاصله ی بین دو بردار کنیم،چون یک قسمت از این فاصله رو باید بدیم تا بردار حرکت به ما تحویل داده بشه.

      دوستان این نکات رو بنویسید توی دفترتون. چون هر جایی گفته نشده.



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

      slerp هم مثل lerp هست. شما lerp رو درک کنید اونم یادمی گیرید.

      یه اسکریپت cs با کد زیر ایجاد کنید :

      //lerp.cs
      using UnityEngine;
      using System
      public class LightLerp: MonoBehaviour
      {
      private Vector3 newPosition;
      void Awake()
      {
      newPosition = transform.position;
      }
      void Update()
      {
      PositionChanging();
      }
      
      PositionChanging()
      {
      Vector3 positionA = new Vector3(-5,3,0);
      Vector3 positionB = new Vector3(5,3,0);
      
      if(Input.GetKeyDown(KeyCode.Q))
      newPosition = positionA;
      
      if(Input.GetKeyDown(KeyCode.E))
      newPosition = positionB;
      
      transform.posision=newPosision;
      }
      }

      اگه کد اشتباه داشت برطرف کنید چون همشون رو از روی فیلم سایت اصلی یونیتی تایپ کردم.
      یه نور نقطه ای بذارید روی صحنه(point light) . شدت نور رو کمی زیاد کنید(خصوصیت Identsity) تا روی plane به چشم بیاد. 
      اسکریپت فوق رو بدید به نور(بکشید روش رها کنید).
      اجرا کنید .
      طبق اسکریپت اگه Q بزنیم نور به موقع positionA میره و اگه E بزنیم به نقطه ی positionB .
      شما اینو اجرا کنید می تونید ببینید چی می گم.( نور جابجا میشه )

      اما اصلا زیبایی خاصی نداره و فقط عمل پرش رو انجام میده و پیوسته نیست و گسسته هست.

      برای اینکه نور با یک سرعت تعریف شده از نقطه ی A به نقطه ی B بره از تابع Lerp استفاده می کنیم. 

      مثال شکل کلی استفاده از Lerp :
      transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);

      تابع Lerp سه تا پارامتر می گیره :

      From : از 
      To: به
      t : من بهش می گم time و شما هم بگید time. 
      (با این که t مخفف چی هست و چی نیست یا اصلا غلط هست یا درست هم کاری نداشته باشید بذارید ما درس خودمون رو بدیم و اگه زیبا نبود بیخیالش بشید. اینم بگم خودم مقالات سایت رفرنس و سایت های ایرانی و خارجی زیادی رو مطالعه می کنم ولی مهم نیست همون time اسم گذاری کنید.)

      به جای t مقدار smooth * Time.deltaTime رو بدید و به جای From و To هم متغیری از نوع بردار سه بعدی (در درس ما A و B) رو بدید.

      smooth هم در بخش public(بالای برنامه) تعریف می کنید از نوع float(اعشاری).

      و بعد از نسنب دادن اسکریپت به نور نقطه ای، خصوصیت smooth رو با مقدار 1 عدد بدید(اگه بیشترش کنید روان بودن و سرعت حرکت بیشتر میشه. این smooth داره در Time.deltaTime ضرب میشه و طبیعی هست دیگه هرچی بیشتر باشه سرعت زمانی حرکت نور بالا میره)

      وقتی پروژه رو اجرا کنید با فشردن کلید Q و E نور به آرومی بین نقاط سه بعدی A و B تغییر موقعیت میده.

      تا شما یه چایی بخورید من یاد میدم که Lerp چه کاربردهای دیگه ای داره و کجاها میشه ازش استفاده کرد.

      سه مثال کاربردی از روش استفاده از تابع Lerp :

      معمولا گیم ابجکت های مختلفی هستند که از تابع Lerp استفاده می کنند.

      سه حالت رو مثال می زنم:

      حالت اول :
      کد:

      transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);

      کد بالا رو شرح دادم.پس بیخیالش.

      حالت دوم :
      کد:
      light.intensity = Mathf.Lerp(light.intensity, newIntensity, smooth * Time.deltaTime);

      این کد باعث میشه شدت نور از حالت فعلی به حالت newIntensity بره و طبق دستوراتی که اسکریپتی که بهتون میدم میگم چیکار کنید.

      حالت سوم :
      کد:

      light.color = Color.Lerp(light.color, newColour, smooth * Time.deltaTime);

      این کد برای تغییر رنگ نور از رنگ فعلی به رنگ جدید که در متغیر newColour تعریف شده بکار می ره. تیو اسکریپت که در ادامه میارم یادتون میدم ببینید چقدر زیباست و یاد گرفتنش از روی راهنمایی من چه قدر خوبه.
      -
      این کلیپ بی کیفیت که من ساختم رو ببینید تا قدرت Lerp رو درک کنید :
      http://s5.picofile.com/file/8153633500/clip_lerp_func_unity3d_sajjad3011.zip.html

      -
      حالا روش ساخت :

      یه پروژه 3d ایجاد کنید با این اجزا : main Camera ، plane و Point Light

      اسکریپت js زیر رو بدید به نور نقطه ای (point Light):

      #pragma strict
      
      public var smooth : float;
      
      private var newPosition : Vector3;
      private var newIntensity : float;
      private var newColour : Color;
      
      
      function Awake ()
      {
          newPosition = transform.position;
          newIntensity = light.intensity;
          newColour = light.color;
      }
      
      
      function Update ()
      {
          PositionChanging();
          IntensityChanging();
          ColourChanging();
      }
      
      
      function PositionChanging ()
      {
          var positionA : Vector3 = new Vector3(-5, 3, 0);
          var positionB : Vector3 = new Vector3(5, 3, 0);
          
          if(Input.GetKeyDown(KeyCode.Q))
              newPosition = positionA;
          if(Input.GetKeyDown(KeyCode.E))
              newPosition = positionB;
          
          transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);
      }
      
      
      function IntensityChanging ()
      {
          var intensityA : float = 0.5f;
          var intensityB : float = 5f;
          
          if(Input.GetKeyDown(KeyCode.A))
              newIntensity = intensityA;
          if(Input.GetKeyDown(KeyCode.D))
              newIntensity = intensityB;
          
          light.intensity = Mathf.Lerp(light.intensity, newIntensity, smooth * Time.deltaTime);
      }
      
      
      function ColourChanging ()
      {
          var colourA : Color = Color.red;
          var colourB : Color = Color.green;
          
          if(Input.GetKeyDown(KeyCode.Z))
              newColour = colourA;
          if(Input.GetKeyDown(KeyCode.C))
              newColour = colourB;
          
          light.color = Color.Lerp(light.color, newColour, smooth * Time.deltaTime);
      }

      بعد از افزودن اسکریپت فوق به نور نقطه ای، نور رو انتخاب کنید و در پنجره ی خصوصیات یا inspector پارامتر Smooth رو بدید 1 یا 2 (یه عدد غیر صفر معمولا از 1 به بالا بدید که قبلا توضیحش دادم)

      اجرا کنید .
      با کلید های زیر بازی کنید:
      Q و E
      A و D
      Z و C
      --
      خروجی :
      http://s5.picofile.com/file/8153635742/lerp_noor.jpg
      می بینید چقدر زیباست ؟ دقیقا عین چشماتون happy
      همین الان تست کنید و ببینید چه قدر قشنگه کار با یونیتی.
      کاربرد این کد در هوش مصنوعی هم هست و دستوری به اسم (Quaternion.Slerp(From,To,Time داریم که برای درکش فقط کافیه همین Lerp ای که بالا توضیح دادم رو تست کنید و بعدش Slerp همون پارامترها رو می گیره که یه جایی به دردتون میخوره توضیحات من.
      ۳ نظر موافقین ۰ مخالفین ۰ ۲۶ اسفند ۹۳ ، ۰۴:۱۰
      مدیرکل
      // Get the latest webcam shot from outside "Friday's" in Times Square
      var url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";
      function Start () {
      	 // Start a download of the given URL
      	var www : WWW = new WWW (url);

      // Wait for download to complete yield www;

      // assign texture renderer.material.mainTexture = www.texture; }
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ اسفند ۹۳ ، ۱۶:۰۵
      مدیرکل

      newObject.gameObject.addcompenet("scriptName")

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ اسفند ۹۳ ، ۱۵:۲۹
      مدیرکل
      gameover.blog.ir
      using UnityEngine;
      using System.Collections;
      
      public class PlayerHealth : MonoBehaviour {
          public int maxHealth = 100;
          public int curHealth = 100;
          
          public float healthBarLength;
      
      
          void Start () {
          healthBarLength = Screen.width / 2;
          }
          
      
          void Update () {
          AddjustCurrentHealth(0);
              
          }
          
          
          void OnGUI(){
          GUI.Box(new Rect(10, 10, healthBarLength, 20), curHealth + "/" + maxHealth);    
          }
          
         
          public void AddjustCurrentHealth(int adj) {
            curHealth += adj;    
              
              if(curHealth < 0)
                  curHealth = 0;
              
              if(curHealth > maxHealth)
                  curHealth = maxHealth;
              
              if(maxHealth < 1)
                  maxHealth = 1;
              
              healthBarLength = (Screen.width / 2) * (curHealth / (float)maxHealth);
          }
      }

      نکته:
      در سیستم جدید مستقیم می تونید ui | text بذارید یا ui | image بذارید و دیگه نیاز به این نیست که مثلا بیاید از Rect و کد نویسی زیاد پیچیده استفاده کنید. برای یادگیری این موارد کتاب ui ترجمه sajjad3011 رو بخرید که در بالای وبلاگ معرفی شده.
      http://gameover.blog.ir/1395/03/27/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%DB%8C%D9%88-%D8%A2%DB%8C-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-5-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D8%B4%D8%AF-%DA%A9%D8%AA%D8%A7%D8%A8-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-ui-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ اسفند ۹۳ ، ۰۶:۳۱
      مدیرکل

      زبان کد : سیشارپ

      این کد برای بررسی فاصله ی دشمن تا player بکار می ره و سپس با تابع slerp حرکت آرام چرخش و رو کردن به سمت player و حرکت به سمتش:

      (البته با تنظیم متغیرها می تونید انیمیشن دویدن رو توسط کامپوننت animator  اجرا کنید و بعد از رسیدن به هدفبه حالت idle سوئیچ کنید.)

      using UnityEngine;
      using System.Collections;

      public class 
      EnemyAI MonoBehaviour {
          public 
      Transform target;
          public 
      int moveSpeed;
          public 
      int rotationSpeed;
          public 
      int maxdistance;
          
          private 
      Transform myTransform;
          
          
      void Awake(){
              
      myTransform transform;
          }


          
      void Start () {
              
      GameObject go GameObject.FindGameObjectWithTag("Player");
              
              
      target go.transform;
          
              
      maxdistance 2;
          }
          

          
      void Update () {
              
      Debug.DrawLine(target.positionmyTransform.positionColor.red); 
              

              
      myTransform.Rotation Quaternion.Slerp(myTransform.RotationQuaternion.LookRotation(target.position myTransform.position), rotationSpeed Time.deltaTime);
              
              if(
      Vector3.Distance(target.positionmyTransform.position) > maxdistance){
              
      //Move towards target
              
      myTransform.position += myTransform.forward moveSpeed Time.deltaTime;
          
              }
          }
              

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۵ اسفند ۹۳ ، ۰۶:۲۸
      مدیرکل
      private void notRenderer()
      {
      if(notMat)
      {
      
      Destroy(GetComponent<ParticleSystem>());
      Material mat = (Material) FindObjectOfType(typeof(Material));
      
      if (mat)
      Debug.Log("Material object found: " + mat.name);
      else
      Debug.Log("No Material object could be found");
      
      }
      
      
      }
      ۰ نظر موافقین ۰ مخالفین ۰ ۲۳ اسفند ۹۳ ، ۲۰:۲۴
      مدیرکل

      دوربین اصلی را انتخاب کنید.
      مسیر assests->importt package->image Efect pro را طی کنید.
      مسیر component->image effects->blur و زیر شاخه هایش ا امتحان کنید.
      بازی رو اجرا کنید تا حالت بلور یا تار شدن دوربین را ببینید. تنظیمات دیگر را در inspector(کادر خصوصیات سمت راست) می تونید انجام بدید.

      http://s4.picofile.com/file/8176846434/assset_imageEffectPro_package.jpg

      اجرا :

      http://s4.picofile.com/file/8176847676/blur_effect.jpg

      البته برای کج و معوج کردن هم بکار میره که میتونید مسیر component->image effects->Displacement->Vortex یا ... رو به دوربین بدید:

      http://s6.picofile.com/file/8176857800/diplacement_vortex.jpg

      -

      با تشکر از سجاد

      ۱ نظر موافقین ۰ مخالفین ۰ ۲۳ اسفند ۹۳ ، ۰۹:۲۳
      مدیرکل

      enum یعنی داده های شمارشی.... مثلا یک متغیر می گیری می دی یک بعدش هر اسمی بعدش میدی مقدارش یکی اضاف میشه.
      مثلا ali=1 و اگه بدی reza مقدار reza خودکار میشه 2 و الی آخر... هر چی شروع بدی بعدی ها یکی یکی زیاد میشه و اگه مثلا وسط کار یکی اضافه کنی با مقدار دلخواه و بعدی رو بی مقدار بدی یکی بعد اون مقداری که همونجا تعیین کردی اضاف می کنه و الی آخر

      از این نوع داده برای تعریف متغیرها با مقادیری تعریف شده توسط خودمان استفاده می کنیم.
      مثال :
      زبان js

      کد:
      #pragma strict
      
      enum Direction{North, East, South, West};
      function Start ()
      {
          var myDirection : Direction;
          
          myDirection = Direction.North;
      }
      
      function ReverseDirection (dir : Direction) : Direction
      {
          if(dir == Direction.North)
              dir = Direction.South;
          else if(dir == Direction.South)
              dir = Direction.North;
          else if(dir == Direction.East)
              dir = Direction.West;
          else if(dir == Direction.West)
              dir = Direction.East;
          
          return dir;    
      }
      مثال :

      کد:
      num DoorStates {open,closed};
      var doorState :DoorStates;
      
      function Awake()
      {
      doorState =DoorStates.closed;
      }
      
      
      
      
      function OnTriggerEnter (triger : Collider)
      {
          
          if ((triger.gameObject.tag == "Player_A")&&(doorState==DoorStates.closed))
          
              {
                  doorState=DoorStates.open;
                  GameObject.FindWithTag("Door_L").animation.Play("Door_Anim_A_Left_Open");    
                  GameObject.FindWithTag("Door_R").animation.Play("Door_Anim_A_Right_Open");
              }
          
      
      
      }
      
      function OnTriggerExit (triger : Collider)
      
      {
          
          if ((triger.gameObject.tag == "Player_A")&&(doorState==DoorStates.open))
          
              {
                  doorState=DoorStates.closed;
                  GameObject.FindWithTag("Door_L").animation.Play("Door_Anim_A_Left_Close");    
                  GameObject.FindWithTag("Door_R").animation.Play("Door_Anim_A_Right_Close");
              }
          
      }
      
      منبع:
      http://unity3d.com/learn/tutorials/modules/beginner/scripting/enumerations

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۱۵:۵۶
      مدیرکل

      برای تغییر سلاح یا تعویض اسلحه یا قطعات یا بدنه ی ماشین یا سوئیچ یا تغییر لباس یا فعال و غیرفعال کردن آبجکت های دلخواه در صحنه چه کنیم؟

      برای اینکار از تابع setActive استفاده می کنیم. مثلا اسکریپت زیر رو ببینید. با فشردن کلید 1 و 2و3 روی numpad و یا 1و2و3 زیر کلید های تابعی(fuctional keys) بین قطعات تنظیم شده در پارامترهای ghete1 و ghete2 و ghete3 سوئیچ می کنیم و در هر لحظه یک آیتم را فعال خواهیم کرد.

      کد csharp:
      //setActive.Cs
      using UnityEngine;
      using System.Collections;
      public class setActive : MonoBehaviour {
          public GameObject ghete1;
          public GameObject ghete2;
          public GameObject ghete3;
          // Use this for initialization
          //edit:Sajjad3011
          void Start () {
              ghete1.gameObject.SetActive(true);
              ghete2.gameObject.SetActive(false);
              ghete3.gameObject.SetActive(false);
          }
          // Update is called once per frame
          void Update(){
              if(Input.GetKeyDown("1") || Input.GetKey (KeyCode.Keypad1)){
                  //switch part1
                  killAll();
                  ghete1.gameObject.SetActive(true);
              }
              if(Input.GetKeyDown("2") || Input.GetKey (KeyCode.Keypad2)){
                  //switch part2
                  killAll();
                  ghete2.gameObject.SetActive(true);
              }
              if(Input.GetKeyDown("3") || Input.GetKey (KeyCode.Keypad3)){
                  //switch part3
                  killAll();
                  ghete3.gameObject.SetActive(true);
              }
          }
          void killAll(){
              ghete1.gameObject.SetActive(false);
              ghete2.gameObject.SetActive(false);
              ghete3.gameObject.SetActive(false);
          }
      } 
      به اسکریپت دقت کنید.زبان آن سیشارپ بوده و با اندکی تغییر می توانید آن را به js تغییر دهید. تابع killAll رو هر بار صدا می زنیم تا تمام آیتم ها رو غیر فعال کنیم و سپس یکی از قطعات رو با نوشتن اسمش و سپس تابع setActive از کلاس gameObject فعال می کنیم.
      دقت کنید که سه تا گیم آبجکت به عنوان قطعه ی 1 و 2 و 3 باید توی صحنه بذارید و همچنین یک گیم آبجکت تهی(empty game object) ایجاد کنید و اسکریپت رو بندازید روش. سپس قطعات رو بندازید روی پارامترهاش توی inspector تا توی آرایه تنظیم بشه.winking
      نکته ی مهم : دقت کنید که موقعت(position) و زاویه ی چرخش(rotation) و مقیاس(scale) تمام قطعات یکی باشه تا بتونید به راحتی قطعات ماشین رو تنظیم کنید و بزرگ بودن یا قطعات خودرو تو هم نرن. برای تغییر سلاح یا تغییر اسلحه اینکار مهم نیستhappy

      منبع مطالعه شده : http://answers.unity3d.com/questions/606...cript.html

      با تشکر از سجاد از پرومیکرز

      ۲ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۱۵:۴۳
      مدیرکل
      ۲ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۱۵:۴۰
      مدیرکل

      سعی کنید از طبیعت الهام بگیرید و روش های جدید رو بیاموزید.
      مثال : به این تصویر shading بر حسب تکنیک های فیزیک در یونیتی 5 نگاهی بیندازید :

      http://s5.picofile.com/file/8153024750/shot1.jpg

      http://s5.picofile.com/file/8153023692/shot2.jpg


      در یونیتی 5 می تونید با ادغام PBS و Enlighten GI نورهای خود را در تمام صحنه به سرعت ایجاد کنید.

      البته من خودم هنوز از یونیتی 4.5 استفاده می کنم چون ورژن 5 هنوز در حال آزمایش خطایابی beta هست.

      به تحته ها نگاه کنید. برچستگی ها رو می بینید؟ چیز خاصی نیستن. با نرمال مپ و کمی zbrush ترکیب شدن. نرمال مپ هم چیزی نیست و اموزش هاش توی انجمن هست.

      ۰ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۱۵:۳۷
      مدیرکل