گزینه ی interactable رو غیر فعال کنید.(البته قبلش دستگیره یا handle رو حذف کنید)
منبع:gameover.blog.ir
public Sprite spr1; GetComponent<Image>().sprite =spr1;
منبع:gameover.blog.ir
توضیح:
اغلب اوقات ما یک مدل رو می سازیم و یادمون میره بهش جزئیات بدیم.
به سادگی می تونید با استفاده از عکس هایی که با گوشی می گیرید یا عکس های موجود و کمی فتوشاپ پیاز داغشو زیاد کنید.
سوالی بود از نحوه ی uv map یا غیره بپرسید.
bool forward = true; private Animator anim; void Start () { anim = GetComponent<Animator>(); } void Update () { if (Input.GetMouseButtonDown (0)) { if (forward){ anim.Play("firstAnimation"); } else { anim.Play("secondAnimation_R"); } forward = !forward; } }
gameObject1.animation["اسم انمیشن"].speed = -1; gameObject1.animation["اسم انیمیشن"].time = gameObject1.animation["اسم انیمیشن"].length; gameObject1.animation.Play("اسم انیمیشن");
منبع:gameover.blog.ir
داده های نوع static همیشه آخرین مقداری رو که بهشون می دیم تو کل برنامه یا تو کل بازی حفظ می کنن و دیگه صفر نمیشه مگه اینکه خودمون مقدارشو صفر یا تغییر بدیم.
اگر یک متغیر final (نهایی) یک مرجع به یک ابجکت را نگه دارد،آنگاه وضعیت
آبجکت ممکن است بوسیله ی عملیاتی روی ابجکت تغییر کند،اما متغیر همیشه به
همان ابجکت رجوع می کند.این همچنین با آرایه ها بکار می رود.زیرا آرایه ها
اشیا هستند.
اگر یک متغیر final یک رجوع به یک آرایه داشته باشد،آنگاه اجزای آرایه
ممکن است است به وسیله ی عملیات روی آرایه تغییر کنند.،اما متغیر همیشه به
همان آرایه مراجعه خواهد کرد.
کلاس های final :
یک کلاس نهایی، نمی تواند subclass شود.این حالت باعث ایجاد امنیت و مزایای
موثری می شود.بنابراین تعدادی از کلاس های استانارد Java نهایی(final)
هستند.مثل java.lang.System و java.lang.String . همه ی متدها در کلاس
فاینال، final ضمنی هستند.
مثال :
public final class MyFinalClass {...} public class ThisIsWrong extends MyFinalClass {...} // forbidden
sub class های محود اغلب به کلاس های "soft final" نامیده می شوند.
متدهای final:
یک method فاینال نمی تواند به وسیله ی sub class ها ovveride یا hidden
شود.این به دلیل جلوگیری از رفتار غیر منتظره ی یک subclass (یا کلاس
فرزند) برای تغییر متدی بکار می رود که ممکن است برای function یا استکام
کلاس حیاتی باشد.
مثال:
public class Base { public void m1() {...} public final void m2() {...} public static void m3() {...} public static final void m4() {...} } public class Derived extends Base { public void m1() {...} // Ok, overriding Base#m1() public void m2() {...} // forbidden public static void m3() {...} // OK, hiding Base#m3() public static void m4() {...} // forbidden }یک تصور غلط عمومی این است که تعریف یک کلاس یا متد به عنوان کلاس final با اجازه به کامپایلر بهره وری را افزایش می دهد تا به طور مستقیم متد را در جاییکه فراخوانی یا call می شود درج کند.(اینجا رو بخونید: https://en.wikipedia.org/wiki/Inline_expansion) اما از آنجا که متد در لحظه ی اجرا لود می شود، کامپایلر ها قادر به اجرای این نیستند. فقط محیط اجرایی و کامپایلر JIT جی آی تی (https://en.wikipedia.org/wiki/Just-in-time_compilation) دقیقا می داند کدام کلاس لود شده است و فقط آنها می توانند در مورد زمان inline بودن تصمیم بگیرند خواه متد ،نهایی(final) باشد یا نباشد.
public class Sphere { // pi is a universal constant, about as constant as anything can be. public static final double PI = 3.141592653589793; public final double radius; public final double xPos; public final double yPos; public final double zPos; Sphere(double x, double y, double z, double r) { radius = r; xPos = x; yPos = y; zPos = z; } [...] }هر تلاشی برای اختصاص مجدد شعاع، xPos،yPos، یا zPos منجر به یک خطای کامپایلری خواهد شد.در واقع حتی اگر constructor(سازنده ی کلاس) یک متغیر نهایی را تنظیم نکند تلاش برای تنظیم آن در خارج از سازنده ی کلاس منجر به خطای کامپایلری می شود.
public final Position pos;که pos شامل pos.x و pos.y و pos.z هست. pos نمی تونه اخصاص داده بشه اما سه خصوصیت اون می تونن مقداردهی بشن مگر اینکه اونا خودشون نهایی باشن.مثل تغییرناپذیری کامل( https://en.wikipedia.org/wiki/Immutability) استفاده از مزایای زیادی داره مخصوصا در بهینه سازی(optimization) . برای نمونه، Sphere احتمالا یک حجم بازگشتی (function returning its volume) خواهد داشت. اگه بدونیم شعاع ثابت هست به ما اجازه می ده تا حجم محاسبه شده رو در حافظه ذخیره کنیم. اگر ما Spheres های نسبتا کمی داشته باشیم و ما اغلب حجم آنها را نیاز داریم افزایش عملکرد ممکن است قابل توجه باشد. ساخت یک Sphere final به توسعه دهندگان و کامپایلرها اطلاع می دهد که انواع بهینه سازی در تمام کدی که از Sphere ها استفاده می کنند ممکن است. هر چند به نظر میرسد که اصل final نقض شده است عبارت زیر قانونی است :
for (final SomeObject obj : someList) { // do something with obj }از آنجا که متغیر obj با هر بار تکرار در حلقه از حوزه خارج می شود واقعا با هر تکرار مجددا تعریف می شود.
کمک در فهم پلاگین jar عدد برای یونیتی
این سایت عدد اعصابمو به هم ریخته. چون اصلا داکیومنت هاش
کامل و واضح نیست. مشکل اصلی اینه که ما جاوا کار حرفه ای نیستیم و
داکیومنت یونیتی هم کامل نیست و خیلی ترو تمیز درس ندادن.ما هم بچه
شهرستانیم امکانات رفتن به کلاس های حرفه ای برامون فراهم نبود.لطفا اگه
کسی می دونه راهنمایی کنه.
من فایل adad-client-3.2.jar سایت عدد که واسه تبلیغات برای یونیتی نوشته بودن رو بیرون ریختم.
اما باید کمک بدید ببینیم ازش چیزی می تونیم سر در بیاریم یا نه.
این سورسی که از فایل jar کشیدم بیرون واسه تمام فایلهای جاواشه :
http://s3.picofile.com/file/8230624650/adad_client_3_2_jar_source_from_JADX.zip.html
لطفا دانلود کنید و ببینید سر در میارید یا نه.
یه بخش token هم داره.
ببینید اینو میشه دستکاری کرد و با روشی دیگه یک پلاگین تبلیغات دیگه ساخت ؟
منبع:gameover.blog.ir
یک گیم ابجکت روی صحنه بذارید.
یک اسکریپت بسازید مثل این و بدید به گیم ابجکت.
//test.cs
//Author:Sajjad3011
//Drag ui->text using Drag Event
using UnityEngine; using System.Collections; using UnityEngine.UI; public class test : MonoBehaviour { public Text text1; public void funcDrag(){ transform.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0); } }
کامپوننت Event trigger بدید بهش.
روی Add new event بزنید تا یک رویداد انتخاب کنید(شما باید در اینجا Drag رو انتخاب کنید. اگه دوست داشتید کلیک باشه PointerClick و ...)
ابجکتی که اسکریپت رو بهش دادید بکشید روی event trigger و رویدادی که ایجاد کردید.(اگه نوشته بود list empty یعنی لیست خالی هست اولش باید روی + پایینی کلیک بشه تا یک لیست بیاد براتون که بتونید گیم ابجکت رو بکشید روش)
سپس از لیست اول اسکریپت رو پیدا کنید بعدش از زیر شاخه اش تابعی که توی اسکریپت تعریف شده رو انتخاب کنید.(حتما بای تابع شما public باشه ویلا نمیاد تو لیست)
منبع:gameover.blog.ir
برای اینکار باید Screen.orientation رو با مقادیر کلاس ScreenOrientation تنظیم کنیم.
مقادیر:
Variables Portrait Portrait orientation. PortraitUpsideDown Portrait orientation, upside down. LandscapeLeft Landscape orientation, counter-clockwise from the portrait orientation. LandscapeRight Landscape orientation, clockwise from the portrait orientation. AutoRotation Auto-rotates the screen as necessary toward any of the enabled orientations.
مثال :
// Start in landscape mode function Start () { Screen.orientation = ScreenOrientation.LandscapeLeft; }
منبع:gameover.blog.ir
یک ui->text روی صحنه بذارید (جایی که دید کافی داشته باشه)
در inspector خصوصیت پاراگراف (Paragraph ->Alignment رو برای حالت
افقی و عمودی روی center) و overflow (سرریز) افقی(horizontal)
وعمودی(vetical) رو روی overflow بذارید تا اگه متن بزرگتر شد کادر متن به
اندازه اون بشه.
یک اسکریپ بسازید و توش یک تابع مثل func1 بنویسید و حتما از نوع public
باشه. بعدش روی دکمه ی Add component بزنید و Event Trigger بدید به
ui->text ایجاد شده روی صحنه و سپس ابجکتی که اسکریپت test رو بهش دادید
بکشید روش و رویداد pointerClick رو انتخاب و تابع func1() رو از زیر
شاخه ی اسکریپت test در همون لیست بهش ربط بدید تا قتی کلیک می کنیم روش
تابع func1 اجرا بشه.
using UnityEngine; using System.Collections; using UnityEngine.UI; public class test : MonoBehaviour { public Text text1; void Start () { text1.text = "salam"; } public void func1(){ text1.text = "clicked"; } }
اجرا:
منبع:gameover.blog.ir
در یونیتی 5 بعضی اوقات وقتی در پنجره ی build settings روی andoid سوئیچ می کنیم و پروژه رو به apk بیلد می کنیم همچنان می بینیم روی گوشی نصب نمیشه(مثل گوشی huawei یا ....) و با خطایی مثل این مواجه میشیم:
application not installed android unity
برای رفع این مشکل به قسمت File->Build Settings رفته و روی android رفته و switch platform رو بزنید. چند لحظه صبر کنید . سپس player settings رو بزنید و تنظیمات زیر رو وارد کنید.
Device Fil_t_e_r = FAT(AR Mv 7+x 86)
Install Location = Automatic
bundle identifier رو هم درست وارد کنید برای مثال : ir.esmeSherkat.esmeApp
منبع :gameover.blog.ir
نویسنده:sajjad3011
منابع:سایت یونیتی + سایت اندروید + منابع سیشارپ + ... .
این آموزش خیلی مهم و واقعا کاربردی هست.به خیلی از منابع سر زدم و خیلی تحقیق کردم تا درک کنم این مبحث رو.
حالا نتیجه ی تحقیقاتم رو به رایگان در اختیار همه ی دوستان می ذارم تا به
نوبه ی خودم بتونم کمکی هرچند ناچیز کرده باشم برای پیشرفت دوستان.
کلاس جاوای اندروید در یونیتی نمایشی از یک موجودیت جنریک از
java.lang.Class هست.(مبحث پیچیده هست اما زمانیکه با سورس هایی در سایت
adad.ir یا غیره مواجه میشید اینا بهتون کمک می کنه تا موضوع تبلیغات از
طریق ساخت این کلاس رو بهتر درک کنید.اگه هم سخته نگران نباشید جلوتر شاید
بهش برسیم)
توضیح:
کلاس AndroidJavaClass از کلاس AndroidJavaObject مشتق میشه(یعنی خصوصیات
AndroidJavaObject رو به ارث می بره.مثل توابع و متغیرها و ...)
اگه بخوام به زبون قابل فهم یادتون بدم یعنی دسترسی به کتابخانه ای که به
زبان جاوا برای اندروید نوشته شده. مثال می زنم: سایت عدد (adad.ir) یا
سایت های دیگه مثل بازار و غیره رو دیدید که میان پلاگین های اندرویدی با
پسوند jar(یا java archive) به شما می دن می گن توی unity اضافه کنید بعدش
فلان دستورات رو بکار بگیرید تا بتونید با استفاده از اونا توی دستگاه های
اندرویدی تبلیغات برنامه نویسی شده توی اون کتابخونه jar رو استفاده کنید؟
این دقیقا همونه که با مثال یادتون میدم تا بهتر درک کنید که چه قدرت هایی
درش نهفته هست.مثل همون DLL نویسی که توی سیشارپ می نوشتیم و توی یونیتی
ازش استفاده می کردیم. این فرقش اینه که با eclipse یا android studio یا
... کتابخونه های جاوا رو برنامه نویسی کردن(یا خودمون هم اگه بخوایم می
تونیم) بعدش به jar بیلد کردن و به یونیتی اضافه می کنن. حالا روش استفاده
اش رو یاد می گیریم.
توابع این کلاس عبارتند از:
Call فراخوانی یک متد جاوا روی یک ابجکت (غیر استاتیک).
CallStatic فراخوانی یک متد استاتیک جاوا روی یک کلاس.
Dispose کل بک کردن IDisposable .(اگه فراموشم نشده باشه کل بک یعنی یک تابع رو به ورودی تابع دیگه بدیم)
Get دریافت مقدار یک فیلد در یک ابجکت(غیر استاتیک).
GetRawClass بازیابی اشاره گر jclass خام به کلاس جاوا.
GetRawObject بازیابی اشاره گر jobject خام به شی جاوا.
GetStatic دریافت مقدار یک فیلد استاتیک در نوع شی.
Set تنظیم مقدار یک فیلد در یک شی (غیر استاتیک).
SetStatic تنظیم مقدار یک فیلد استاتیک در نوع شی.
شکل کلی یا پوتوتایپ این کلاس به این صورت هست :
public AndroidJavaClass(string className);
اسم کلاسی از اندروید رو که میخوایم استفاده کنیم به صورت رشته ای(string) به ورودیش معرفی می کنیم.
مثال:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { AndroidJavaClass jc = new AndroidJavaClass("java.lang.System");// Try to collect som Java garbage.. jc.CallStatic("gc"); } }
در مثال فوق یک نمونه از کلاس java.lang.System به نام jc ساختیم . gc مخفف garbage collector یا جمع کننده ی زباله هست.
یعنی قسمت های اشغالی حافظه رو از داده های موقت و بی استفاده پاک سازی و آزاد می کنه.
مثال بعدی:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { AndroidJavaClass jc = new AndroidJavaClass("android.os.Build"); // Retrieve the manufacturer of the product/hardware. string manufacturer = jc.Get<string>("MANUFACTURER"); } }
public AndroidJavaObject(string className, params object[] args);className اسم کلاس
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some string"); } }در مثال فوق یک شی جاوا اندروید با قابلیت ذخیره رشته ایجاد کردیم.
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { int width = 300; int height = 150; AndroidJavaObject jo = new AndroidJavaObject("android/view/ViewGroup$LayoutParams", width, height); } }در مثال فوق عدد 300 و 150 رو به پارامترهای width و height از لی اوت(layout یا فرم اپلیکیشن اندرویدی) پاس کردیم که باعث میشه پهنا و ارتفاع لی اوت مون تنظیم بشه(برای درک لی اوت هم کافیه شما برنامه نویسی با b4a یا android studio یا eclipse رو بلد باشید تا مفهوم رو بهتر درک کنید)
AndroidJavaClass pluginClass = new AndroidJavaClass("ir.adad.AdadUnityPlugin"); pluginClass.CallStatic("setDisabled", new object[1] {"true"});یک مدل از کلاس ir.adad.AdadUnityPlugin می سازه با نام pluginClass و سپس متد setDisabled رو با آرایه ای تک عضوی object با مقدار true مقدار میده. به همین سادگی با اندروید ارتباط می گیره و تبلیغات خودش رو به صورت توکار حذف می کنه.
AndroidJavaObject jo = new AndroidJavaObject("android/view/ViewGroup$LayoutParams", width, height);
منبع : gameover.blog.ir
بعضی وقتا از این موردا پیش میاد. scene(صحنه) رو حذف و دوباره ایجاد کنید. mono editor رو هم بندید و اسکریپت دیگه ای ایجاد کنید بعد از چند لحظه مشکل حل میشه. موفق باشید.
منبع:gameover.blog.ir
اگر دیدید کاراکتر به هوا میره پارامتر Apply Root Motion رو برای کامپوننت Animator غیر فعال کنید.
بعضی اوقات معمولا کاراکتر حالت float in air(معلق یا شناور در هوا)پیدا می کنه.
برای حل این مشکل،خصوصیات is kinematic از Rigidbody و apply root motion از animator رو غیر فعال کنیم(توی Animator و Rigid body)
نکته ی مهم دوم://changePanelImage.Cs //Author:Sajjad3011 //Change image of panel using UnityEngine; using UnityEngine.UI; using System.Collections; public class changePanelImage : MonoBehaviour { public Sprite background; // Use this for initialization void Start () { GameObject.Find ("Panel1").GetComponent<Image> ().sprite = background; } // Update is called once per frame
منبع:gameover.blog.ir
فرض کنید یک کره یا sphere داریم که شعاع اون 6000 باشه.
حالا فرض کنید بخوایم نقطه ی روی زمین واقعی رو که از GPS خوندیم حالا می خوایم تبدیل به مختصات نقطه ی سه بعدی روی این کره کنیم.
کدش شبیه این میشه:
// this gives you a point on a spehere const float kRadiusOfEarth = 6000; Vector3 pos = new Quaternion(lat, long, 0) * new Vector3(0, 0, kRadiusOfEarth + altitude);
http://answers.unity3d.com/questions/1011674/gps-coordinates-latlongaltitude-to-unity-3d-coordi.html
منبع :gameover.blog.ir
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Renderer rend; void Start() { rend = GetComponent<Renderer>(); } void OnMouseEnter() { rend.material.color = Color.red; } void OnMouseOver() { rend.material.color -= new Color(0.1F, 0, 0) * Time.deltaTime; } void OnMouseExit() { rend.material.color = Color.white; } }
C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\AndroidManifest.xml
البته فایل AndroidManifest.xml رو برای کنترل بیشتر پروژه های اندرویدی به مسیر Assets->Plugins->Android از پروژه تون اضافه کنید و کدهای مختلف مثل دستری به اینترنت و غیره رو داخلش تنظیم کنید.
using UnityEngine; using System.Collections; //Author:Sajjad3011 public class player : MonoBehaviour { void Update () { //Variables: float moveSpeed = 1.5f; //Moving codes: if(Input.GetKey(KeyCode.RightArrow)) transform.Translate(Vector3.right * (Time.deltaTime * moveSpeed),Space.Self); //move Right; if(Input.GetKey(KeyCode.LeftArrow)) transform.Translate(Vector3.left * (Time.deltaTime * moveSpeed),Space.Self); //move Left; if(Input.GetKey(KeyCode.UpArrow)) transform.Translate(Vector3.up * (Time.deltaTime * moveSpeed),Space.Self); //move Up; if(Input.GetKey(KeyCode.DownArrow)) transform.Translate(Vector3.down * (Time.deltaTime * moveSpeed),Space.Self); //move Down; } }
using UnityEngine; using System.Collections; public class player : MonoBehaviour { void Update () { //Variables: float moveSpeed = 1.5f; //Moving codes: if(Input.GetKey(KeyCode.RightArrow)) transform.Translate(Vector3.right * (Time.deltaTime * moveSpeed),Space.World); //move Right; if(Input.GetKey(KeyCode.LeftArrow)) transform.Translate(Vector3.left * (Time.deltaTime * moveSpeed),Space.World); //move Left; if(Input.GetKey(KeyCode.UpArrow)) transform.Translate(Vector3.up * (Time.deltaTime * moveSpeed),Space.World); //move Up; if(Input.GetKey(KeyCode.DownArrow)) transform.Translate(Vector3.down * (Time.deltaTime * moveSpeed),Space.World); //move Down; } }
منبع:gameover.blog.ir
اسکریپت سیشارپ face2face زیر رو بدید به هر دو اسپرایت دلخواهتون.
سپس در inspector اسپرایت دشمن یا اسپرایتی که می خواید بهش نگاه بشه رو بکشید روی متغیر target .
//Author:Sajjad3011 //face2face.cs using UnityEngine; using System.Collections; public class face2face: MonoBehaviour { public Transform target; private Vector3 v_diff; private float atan2; void Update() { v_diff = (target.position - transform.position); atan2 = Mathf.Atan2 ( v_diff.y, v_diff.x ); transform.rotation = Quaternion.Euler(0f, 0f, atan2 * Mathf.Rad2Deg -90); } }
فرض کنید دو گیم ابجکت دو بعدی داریم می خوایم به هم نگاه کنن در هر حالتی.
هر شی اگه در سمت چپ بود به سمت راست وگرنه به چپ نگاه کنه.(به هر شی یک اسکریپت مشترک میدیم).
روش کار:
اگه x کمتر بود، localScale.x رو منفی کنید ویلا مثبت
ببینید
شما x دو گیم ابجکت رو نسبت به هم مقایسه کنید
اگه x کمتر بود، localScale.x رو منفی کنید ویلا مثبت
این کار رو برای هر دو گیم ابجکت دو بعدی تکرار می کنیم
مشکل از build-tools هست. باید ورژن v21.0.2 رو کپی کنید داخل پوشه.
http://answers.unity3d.com/questions/834744/building-android-application-failed-re-package-res.html
یه آموزش هم قبلا گذاشته بودیم ببینید:
منبع :gameover.blog.ir
اولا واسه خروجی apk گرفتن توی یونیتی هیچی نمی خواد به جز نصب همون چیزایی که واسه apk گرفتن توی game maer studio یادتون دادیم.
سپس:
یونیتی رو باز کنید(ورژن من 4 هست)
از منوی edit گزینه ی preferences رو برید و سپس External Tools و سپس روی
دکمه ی جلو android sdk location بزنید و اونجا ازتون android sdk windows
رو میخواد ولی شما به جاش آدرس sdk manager رو کپی paste کنید(واسه من اینه
: C:\Users\user1\AppData\Local\Android\android-sdk و واسه شما به جای
user1 ادرس یوزر خودتون رو بدید. اگه هم بلد نیستید کافیه روی sdk manager
که یک ایک سبز داره راست کلیک کنید و از طریق open file location مسیر رو
بدست بیارید)
بعدش روی select folder بزنید و پنجره رو ببندید .
حالا از منوی file گزینه ی build settings رو برید(کلید میانبر
ctrl+shift+B) و در قسمت android رفته و دکمه ی build رو بزنید تا پنجره ای
باز بشه واسه ذخیره فایل apk در مسیر دلخواه شما.
در همین لحظه ممکنه خطا بده که اسم شرکت(کمپانی) و اسم محصول(productName) رو وارد کنید.
برای اینکار روی player settings کلیک کنید . و در قسمت bundle intentifier
یک اسم به صورت gameover.Company.test وارد کنید. که اینجا اسم محصول رو
من test دادم و اسم کمپانی رو gameover دادم و بینش کلمه ی Company بذارید
باشه که چپ و راستش نقطه(.) می گیره
همه چی حله پروژه apk رو build کنید و حالشو ببرید:
هر چی واسه گیم میکر استادیو واسه خروجی گرفتن apk نصب کردید هموناست. (اگه واسه game maker studio همه چیز رو درست نصب کردید و موفق شدید apk بگیرید واسه یونیتی هم چیز جدیدی نمی خواد فقط این تنظیماتی که بالا گفتم رو انجام بدین حله)(چیز سختی نیست(
مشکل aip level 21 هم اینجا گفته شده :
Vector3 vectorToTarget = targetTransform.position - transform.position; float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg; Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * speed);
// Disable screen dimming Screen.sleepTimeout = SleepTimeout.NeverSleep;
منبع:gameover.blog.ir
Culling Mask
فرض کنید بعضی اوقات در کنار player اشیای دیگه ای داریم که نمی خوایم دوربین پشت player اونا رو رندر کنه.
برای اینکار کافیه به اون اشیا یه لایه نسبت بدیم و سپس دوربین رو انتخاب کرده و لایه ای رو که نمی خوایم رندر بشه از لیست Culling Mask غیر فعال یا unCheck کنیم.
منبع:gameover.blog.ir
تعداد راس ها و face های مدل رو کم کن(مل رو low polygon بساز. به زبون خودمونی همون لو پلی)
Material ها رو minimize کن.
حجم تکستچرها و UV ها رو کم کن.
فضای خالی تکستچرها رو با تکنیک های Overlapping تا می تونی حذف ن(overlapping یعنی همپوشانی)
از Per-Platform Texture Settings استفاده کن.(یه سری تنظیمات برای فشرده
سازی تکستچر در خود یونیتی تعبیه شده.وقتی تکستچر رو توی کادر پروژه انتخاب
می کنیم تنظیمات و خصوصیاتی توی inspector میاد حالا دقیق یادم نیست کدومش
هست برای تنظیم فشرده سازی که برای تنظیم و فشرده سازی تگستچر برای اجرا
روی هر پلتفرمی مثل اندروید یا مک و ویندوز و ... تعبیه شده)
--
نکته ی دیگه ای برای بهینه سازی و بالارفتن performance(کارایی پردازنده):
وقتی از کلاس transform استفاده می کنیم یک سری کارها به صورت
فانکشنال(functionality) یا تابعی باید اجرا بشن که نیاز به پردازش بیشتر
داره. بهتره که از کش یا ارجاع استفاه بشه. یعنی یه اشاره گر یا متغیر از
اون بسازیم. مثل این کد :
void Awake() { //Cache Transform (MyTransform is a class variable) MyTransform = transform; } void Update(){ //Update position using cached transform MyTransform.localPosition = MyPosition; }
using UnityEngine; using System.Collections; //sajjad3011 public class Indiana2 : MonoBehaviour { public Vector3 target; // The point user picks for the character to follow public bool facingRight = false; // Check where the character is facing private int move=0; // Movement direction private float maxSpeed = 5f; // Speed of character movement private Animator anim; // Reference to the animator // Use this for initialization void Start () { anim = GetComponent<Animator> (); } void FixedUpdate() { // Obtaining target point user clicked on screen if (Input.GetMouseButton (0)) { // After user has clicked left mouse button recording mouse position Vector3 mousePos = Input.mousePosition; // Converting mouse position into coordinate system connected to the camera. target = Camera.main.ScreenToWorldPoint (new Vector3 (mousePos.x, mousePos.y, 1f)); // Set movement direction depending on target point if (target.x < transform.position.x) move = -1; else if (target.x> transform.position.x) move = 1; Debug.Log (move); } // Flip the character if nessessary if (move ==1 && ! facingRight) Flip (); if (move == -1 && facingRight) Flip(); // check if arrived to target point if (Mathf.Abs (target.x - transform.position.x) < 0.2f) { move = 0; } anim.SetInteger ("Movement", Mathf.Abs(move)); // apply velocity to actually make character move rigidbody2D.velocity = new Vector2 (move * maxSpeed, rigidbody2D.velocity.y); } void Flip() { Debug.Log ("In Flip"); facingRight = !facingRight; Vector3 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; } }کد بالا چیز خاصی نداره نقطه ی کلیک رو چک می کنیم اگه x اش بیشتر از پلیر بود move رو مثبت ویلا منفی می کنه.
using UnityEngine; using System.Collections; //csharp code //Author:Sajjad3011 public class timer1 : MonoBehaviour { public Sprite[] sprArr=new Sprite[4];//set it in the inspector SpriteRenderer sprRndr1; private int i=0; // Use this for initialization void Start () { sprRndr1=this.gameObject.GetComponent<SpriteRenderer> ();//access to component SpriteRenderer InvokeRepeating("f1", 1.0f,1.0f);//call function f1() after 1 second } void f1() { Debug.Log (i); sprRndr1.sprite = sprArr[i]; i++; if (i > 3) i = 0; }//f1 }
منبع :gameover.blog.ir
مثال 1:
بررسی برخورد گیم ابجکت با تگ p2 به گیم ابجکت با تگ p1:
در اینجا اسکریپت رو میدیم به شی ای که تگ p1 داره.
بعدش به شی دوم تگ p2 می دیم.
یک تابع هم توش تعریف می کنیم مثلا برای صدمه خوردن به اسم ApplyDamage که عدد صدمه خوردن رو از ورودی می گیره و از میزان متغیر خون که نیاز به تعریفش هست کم می کنه و حالا روی ui text یا نوار خون نمایش میدیم با کد نویسی:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.tag == "p2") coll.gameObject.SendMessage("ApplyDamage", 10); } }
مثال2:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.tag == "Enemy") coll.gameObject.SendMessage("ApplyDamage", 10); } }
یه دونه هم اینجا گذاشته بودم قبلا :(بررسی برخورد اشیا در فاصله دلخواه روبرو)
منبع :gameover.blog.ir
برای اینکار ابتدا یک دوربین توی صحنه داریم.
یک فایل تصویری به اسم screenShot.png در مسیر جاری داریم.
یک اسکریپت csharp برای ایجاد دکمه ی آپلود می سازیم به اسم test.cs می سازیم و ربطش می دیم به دوربین:
سورس اسکریپت سیشارپ test.cs :
//test.cs using UnityEngine; using System.Collections; public class test : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI() { GUI.Label(new Rect(100, 0, 500, 20), Application.dataPath); if (GUI.Button(new Rect(100, 100, 150, 20), "Upload")) { UploadFile("http://yourSiteName.pergig.ir/upload/upload_file.php"); } } IEnumerator UploadFileCo(string uploadURL) { print ("file://" + Application.dataPath + "/screenShot.png"); WWW localFile = new WWW("file://" + Application.dataPath + "/screenShot.png"); yield return localFile; WWWForm postForm = new WWWForm(); postForm.AddBinaryData("file", localFile.bytes, "screenShot.png", "image/png"); WWW upload = new WWW(uploadURL, postForm); yield return upload; if (upload.error == null) { Debug.Log(upload.text); } else { Debug.Log("Error during upload: " + upload.error); } } void UploadFile(string uploadURL) { StartCoroutine(UploadFileCo(uploadURL)); } }
کد بالا رو ذخیره کنید و بکشید روی دوربین رها کنید.
به جای "http://yourSiteName.pergig.ir/upload/upload_file.php" آدرس فایل upload_file.php رو بدید.
اینم سورس upload_file.php که باید روی یک هاست php بذاریدش:
//upload_file.php <?php $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); $extension = end($temp); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br>"; echo "Type: " . $_FILES["file"]["type"] . "<br>"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);//move uploaded file into "upload" folder in current dir echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>
نکته: کد
<?php move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); ?>
منبع :gameover.blog.ir
شکل کلی :
public void InvokeRepeating(string methodName, float time, float repeatRate);
توضیح :
اولین پارامتر اسم تابعی هست که می خوایم مدام اجراش کنیم.
دومین پارامتر زمان انتظار برای اولین شروع بر حسب ثانیه هست.
سومین پارامتر هم زمان تاخیر بین هر فراخوانی هست.
مثال: کد زیر بلافاصله(بعد از صفر ثانیه انتظار) تابع دلخواه رو اجرا می کنه و هر 1 ثانیه دوباره اونو اجرا می کنه:
InvokeRepeating("YOUR FUNCTION NAME", 0, 1.0f);دقت کنید که حتما باید توی Start بذاریدش نه update. مثال :
void Start () { InvokeRepeating("f1", 1.0f,1.0f);//call function f1() every 1 second }در مثال فوق تابع f1 هر ثانیه یکبار فراخوانی میشه.
Invoke("YOUR FUNCTION NAME", 2);
using UnityEngine; using System.Collections; //Author:Sajjad3011 public class timer1 : MonoBehaviour { public Sprite[] sprArr=new Sprite[4];//set it in the inspector SpriteRenderer sprRndr1; private int i=0; // Use this for initialization void Start () { sprRndr1=this.gameObject.GetComponent<SpriteRenderer> ();//access to component SpriteRenderer InvokeRepeating("f1", 1.0f,1.0f);//call function f1() after 1 second } // Update is called once per frame void Update () { } void f1() { Debug.Log (i); sprRndr1.sprite = sprArr[i]; i++; if (i > 3) i = 0; }//f1 }
public class PostURL : MonoBehaviour { void Start () { string url = "http://example.com/script.php"; WWWForm form = new WWWForm(); form.AddField("var1", "value1"); form.AddField("var2", "value2"); WWW www = new WWW(url, form); StartCoroutine(WaitForRequest(www)); } IEnumerator WaitForRequest(WWW www) { yield return www // check for errors if (www.error == null) { Debug.Log("WWW Ok!: " + www.data); } else { Debug.Log("WWW Error: "+ www.error); } }
منبع :gameover.blog.ir
متناسب کردن بازی با صفحات مختلف اندروید
داخل unity 5 در کادر هایرارکی(hierarchy یا کادر اجزای صحنه) دکمه ی create->ui رو بزنید و سپس یک button رو ایجاد کنید.
به صورت پیشفرض خودش یک کادر canvas ایجاد می کنه که باعث میشه همیشه دکمه یا اشیا ی واسط کاربری شما روی اون قرار بگیره.
بعدش حالت شناور بودن رو باید تنظیم کنید . مثل چپ چین،راست چین افقی یا عمودی و ....(در inspector قسمت rect transform ):
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.position, fwd, 10)) print("There is something in front of the object!"); } }
منبع:
gameover.blog.ir
این PDF رو از zip در آورده و با برنامه ی Adobe Reader بخونید
منبع : http://www.unity3d.com
به لینک pdf زیر برید چند ثنیه صبر کرده و سپس رد تبلیغ بزنید:
نمی دونم چرا دوستان فقط چند نفر دانلود کردن.
توی این اموزش انواع فراخوانی تابع rayCast رو با مثال آوردم و کامل توضیح
دادم. توی سایت اصلی unity3d.com هم برید وبسایت نویسان unity3d.com
اشتباهاتی رو دارن که ممکنه جبران ناپذیر باشه. واسه همین اقدام به ترجمه و
تغییر نوع آموزش سایت unity3d.com کردم.
توی این آموزش سعی کردم کاربران زیادی رو از گیجی در بیارم تا بدونن وقتی
تابع Physics.Raycast یکبار به سه پارامتر و یکبار با دو پارامتر و یک بار
با 4 پارامتر فراخوانی میشه یعنی چی و چه ورودی هایی رو باید بده.
کاربرد:
مثلا اشعه پرت می کنه تا موانع رو detect کنه.
به هر جهت می خوای تا فاصله مشخص ray می اندازی
برای باز شدنانیمیشن درب در صورت اینکه دوربین از روبرو ببینه.
شرط می ذاری اگه tag مانع با تگ ما یکی بود کد بعدی رو اجرا کنه
بعدش انیمیشن اجرا کن(window=->Animation درب رو رو انیمیت کن)
loop Time =false بذارید تا انیمیشن تکرار نشه و فقط یه بار درب باز شه.
مثال :تشخیص مانع روبرو با استفاده از تگ:
bool isOpen=false; float distance=3f; void myRaycast(){ RaycastHit hit; Ray myRay = new Ray(transform.position, Vector3.forward); if(Physics.Raycast (myRay, out hit, distance)){ if(hit.collider.tag == "door" && isOpen==false){ Animation.Play("openDoor"); isOpen=true; }//if internal }//if external }//myRaycast()
//changeSprite runTime //lang:csharp //author:sajjad3011 //attach this script to your 2dobject sprite using UnityEngine; using System.Collections; public class changeSprite : MonoBehaviour { public Sprite spr1;//set it in the inspector public Sprite spr2;//set it in the inspector SpriteRenderer sprRndr1; // Use this for initialization void Start(){ sprRndr1=this.gameObject.GetComponent<SpriteRenderer> ();//access to component SpriteRenderer } // Update is called once per frame void Update () { if (Input.GetKey (KeyCode.Keypad1)||Input.GetKey (KeyCode.Alpha1)) { sprRndr1.sprite = spr1; } else if (Input.GetKey (KeyCode.Keypad2)||Input.GetKey (KeyCode.Alpha2)) { sprRndr1.sprite = spr2; } } }
روش دوم بدون متغیر public و با استفاده از مسیر فایل png :
نکته ی بسیار مهم :
ابتدا حتما باید پوشه ای به مسیر Assets/Resources ایجاد کنید.
سپس پوشه ای که
حاوی اسپرایت ها هست بریزید توش. مثل spritesFolder به مسیر
Assets/Resources/spritesFolder
حال داخل پوشه ی Assets/Resources/spritesFolder یک فایل به اسم mySprite.png داریم که می خوایم با کد اونو در لحظه ی اجرا لود کنیم.
به زبان سیشارپ اینطوری می شه :
GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("spritesFolder/mySprite");
public GameObject cam1,cam2; void Update () { if(Input.GetKey("1")){ Debug.Log("Using Camera 1"); cam1.SetActive(true); cam2.SetActive(false); } if(Input.GetKey("2")){ Debug.Log("Using Camera 2"); cam2.SetActive(true); cam1.SetActive(false); } }
Switching Cameras at runtime
برای تغییر دوربین در بازی میخوام الگوریتم یا راهکاری رو برای حل این مسئله یاد بدم با توجه به تحقیقاتم.
اصل کار اینطوری هست :
function Update(){ if(Input.GetKey("1")){ Debug.Log("Using Camera One"); camSwap(1); } } function camSwap(currentCam : int){ }
function camSwap(currentCam : int){ var cameras = GameObject.FindGameObjectsWithTag("cam"); for (var cams : GameObject in cameras){ cams.GetComponent(Camera).enabled = false; } }
var oneToUse : String = "Camera"+currentCam; gameObject.Find(oneToUse).GetComponent(Camera).enabled = true;
//js function Update () { if(Input.GetKey("1")){ Debug.Log("Using Camera One"); camSwap(1); } if(Input.GetKey("2")){ Debug.Log("Using Camera Two"); camSwap(2); } if(Input.GetKey("3")){ Debug.Log("Using Camera Three"); camSwap(3); } } function camSwap(currentCam : int){ var cameras = GameObject.FindGameObjectsWithTag("cam"); for (var cams : GameObject in cameras){ cams.GetComponent(Camera).enabled = false; } var oneToUse : String = "Camera"+currentCam; gameObject.Find(oneToUse).GetComponent(Camera).enabled = true; }
//csharp using UnityEngine; using System.Collections; public class camControl : MonoBehaviour { void Update () { if(Input.GetKey("1")){ Debug.Log("Using Camera One"); camSwap(1); } if(Input.GetKey("2")){ Debug.Log("Using Camera Two"); camSwap(2); } if(Input.GetKey("3")){ Debug.Log("Using Camera Three"); camSwap(3); } } void camSwap(int currentCam){ GameObject[] cameras = GameObject.FindGameObjectsWithTag("cam"); foreach (GameObject cams in cameras){ Camera theCam = cams.GetComponent<Camera>() as Camera; theCam.enabled = false; } string oneToUse = "Camera"+currentCam; Camera usedCam = GameObject.Find(oneToUse).GetComponent<Camera>() as Camera; usedCam.enabled = true; } }
using UnityEngine; using System.Collections; public class alpha : MonoBehaviour { public Color altColor = Color.black; public Renderer rend; //I do not know why you need this? void Example() { altColor.g = 0f; altColor.r = 0f; altColor.b = 0f; altColor.a = 0f; } void Start () { //Call Example to set all color values to zero. Example(); //Get the renderer of the object so we can access the color rend = GetComponent<Renderer>(); //Set the initial color (0f,0f,0f,0f) rend.material.color = altColor; } void Update() { if (Input.GetKey (KeyCode.G)){ //Alter the color altColor.g += 0.1f; //Assign the changed color to the material. rend.material.color = altColor; } if (Input.GetKey (KeyCode.R)){ //Alter the color altColor.r += 0.1f; //Assign the changed color to the material. rend.material.color = altColor; } if (Input.GetKey (KeyCode.B)){ //Alter the color altColor.b += 0.1f; //Assign the changed color to the material. rend.material.color = altColor; } if (Input.GetKey (KeyCode.A)){ //Alter the color altColor.a += 0.1f; //Assign the changed color to the material. rend.material.color = altColor; } } }منبع اصلی که از روش ویرایش هایی رو انجام دادیم:
منبع:gameover.blog.ir
منبع:gameover.blog.ir
حرکت دو بعدی پلیر در یونیتی به وسیله ی easy touch version 3
حرکت دو بعدی player
ویرایش:1/26/2016:
using UnityEngine; using System.Collections; public class DrawLine : MonoBehaviour { //reference to LineRenderer component private LineRenderer line; //car to store mouse position on the screen private Vector3 mousePos; //assign a material to the Line Renderer in the Inspector public Material material; //number of lines drawn private int currLines = 0; void Update () { //Create new Line on left mouse click(down) if(Input.GetMouseButtonDown(0)) { //check if there is no line renderer created if(line == null){ //create the line createLine(); } //get the mouse position mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); //set the z co ordinate to 0 as we are only interested in the xy axes mousePos.z = 0; //set the start point and end point of the line renderer line.SetPosition(0,mousePos); line.SetPosition(1,mousePos); } //if line renderer exists and left mouse button is click exited (up) else if(Input.GetMouseButtonUp(0) && line) { mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mousePos.z = 0; //set the end point of the line renderer to current mouse position line.SetPosition(1,mousePos); //set line as null once the line is created line = null; currLines++; } //if mouse button is held clicked and line exists else if(Input.GetMouseButton(0) && line) { mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mousePos.z = 0; //set the end position as current position but dont set line as null as the mouse click is not exited line.SetPosition(1, mousePos); } } //method to create line private void createLine() { //create a new empty gameobject and line renderer component line = new GameObject("Line"+currLines).AddComponent<LineRenderer>(); //assign the material to the line line.material = material; //set the number of points to the line line.SetVertexCount(2); //set the width line.SetWidth(0.15f,0.15f); //render line to the world origin and not to the object's position line.useWorldSpace = true; } }منبع اصلی:
//change camera Background Color // press Left or Rihgt shift //csharp language //unity 5.1final //Author:Sajjad3011 using UnityEngine; using System.Collections; public class cameraBackgroundColor : MonoBehaviour { private Camera cam; private Vector4 color1; // Use this for initialization void Start () { color1= Camera.main.backgroundColor; } // Update is called once per frame void Update () { if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift)) { Camera.main.backgroundColor=new Vector4(1F, 1f, 0, 0.1f);//Red,Green,Blue,Alpha } else Camera.main.backgroundColor=color1; } }
منبع:gameover.blog.ir
--
how to check animation is compelete in unity
how to check animation finihed in unity5
-
کد cs:
private IEnumerator WaitForAnimation ( Animation animation ) { do { yield return null; } while ( animation.isPlaying ); }
کد js:
function WaitForAnimation ( Animation animation ) { yield; while ( animation.isPlaying ) yield; }
منبع:
http://answers.unity3d.com/questions/37411/how-can-i-wait-for-an-animation-to-complete.htmlمثال بعدی:
function Die () { animation.Play("die"); yield WaitForSeconds (animation["die"].length); Destroy(this.gameObject); //destroys the object after animation ended }animation["die"].length میاد طول زمانی انیمیشنی به اسم die(مردن) رو بر حسب ثانیه در میاره.
void Die ()
{
animation.Play("die");
yield WaitForSeconds (animation["die"].length);
ادامه ی کد
}
منبع:gameover.blog.ir
این یک کلیپ آموزشی که برای شما ساختیم:
http://www.mediafire.com/file/jdywgx70f07s3nh/mp4_ui_button_click_go_level.zip
حالا می تونی button رو به همون طریق ایجاد کنی و بذاری روش: create->ui->button
بعدش تکستچر دکمه رو توی inspector عوض کن . خصوصیت شناور بودن هم می تونی تنظیم کنی (چپ چین و راست چین و ....)
اگه می خوای واسه کلیکش هم کد بنویسی ابتدا انتخابش کن بعدش توی inspector
یک دکمه ی + مثبت هست اونو بزن یک فیلد اضافه میشه. گیم ابجکتی که می خوای
رو بکش بنداز روش.
حالا می تونی تابع دلخواهی که داخل اسکریپت های اون گیم ابجکت وجود داره رو از لیست انتخاب کنی برای اجرا.
اینم ببینید:
http://answers.unity3d.com/questions/922045/unity-5-ui-button-onclick.html
+
http://answers.unity3d.com/questions/942622/how-do-you-call-a-function-with-a-button-unity-5-u.html
using UnityEngine; using UnityEngine.UI; using System.Collections; public class Move : MonoBehaviour { public Button btnExit; void Start () { btnExit.onClick.AddListener(()=>{ Application.Quit(); }); }
using UnityEngine; using System.Collections; public class test : MonoBehaviour { // Use this for initialization public void move(){ transform.position = Input.mousePosition; } }
منبع:gameover.blog.ir
به لینک زیر برید و چند ثانیه صبر کنید سپس رد تبلیغ رو بزنید:
منبع:gameover.blog.ir
با تشکر از سجاد به خاطر ارسال مطلب
موقعی که دارم خروجی apk می گیرم خطای زیر رو میده.این خطا برای چیه ؟
加速下载(推荐)=Acceleration Download (recommended)
---------------------
普通下载=Normal download این گزینه رو بزنید واسه دانلود
---------------------
买会员享提速特权,下载速度最高 提升200%=Members enjoy the privilege to buy speed, download speeds of up to 200% lift
---------------------
立即提速= Now Speed
gameover.blog.ir
دانلود پکیج های طناب دو بعدی و سه بعدی(UltimateRopeEditor+RopeScriptPackage)
(رایگان شد)
به لینک یر برید و پس از چند لحظه انتظار،دکمه رد تبلیغ رو بزنید
RopeScriptPackage برای دو بعدی هست.
http://s8.picofile.com/file/8274543834/tut_Ultimate_Rope_Editor_1_10_sajjad.rar.html
اینم آموزش دو بعدی پکیج 2d rope system:(حجم:30 مگ کیفیت عالی. زبان اصلی):
//move to click point //Author:Sajjad3011 //unity 5.1.final using UnityEngine; using System.Collections; public class bullet_move_2d : MonoBehaviour { public float speed=10f; private Vector3 clickPos; float DeathTime=2f; Vector3 diff; void Start() { clickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); clickPos.z = transform.position.z; Destroy(gameObject,DeathTime); // diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; diff.Normalize(); } void Update (){ transform.position = Vector3.MoveTowards(transform.position, clickPos, speed * Time.deltaTime); //Lookat 2d Equivalent float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0f, 0f, rot_z ); } }
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class joyStick_over_sajjad : MonoBehaviour { public GameObject pref_bullet; public GameObject player; private Vector3 clickPos; private bool over=false; void Update () { if (Input.GetMouseButtonDown(0)) { EventSystem eventSystem = EventSystem.current; if (! (eventSystem.IsPointerOverGameObject ())){ //over = true; Instantiate (pref_bullet, player.gameObject.transform.position, pref_bullet.transform.rotation);//ijdade tir }//if } //if }//update }//mono
توی sprite editor می تونیم لوله ی مکزی اسپرایت ها رو تنظیم کنیم.این لوله همون محور چرخش هست.
با وجو تنظیم ، وقتی E می زنیم تا rotate کنیم می بینیم حول لوله نمیچرخه بلکه حول مرکز خودش(center) می چرحخه.
برای عملکرد صحیح باید دکمه ی pivot به جای center فعال باشه:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { Application.OpenURL("http://example.com/get.php?Scrore=9"); } }
Score=9&x=5
منبع:gameover.blog.ir
public class PostURL : MonoBehaviour { void Start () { string url = "http://example.com/script.php"; WWWForm form = new WWWForm(); form.AddField("var1", "value1"); form.AddField("var2", "value2"); WWW www = new WWW(url, form); StartCoroutine(WaitForRequest(www)); } IEnumerator WaitForRequest(WWW www) { yield return www // check for errors if (www.error == null) { Debug.Log("WWW Ok!: " + www.data); } else { Debug.Log("WWW Error: "+ www.error); } }
منبع خارجی:
http://answers.unity3d.com/questions/11021/how-can-i-send-and-receive-data-to-and-from-a-url.html
dx = abs(x-center_x)
dy = abs(y-center_y)
R = radius
در کد فوق به جای x , y مختصات ماوس را بدهید.if dx>R then
return false.
if dy>R then
return false.
توی سیشارپ و js هر دو از var استفاده میشه. توی js برای تعریف تمام متغیرها. در csharp برای تعریف متغیرهای variant یا متغیرهایی که نوعشون در لحظه ی اجرا تعریف میشه بعد از دریافت ورودی، از var استفاده می کنیم.
منبع :gameover.blog.ir
using UnityEngine; using System.Collections; public class WWWFormImage : MonoBehaviour { public string screenShotURL= "http://www.my-server.com/cgi-bin/screenshot.pl"; // Use this for initialization void Start () { StartCoroutine(UploadPNG()); } IEnumerator UploadPNG() { // We should only read the screen after all rendering is complete yield return new WaitForEndOfFrame(); // Create a texture the size of the screen, RGB24 format int width = Screen.width; int height = Screen.height; var tex = new Texture2D( width, height, TextureFormat.RGB24, false ); // Read screen contents into the texture tex.ReadPixels( new Rect(0, 0, width, height), 0, 0 ); tex.Apply(); // Encode texture into PNG byte[] bytes = tex.EncodeToPNG(); Destroy( tex ); // Create a Web Form WWWForm form = new WWWForm(); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload", bytes, "screenShot.png", "image/png"); // Upload to a cgi script WWW w = new WWW(screenShotURL, form); yield return w; if (!string.IsNullOrEmpty(w.error)) { print(w.error); } else { print("Finished Uploading Screenshot"); } } }
به متغیر screenShotURL آدرس صفحه ی دریافت کننده php یا ... رو بدید.(اون پیشفرض pl داده که یه سایت رو معرفی کرده به زبان تحت سرور perl ساخته شده.پسوند فایل های پرل pl هستش)
var USERNAME : String; var PASSWORD : String; function Start () { var form = new WWWForm(); form.AddField("Username", USERNAME); form.AddField("Password", PASSWORD); var headers = form.headers; var rawData = form.data; var url = "your:url-goes-here"; var secretKey : String = USERNAME + ":" + PASSWORD; headers["Authorization"]="Basic " + System.Convert.ToBase64String( System.Text.Encoding.ASCII.GetBytes(secretKey)); var www = new WWW(url, rawData, headers); yield www; if(www.error) { print("There was an error: " + www.error); }else{ print(www.text); } }
کد به زبان js هست و برای بررسی صحت یوزرنیم و پسود بکار می ره و بعدش محتوای وب رو به صورت متنی دریافت می کنه و نمایش میده.
با اندکی فکر روی کد می تونید به سیشارپ convert کنید اگه سیشارپ رو دوست دارید.
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnParticleCollision(GameObject other) { Rigidbody body = other.GetComponent<Rigidbody>(); if (body) { Vector3 direction = other.transform.position - transform.position; direction = direction.normalized; body.AddForce(direction * 5); } } }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public ParticleSystem part; public ParticleCollisionEvent[] collisionEvents; void Start() { part = GetComponent<ParticleSystem>(); collisionEvents = new ParticleCollisionEvent[16]; } void OnParticleCollision(GameObject other) { int safeLength = part.safeCollisionEventSize; if (collisionEvents.Length < safeLength) collisionEvents = new ParticleCollisionEvent[safeLength]; int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents); Rigidbody rb = other.GetComponent<Rigidbody>(); int i = 0; while (i < numCollisionEvents) { if (rb) { Vector3 pos = collisionEvents[i].intersection; Vector3 force = collisionEvents[i].velocity * 10; rb.AddForce(force); } i++; } } }
منبع:gameover.blog.ir
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public float duration = 1.0F; public Light lt; void Start() { lt = GetComponent<Light>(); } void Update() { float phi = Time.time / duration * 2 * Mathf.PI; float amplitude = Mathf.Cos(phi) * 0.5F + 0.5F; lt.intensity = amplitude; } }
منبع :gameover.blog.ir
بررسی برخورد با اشیایی که در مقابل ما قرار دارند
sing UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.position, fwd, 10)) print("There is something in front of the object!"); } }
منبع :gameover.blog.ir
شکل کلی
public Vector3 TransformDirection(Vector3 direction);
برای تبدیل direction از فضای محلی(local space) به فضای جهانی(world space) بکار می رود.
مثال:
بررسی برخورد با اشیایی که در مقابل ما قرار دارند
sing UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.position, fwd, 10)) print("There is something in front of the object!"); } }
prefab چیست؟
پریفب یا prefab هم اگه نمی دونید بپرسید.
مثلا یک عکس یا asset یا مجموعه ای از چند گیم ابجکت(جسم بازی مثل مکعب،استوانه وغیره) یا هر چیزی رو خواستیم با ماوس می گیریم می کشیم می اندازیم روی یک جسم در کادر hierarchy(هایرارکی=کادر اجزای صحنه ی بازی ) و زیر شاخه ی یک ابجکت (تهی=empty )قرار می دیم.(نکته برای ایجاد یک جسم تهی یا امپتی،راست کلیک کنید تو کادر هایرارکی و یک جسم empty game object از همون قسمتا ایجاد کنید)
بعدش اون گیم ابجکت empty رو با تمام چیزایی که انداختیم روش و زیر شاخش شده (فقط همون جسم رو )می کشیم توی کادر پروژه تا یک prefab ازش ساخته بشه و تمام چیزایی که زیرشاخش بود هم یه نمونه زیر شاخش میسازه. بعدش می تونیم از کادر هایرارکی یا از صحنه حذفش کنیم. مثل تیر و اشیایی که می خوایم توی صحنه نباشن و با استفاده از کد اونا رو ایجاد کنیم.یا یک نمونه از این پریفب رو بکشیم توی صحنه یا هر چند تا ازش می خوایم بکشیم با ماوس بندازیم تو صحنه و فقط یکی رو از تو کادر پروژه تغییر بدیم تا رنگ همه عوض بشه یا خصوصیات دیگش رو بعد از انتخابش در کادر پروژه ،از طریق کادر inspector که بهش می گیم کادر خصوصیات جسم انتخابی،تغییر بدیم )
به همین سادگی. :| :| :|
GameObject[] enemyArray = GameObject.FindGameObjectsWithTag("enemy"); if(enemyArray .Length == 0) boroBeMarhaleBadi()
منبع:gameover.blog.ir
با تشکر از سجادیه تابع یا رویداد به اسم void OnCollisionEnter(Collision col){ داریم باهاش می تونید چک کنید با چیزی که تگ nardeban داره برخورد داریم یا نه. بعدش کلید فلش بالا رو توش چک می کنید اگه فلش بالا زده شد یه آسانسور نامرعی زیرش هست میره بالا و پایین. در حقیقت یه plane یا کلایدر روی یک گیم ابجکت نامرعی میذارید. فلش پایین هم زده شد می یاد پایین . به همین سادگی. همچنین انیمیشن بالا رفتن و پایین رفتن رو می تونیم اجرا کنیم.
البته یادتون نره postion آسانسور نامرعی رو باید به طور اتوماتیک وقتی که player در نقطه بالا یا پایین نردبان هست تنظیم کنید تا وقتی player مثلا از یه نردبان دیگه می ره روی یه سقف و از نردبان دیگه بخواد بیاد پایین آسانسور بالا نباشه.
همچنین بهتره از توابع raycast استفاده کنید زیرا می تونید رودر رو یا face to face بودن player در مقابل نردبان رو چک کنید و وقتی کاراکتر پشت کرده نتونه بره بالا و بقیه به عهده ی خودتون هست که باگ های احتمالی رو رفع کنید.
http://unity3d.com/unity/download/archive
منبع:gameover.blog.ir
کد به زبان سیشارپ در یونیتی 5.1 فاینال تست شده(حالت دو بعدی)
//shellik be jayi ke click kardim 2d mode using UnityEngine; using System.Collections; public class test : MonoBehaviour { public GameObject pref_Bullet; public int bulletSpeed=1000; float distance= 10.0f; void Update (){ if (Input.GetMouseButtonDown(0)) { Vector3 position=new Vector2(Input.mousePosition.x, Input.mousePosition.y); position = Camera.main.ScreenToWorldPoint(position); GameObject go= Instantiate(pref_Bullet, transform.position, Quaternion.identity) as GameObject ; go.transform.LookAt(position); Debug.Log(position); go.AddComponent<Rigidbody2D>(); go.gameObject.GetComponent<Rigidbody2D>().AddForce(go.transform.forward*bulletSpeed); } } }
نکته: متغیر pref_Bullet از نوع public هست.پریفب نارنجک رو بدید بهش.
پریفب رو اگه نمی دونید بگم:
هر گیم ابجکت یا جسم بازی که می سازیم می ذاریم توی صحنه رنگش و متریال وخصوصیات دیگه رو تغییر می دید هر جور دوس دارید. یا زیر شاخش هر چی می خواید می ذارید(مثل ماشین با چرخ و درب و غیره)، سپس با ماوس از کادر هایرارکی یا کادر اجزای صحنه ی بازی(hierarchy) می کشید توی کادر project یه نمونه ازش می سازه بهش می گیم prefab یا پریفب . حالا هر چی دلمون بخواد می تونیم ازش با ماوس بندازیم تو صحنه و فقط کافیه تغییر رو روی پریفب اصلی اعمال کنیم تا روی همشون اعمال بشه.
منبع:gameover.blog.ir
برای Animator Component تیک گزینه ی apply root motion رو غیر فعال کنید.
منبع: gameover.blog.ir
نویسنده ی این مطلب:سجاد
web player+PC/Mac+LinUx+iOS+ANDRoid+BlackBerry+Windows Store+Windows Phone+Web GL+Xbox 360+ps3+ps4+samsung TV
public var cameraObj : GameObject; public var specificVector : Vector3; public var smoothSpeed : float; function Start () { cameraObj = GameObject.FindGameObjectWithTag("MainCam"); } function Update () { specificVector = Vector3(transform.position.x, transform.position.y, cameraObj.transform.position.z); cameraObj.transform.position = Vector3.Lerp(cameraObj.transform.position, specificVector, smooth * Time.deltaTime); }
کد به زبان js هست و خیلی ساده. کد رو به دوربین بدید و یادتون نره تگ MainCam رو به دوربین اصلی بدید.
ابچکت player رو هم بندازید روی متغیر specificVector که قراره دوربین دنبالش کنه.
کد معادل برای مد سه بعدی:
var target : Transform; var distance = 3.0; var height = 3.0; var damping = 5.0; var smoothRotation = true; var rotationDamping = 10.0; function Update () { var wantedPosition = target.TransformPoint(0, height, -distance); transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping); if (smoothRotation) { var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up); transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping); } else transform.LookAt (target, target.up); }
http://answers.unity3d.com/questions/897409/smooth-camera-follow-for-2d-platformer-game.html
http://imdaunity.blogspot.com/2011/02/camera-follow-script.html
منبع:gameover.blog.ir
فرض اسکریپتی به نام class1.cs داریم:
using UnityEngine; using System.Collections; public class class1: MonoBehaviour { public void hello(){ Debug.Log ("hello world"); } }حال اسکریپت دیگری به نامclass2.cs داریم.
using UnityEngine; using System.Collections; using UnityEngine.UI; public class class2 : MonoBehaviour { void Start () { test t1 = new test (); t1.hello (); } }
حرکت گلوله/حرکت تیر/حرکت گیم ابجکت/از محل ایجاد/از محل وجود به نقطه ای که با ماوس کلیک شود در یونیتی 5:
اسکریپت زیر باعث میشه گلوله به سمت نقطه ای که کلیک کنیم حرکت کنه و زیر 2
ثانیه نابود بشه.همچنین به سمت نقطه ی کلیک شونده نگاه کنه.اما وقتی به
نقطه رسید حرکت متوقف می شه.
//move to click point and lookat2d Equivalent //Author:Sajjad3011 //unity 5.1.final using UnityEngine; using System.Collections; public class bullet_move_2d : MonoBehaviour { public float speed=10f; private Vector3 clickPos; float DeathTime=2f; Vector3 diff; void Start() { clickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); clickPos.z = transform.position.z; Destroy(gameObject,DeathTime); // diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; diff.Normalize(); } void Update (){ transform.position = Vector3.MoveTowards(transform.position, clickPos, speed * Time.deltaTime); //Lookat 2d Equivalent float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0f, 0f, rot_z ); } }اسکریپت فوق بسیار کمیاب هست و خودم با تحقیق زیاد نوشتمش و باگ های زیادی داشت که برای یونیتی 5 حل کردم.
Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
diff.Normalize();
float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rot_z );
نویسنده مقاله :
وھاب احمدوند
Vahab Ahmadvand
www.Persian-Designers.com
-
Bending Stiffness: که مقداری بین ٠ و ١ می باشد که میزان خمیدگی چند ضلعی ھای پارچه رو مشخص می کند.
اگر این مقدار بیشتر باشد پارچه خشک تر می شود و به آسانی خم نمی شود و اگر
مقدار آن کمتر باشد پارچه نرم تر می شود.
Stretching Stiffness :این پارامتر میزان کش دار بودن و کشیدگی چند ضلعی ھای پارچه را تعیین می کند. مقدار کم باعش شل بودن پارچه می شود.
Damping: تاثیر فشار ھوا بر حرکت جسم.
Thickness: میزان ضخامت و کلفتی پارچه را مشخص می کند.برای جلوگیری از تو رفتگی زیاد می توان مقدار آن را زیاد کرد ولی معمولا بین ٠.٣ تا ٠.۶ مقدار مناسبی است.
Use Gravity : با فعال کردن آن جاذبه زمین روی پارچه تاثیر دارد.
Self Collision: با فعال کردن آن پارچه با خودش برخورد دارد و توی ھم نمی رود.
Friction: میزان اصطحکاک سطح پارچه را تعیین می کند.
کامپوننت Cloth Renderer
Materials :که بافت سطح رو مشخص می کنه .
Pause When Not Visible : با فعال کردن این گزینه وقتی پارچه در معرض دید دوربین نباشد غیر فعال است و محاسباتی روی آن انجام نمی شود.
منبع:gameover.blog.ir
روی کادر پروژه راست کلیک و Create->Avatar Mask رو بزنید.
یه ماسک آواتار ایجاد میشه. می تونید برید گزینه ی Humanoid(ساختار انسانی) رو انتخاب کنید. بعدش هر جا رو خواستید ماسک کنید تا انیمیشن روش تاثیر بذاره.مثلا همه قسمت ها جز دست چپ.:
این فیلم رو ریختیم روی مدیافایر ببینید:
روش های زیای هست مثل raycast و oncollsionenter و .... اما اینم یکیش با تریگر.
using UnityEngine; using System.Collections; public class DoorActivator : MonoBehaviour { public Animator[] lights; private Animator animator; void Awake () { animator = GetComponent <Animator>(); } void OnTriggerEnter (Collider other) { if (other.gameObject.tag == "Player") { animator.SetBool ("Open", true); foreach (var light in lights) { light.SetTrigger ("Activate"); } } } void OnTriggerExit (Collider other) { if (other.gameObject.tag == "Player") { animator.SetBool ("Open", false); } } }
سوال :اصلا انیمیشن درب چیه ؟ چطوری انیمیشن ایجاد کنم؟
خیلی ساده توضیح میدم .
یونیتی 5 خودش ابزاری برای ساخت انیمیشن داره.به مسیر Window->Animation برید تا پنجره ای باز بشه.دکمه Create رو بزنید و انیمیشن رو با نام دلخواه ذخیره کنید.
روی دکمه ها برید یک توضیح میاد واسه هر دکمه. یکی از دکمه ها دایره قرمز هست اونو بزنید تا خودکار انیمیشن رو record کنه. روی نوار زمانی timeline روی صفر برید و توی صحنه کاراکتر رو روی یک position تنظیم کنید. سپس تایم لاین رو ببرید جلو و دوباره توی صحنه کاراکتر رو موقعیتش رو تغییر بدید.اینطوری انیمیشن ایجاد می شه و حرکت ذخیره میشه.
عدش می تونید انیمیشن رو بندازید روی پنجره animator cotroller که با راست کلیک توی پنجره ی پروژه ایجاد میشه و سپس انیماتور کنترلر رو بکشید بندازید روی کامپوننت Animator component که با دکمه ی add component به مدل دادید.
برای فعال سازی و غیرفعال سازی هاله از طریق اسکریپ سیشارپ از این کدها استفاده کنید:
Component halo = GetComponent ("Halo");
halo.GetType().GetProperty("enabled").SetValue(halo, false, null); //غیرفعال
halo.GetType().GetProperty("enabled").SetValue(halo, true, null);//فعال
منبع:gameover.blog.ir
مترجم:گیم آور دات بلاگ دات آی آر
بعضی مواقع می خواهیم دو یا چند حرکت شبیه را ادغام کنیم.شاید بهترین مثال،ادغام پیاده روی و دویدن کاراکتر باشد.یا به عنوان مثال بعدی،کج شدن کاراکتر به چپ یا راست در حین چرخیدن زمانیکه که کاراکتر در حال دویدن باشد.
تشخیص بین Transitionsو Blend Trees حائز اهمیت است. با وجود اینکه هردوی اینها برای ایجاد یک انیمیشن نرم و smooth می باشند،از آنها در انواع مختلف وضعیت ها استفاده می شود.
* Transition ها (خطوط انتقال)،برای سوئیچ بین یک انیمیشن و انیمیشن دیگر در یک میانگین زمانی مورد استفاده قرار می گیرند.این خطوط انتقال به عنوان بخشی از Animation State Machine محسوب می شوند.اگر transition سریع باشد انتقال از یک انیمیشن به یک انیمیشن کاملا متفاوت ،می تواند خوب باشد.
*Blend Tree ها برای ادغام multiple animation ها (ادغام چند انیمیشن همزمان) استفاده می شوند( با ترکیب بخش هایی از آنها با درجات مختلف). میزان همکاری انیمیشن ها برای تاثیر نهایی انیمیشن با استفاد از پارامتر blending کنترل می شود.این پارامتر تنها یکی از پارامترهای Animator Controller می باشد.برای ادغام موشن هایی که scene را می سازند موشن ها بهتر است زمانبندی و رفتار مشابهی داشته باشند تا کار طبیعی تر شود. Blend Tree ها(درختان ادغام) نوع مخصوصی از state در Animation State Machine هستند.(نکته: ماشین حالت همون پنجره انیماتور منظورشه که سوئیچ می کنه بین انیمیشن ها و شرط می ذاریم و این حرف ها)
استفاده از Blend Trees:
برای شروع کار با یک new Blend Tree باید مراحل زیر رو طی کنیم:
در یک فضای خالی از پنجره ی Animator Controller راست کلیک کنید و Create State->New blend tree رو انتخاب کنید.
(نکته
: شاید فکر کنید شکل blend tree کمی فرق کنه اما اینطوری نیست اونی که شما
توی سایت یونیتی دیدی بهش می گن Blend Tree Graph (گراف بلندر تری) که با
دوبار کلیک روی یکی از state ها باز می شه.
در سمت چپ فقط گره ریشه (root node) وجود داره و هیچ گره یا نود فرزندی(child node) هنوز بهش اضافه نکردیم.
در سمت راست root node رو با چند Animation Clip می بینید که به عنوان گره ی فرزند بهش اضافه کردیم.
برای اضافه کردن کلیپ های انیمیشن به درخت ادغام( blend tree ) می توانید blend tree را انتخاب و سپس روی آیکن بعلاوه(plus icon) در فیلد motionدر کادر خصوصیات(inspector) کلیک کنید.
قبل از افزودن هر موشن، یک Blend Node در inspector نمایان می شود.با استفاده از plus icon می توانید کلیپ های انیمیشن را یا blend tree های child (فرزند) را اضافه کنید.به طور جایگزین،می توانید animation clip ها یا child blend node ها را با راست کلیک روی blend tree و انتخاب از منوی context اضافه کنید.
وقتی یک درخت ادغام با استفاده از کلیپ های انیمیشن و پارامترهای ورودی تنظیم شد،inspector در هنگام تغییر مقدار پارامتر، یک تجسم گرافیکی یا ویژوال( graphical visualization) از چگونگی ترکیب انیمیشن ها به ما نشان می دهد.(وقتی اسلایدر یا نوار لغزان را drag می کنید فلش های جهت دار از ریشه ی درخت سایه یا shading خودشان را تغییر می دهند تا کلیپ انیمیشن غالب را نشان دهند یا برجسته کنند)
در تصویر فوق یک 2D Blendtree را در inspector مشاهده می کنید که با 5 انیمیشن تنظیم شده است.
شما می توانید هر گره(node) در Blend Tree graph را انتخاب کرده و آن را در inspector بررسی کنید.اگر node انتخاب شده یک Animation Clip باشد،Inspector برای Animation Clip نمایان می شود.اگر انیمیشن از یک مدل import شود ، setting ها read-only هستند. اگر node یک Blend Node باشد Inspector برای Blend Node ها نمایان خواهد شد.
شما می توانید blending یک بعدی(1D) یا دو بعدی(2D) را از منوی Blend Type انتخاب کنید. فرق بین آنها در بخش های مربوط وجود دارد.
برای اطلاعات بیشتر به این لینک ها مراجعه شود:
http://docs.unity3d.com/Manual/BlendTree-1DBlending.html
http://docs.unity3d.com/Manual/BlendTree-2DBlending.html
یونیتی از لایه های انیمیشن برای مدیریت state machine های پیچیده برای body part های مختلف استفاده می کند.
فرض کنید شما یک لایه lower-body(پایین) برای دویدن/پریدن(walking-jumping) دارید و همینطور یک لایه upper-body (بالاتر) رای پرتاب اشیا+تیراندازی.
شما می توانید لایه های انیمیشن را از طریق Layers Widget در گوشه ی بالا و چپ Animator Controller مدیریت کنید.
کلیک روی گیره ی لغزان در سمت راست پنجره تنظیمات لایه را نشان می دهد.
شما می توانید در هر لایه ماسک گذاری کنید. maskبخشی از مدل انیمیت شده روی انیمیشینی هست که باید بکار بسته شود.
پارامتر Blending type دو مقدار می گیرد. مقدار Override باعث می شود اطلاعات لایه های دیگر ignore یا نادیده گرفته شود.مقدار Additive باعث می شود انیمیشن به بالای لایه های قبلی اضافه شود.
با فشردن کلید مثبت(
Mask برای تعیین ماسک استفاده شده روی لایه بکار می رود.برای مثال اگر بخواهید با جود اینکه کاراکتر شما در حال راه رفتن است،می دود یا هنوز در حال ایستاده است،همزمان انیمیشن پرتاب را فقط روی بالاتنه ی مدل اجرا کنید،باید روی لایه ای که انیمیشن پرتاب را در بردارد(به شرطی که بخش های بالاتنه تعریف ده باشد) ماسک(mask) بگذارید.مثل عکس زیر:
منبع:gameover.blog.ir
به لینک رفته و چند ثانیه صبر کنید و سپس رد تبلیغ رو بزنید.
این پکیج به درخواست دوستان گذاشته شد.(اگه شما هم به پکیج یا هر آموزشی نیاز دارید توی بخش نظرات اعلام بفرمایید)
gameover.blog.ir
سازنده:sajjad3011
این اسکریپت رو بدید به player .
نکته: پلیر نباید کامپونتت rigid body داشته باشه.
ضمنا یک کامپوننت character controller هم بدید به player.(با انتخاب پلیر و زدن دکمه Add component و ...)
دانلود فایل کد:
https://s8.picofile.com/file/8272355892/chController.rar.html
اینم کد برای نمایش:
//chController.cs //Author:sajjad3011 //gameover.blog.ir //---------------------- //us telegram channel: //@gameoverblog //---------------------- using UnityEngine; using System.Collections; public class chController : MonoBehaviour { private Vector3 moveDirection = Vector3.zero; void Update (){ float speed=5; float jumpSpeed=5; float gravity=5; CharacterController controller = GetComponent<CharacterController>(); if (controller.isGrounded) { // We are grounded, so recalculate // move direction directly from axes moveDirection =new Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } } // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller controller.Move(moveDirection * Time.deltaTime); } }
منبع:gameover.blog.ir
یک ui->text بسازید و روی canvas یا روی صحنه جایی بذارید که توی صحنه دیده بشه. فونت سایز رو هم توی inspector زیاد کنید و در زیرشاخه fond data در inspector خصوصیات hirozontal overflow و vertical overflow رو روی OverFlow بذارید تا اگه متن بزرگ بود غیب نشه.
-
یک اسکریپت سیشارپ به نام changeText با کد زیر بدید به text ای که ایجاد کردیم:
//change ui->Text //csharp code //Unity 5 //Author:gameover.Blog.ir //********************** using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine; using System.Collections; public class changeText : MonoBehaviour { public Text textBox1; void Update () { if (Input.GetKey (KeyCode.A)) { textBox1.text="salam"; } } }
سپس گین ابجکت ui text ای که ساختید رو بکشید بندازید روی پارامتر عمومی textBox1 که توی inspector ظاهر خواهد شد.(در حقیقت ما textBox1 رو از نوع public گرفتیم تا خیلی راحت بدون کدنویسی فیلد تکست رو بکشیم از ورودی بهش معرفی کنیم و دیگه getComponent و ... رو کد نزنیم)
اجرا کنید. کد می گه اگه کلید A رو زدیم متن رو عوض کن بذار "salam"
نظر یادتون نره.موفق باشید.
این پارامتر رو اگه فعال کنیم باعث میشه تشخیص کلایدر بهتر بشه وگرنه باید چند کلایدر بدیم به مدل.
به هر حال راه های دیگه ای هم هست مثل Polygon collider و ... .
موفق باشید.
منبع:gameover.blog.ir
نویسنده :alimka
منبع:http://www.crydev.ir/thread79.html
برای اینکه بتونیم از این کد ها استفاده کنیم ابتدا باید دوتا شی ایجاد کنیم . مثلا دو مکعب ایجاد می کنیم به نام Enemy و Player.
using UnityEngine; using System.Collections; public class MYCLASSNAME : MonoBehaviour { float Xrotatespeed=10; float Yrotatespeed=10; 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)); print(transform.rotation.eulerAngles); } }
اسکریپت فوق به زبان سیشارپ هست به جای MYCLASSNAME اسم اسکریپت رو بذارید.
اسکریپت معادل به زبان جاوااسکریپت :
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); }
transform.position = Vector2.Lerp (transform.position, pos2,10* Time.deltaTime);
transform.position = Vector2.Lerp (transform.position, pos3,10* Time.deltaTime);
transform.position = Vector2.Lerp (transform.position, pos1,10* Time.deltaTime);
البته توی javascript نیازی به استفاده از StartCoroutine نیست.چون خود کامپایلر(compiler) این کار رو برای شما انجام میده.اما توی کد C sharp باید از StartCoroutine استفاده کنیم.
مثال یک :
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { print("Starting " + Time.time); StartCoroutine(WaitAndPrint(2.0F)); print("Before WaitAndPrint Finishes " + Time.time); } IEnumerator WaitAndPrint(float waitTime) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { IEnumerator Start() { print("Starting " + Time.time); yield return StartCoroutine(WaitAndPrint(2.0F)); print("Done " + Time.time); } IEnumerator WaitAndPrint(float waitTime) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } }
ارسال داده های فرم به وب سرور :
using UnityEngine; using System.Collections; public class WWWFormImage : MonoBehaviour { public string screenShotURL= "http://www.my-server.com/cgi-bin/screenshot.pl"; // Use this for initialization void Start () { StartCoroutine(UploadPNG()); } IEnumerator UploadPNG() { // We should only read the screen after all rendering is complete yield return new WaitForEndOfFrame(); // Create a texture the size of the screen, RGB24 format int width = Screen.width; int height = Screen.height; var tex = new Texture2D( width, height, TextureFormat.RGB24, false ); // Read screen contents into the texture tex.ReadPixels( new Rect(0, 0, width, height), 0, 0 ); tex.Apply(); // Encode texture into PNG byte[] bytes = tex.EncodeToPNG(); Destroy( tex ); // Create a Web Form WWWForm form = new WWWForm(); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload", bytes, "screenShot.png", "image/png"); // Upload to a cgi script WWW w = new WWW(screenShotURL, form); yield return w; if (!string.IsNullOrEmpty(w.error)) { print(w.error); } else { print("Finished Uploading Screenshot"); } } }به متغیر screenShotURL آدرس صفحه ی دریافت کننده php یا ... رو بدید.