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

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

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

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

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

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

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

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

۷۸ مطلب در مهر ۱۳۹۴ ثبت شده است

۱ نظر موافقین ۰ مخالفین ۰ ۳۰ مهر ۹۴ ، ۰۷:۵۴
مدیرکل
این کد رو بدید به تیر:
//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 );
	}
}

این کد رو بدید به جوی استیک مجازی ای که با پکیج easy touch version 3 ساختید.(اگه لینک پکیج رو ندارید بگید بذاریم)
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


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

در یونیتی 5 مسیر window->animation رو رفته و سپس کاراکتر رو انتخاب کرده و بعدش create animation بزنید و انیمیشن رو در مسیر گفته شده با اسم دلخواه ذخیره کنید . سپس دکمه ی قرمز record animation رو بزنید و بعد توی timeline نوار انیمیشن رو جابجا و تغییرات بدید.
۰ نظر موافقین ۰ مخالفین ۰ ۲۸ مهر ۹۴ ، ۱۸:۲۰
مدیرکل

منبع:gameover.blog.ir

برای اینکار روی یکی از راس ها راست کلیک کنید تا انتخاب بشه و سپس Alt رو نگه دارید و روی راس مجار کلیک کنید تا کل راس های مجاور انتخاب بشه(با ctrl+Tab روی حالت vertice بذارید و اگه میخواید روی Face یا Edge هم می تونید تنظیم کنید برای انتخاب وجه ها یا یال ها)

[تصویر: select_Adjacent_Vertices_blender.jpg]


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

منبع:gameover.blog.ir

وقتی یک شی رو انتخاب می کنیم و سپس شی دوم رو انتخاب می کنیم و ctrl+P و object رو می زنیم شی اول فرزند شی دم میشه و یک خط ارتباط نقطه چین نشون میده. برای اینکه این خط نشون داده نشه کلید N رو بزنید تا کادر خصوصیات(properties ) باز بشه و سپس از بخش display گزینه ی Relationship Lines رو انتخاب کنید.

[تصویر: relationship_Lines.jpg]


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

منبع:gameover.blog.ir

یک cube ایجاد کنید.
یک cycender ایجاد و داخل cube جاسازی کنید به طوری که دو سر آن بیرون باشد.
سیلندر را انتخاب و یک اصلاحگر Boolean Modifier به آن اضافه کنید.
در بخش object از مدیفایر اضافه شده به سیلندر،آبجکت cube را انتخاب و apply کنید.
cube را انتخاب و حذف کنید.

[تصویر: booleanModifier.jpg]


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

منبع:gameover.blog.ir

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

http://s6.uplod.ir/i/00540/ityqp1epg2p1.jpg


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

توی sprite editor می تونیم لوله ی مکزی اسپرایت ها رو تنظیم کنیم.این لوله همون محور چرخش هست.

با وجو تنظیم ، وقتی E می زنیم تا rotate کنیم می بینیم حول لوله نمیچرخه بلکه حول مرکز خودش(center) می چرحخه.

برای عملکرد صحیح باید دکمه ی pivot به جای center فعال باشه:

http://answers.unity3d.com/storage/temp/41146-pivot.png

۰ نظر موافقین ۰ مخالفین ۰ ۲۷ مهر ۹۴ ، ۱۱:۴۱
مدیرکل
منبع:gameover.blog.ir
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Start() {
        Application.OpenURL("http://example.com/get.php?Scrore=9");
    }
}

متغیر Score و مقداری که دادیم دلخواه هست. اگه بخوایم متغیرهای دیگه هم ارسال کنیم می تونیم با علامت & از هم جدا کنیم مثل
Score=9&x=5

ضمنا باید اجازه دسترسی به اینترنت هم در مانیفست بدید.
مانیفست مسیرش اینجا گفتیم:
https://gameover.blog.ir/tag/%D8%AA%D9%86%D8%B8%DB%8C%D9%85%20%D9%85%D8%A7%D9%86%DB%8C%D9%81%D8%B3%D8%AA%20%D8%AF%D8%B1%20%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C
۳ نظر موافقین ۰ مخالفین ۰ ۲۵ مهر ۹۴ ، ۲۳:۰۵
مدیرکل

منبع: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

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

منبع:gameover.blog.ir

کد زیر،محتوای فایل testFile.txt رو می خونه و نمایش می ده و اینکار رو تا پایان خواندن همه ی سطرهای فایل ادامه میده.

<?php 
header('Content-type: text/html; charset=utf-8'); 
//==============
$myFile="testFile.txt";
$fh=fopen($myFile, 'r') or die("");//read file
while(! feof($fh))
  {
  echo fgets($fh). "<br />";
  }

fclose($fh);
//==============
?>
۰ نظر موافقین ۰ مخالفین ۰ ۲۵ مهر ۹۴ ، ۱۸:۳۵
مدیرکل

منبع:gameover.blog.ir

<?php 
header('Content-type: text/html; charset=utf-8'); 
$stringIP=$_SERVER['REMOTE_ADDR'];
//==============
$myFile="testFile.txt";
$fh=fopen($myFile, 'a') or die("can't open file");//'a' : append
fputs($fh,$stringIP ."\r\n");
fclose($fh);
//==============
?>
۰ نظر موافقین ۰ مخالفین ۰ ۲۵ مهر ۹۴ ، ۱۸:۳۱
مدیرکل
ابتدا اختلاف مختصات نقطه ی کلیک را از نقطه ی مرکزی دایره بدست می آوریم
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 هستش)


۱ نظر موافقین ۰ مخالفین ۰ ۲۴ مهر ۹۴ ، ۲۳:۳۶
مدیرکل
منبع:gameover.blog.ir
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 کنید اگه سیشارپ رو دوست دارید.


۰ نظر موافقین ۰ مخالفین ۰ ۲۴ مهر ۹۴ ، ۲۳:۳۵
مدیرکل
منبع:gameover.blog.ir
نویسنده این مطلب:سجاد
اسکریپت زیر باعث میشه وقتی به پارتیکلی برخورد کردیم نیرویی در جهت direction به ما وارد بشه:
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);
        }
    }
}

پارتیکل سیستم شوریکن( Shuriken particle system):
این message به اسکریپت اتچ(وصل) شده به پارتیکل سیستم و collider ای که با آن برخورد کرده ارسال می شود.
وقتی تابع OnParticleCollision  از یک اسکریپت وصل شده به gameobject دارای collider  فراخوانی(invoke) می شود پارامتر GameObject ، پارتیکل(ParticleSystem) سیستم را نمایش می دهد. Collider حداکثر یک پیام(message) را در پارتیکل سیستم دریافت می کند که در هر فریم با آن برخورد کرده است( حتی وقتی که پارتیکل سیستم با collider با چند پارتیکل سیستم در فریم جاری برخورد کند.)
برای اطلاعات بیشتر در مورد تمام کالیژن های رخ داده با پارتیکل سیستم، می توان از  ParticleSystem.GetCollisionEvents استفاده کرد تا آرایه ای از ParticleSystem.CollisionEvent را دریافت نماییم.(نکته : Collision event یعنی رویداد برخورد. یا تابعی که در لحظه ی برخورد صدا زده میشه)

نکته:
پیام های فقط زمانی ارسال می شن که توی پنل inspector گزینه ی /Send Collision Messages/ رو برای particle system collision module فعال کنیم.

OnParticleCollision می تونه یک co-routine باشه و خیلی ساده می تونید دستور yield رو برای انتظار اتمام کار تابع بکار بگیرم:
در مورد coroutine قبلا اینجا توضیح دادیم:
http://gameover.blog.ir/1394/07/04/%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-StartCoroutine-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C

مثال:
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
جلوگیری از ثبت نام کاربرد جدید در مای بی بی mybb

پیکر بندی->تنظیمات ثبت نام و پروفایل کاربر


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

منبع :gameover.blog.ir

انجمن و ارسال ها->مدیریت انجمن-> نممایش انجمن->سطوح دسترسی

Guests (پیش فرض)

تنظیم دسترسی‌های اختیاری

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

منبع: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 که بهش می گیم کادر خصوصیات جسم انتخابی،تغییر بدیم )

 

به همین سادگی. :| :| :|

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

get name of  the other object name after collision with it,in game maker/studio


Collision Event :

در رویداد برخورد (collision) این کد رو بذارید:

with other
{
show_message(object_get_name(object_index)); }

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

منبع :gameover.blog.ir

هر چند game maker  و construct و ..... منسوخ هستن از نظر ما اما به علت درخواست دوستان فقط بعضی سوالات گیم میکر/استادیو رو پاسخ میدیم. و بیشتر تاکید ما روی یونیتی هست.

اما پاسخ:

فرض کنید هلیکپتر یک alarm داره هر چند ثانیه تیر ایجاد می کنه و می خوایم تیر بره سمت سرباز دشمن.

مثال می زنم باقیش با خودتون :

واسه هلی کوپتر یه الارم بذار هر چند ثانیه تیر ایجاد کنه(instance_create که احتمالا همینکار رو می کنی)
توی رویداد ایجاد(create) از ابجکت تیر هم کدی بنویس که حرکت کنه به سمت سرباز دشمن مثال:

کد :

if(instance_exists(sarbaz_obj))
{
move_towards_point(sarbaz_obj.x,sarbaz_obj.y,sarbaz_obj)
direction=point_direction(x,y,sarbaz_obj.x,sarbaz_obj.y)
speed =7
}
۰ نظر موافقین ۰ مخالفین ۱ ۲۲ مهر ۹۴ ، ۰۱:۵۲
مدیرکل
منبع:gameover.blog.ir
یه آرایه تعریف می کنیم و کل گیم ابجکت هایی که تگ(برچسب/tag)  دشمن(enemy) دارن رو لیست می کنیم.
اگه هیچ دشمنی وجود نداشته باشه پس هیچی لیست نمی شه و طبعا طول آرایه باید صفر باشه. دستور یا تابع رفتن به مرحله ی بعدی رو اجرا می کنیم. مثال:
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 در مقابل نردبان رو چک کنید و وقتی کاراکتر پشت کرده نتونه بره بالا و بقیه به عهده ی خودتون هست که باگ های احتمالی رو رفع کنید.

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

http://unity3d.com/unity/download/archive

بعدش اسم رو در کنار ورژن تو گوگل بزنید و سایت های آزاد رو باز کنید.
مثال: یونیتی 5.2.1 فاینال:
http://soft98.ir/software/3d-tools/14494-Unity-3D.html

اینم لیست تغییرات در یونیتی ورژن 5.2:
https://unity3d.com/unity/whats-new/unity-5.2
اینم واسه 5.2.1:
https://unity3d.com/unity/whats-new/unity-5.2.1
تغییرات هر ورژنی رو خواستید آخرش عدد ورژن رو دستکاری کنید.
۰ نظر موافقین ۰ مخالفین ۰ ۲۱ مهر ۹۴ ، ۰۹:۱۱
مدیرکل

منبع: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

http://uupload.ir/files/27l_untitled.png

برای Animator Component تیک گزینه ی apply root motion رو غیر فعال کنید.

۱ نظر موافقین ۰ مخالفین ۰ ۲۱ مهر ۹۴ ، ۰۳:۱۲
مدیرکل
منبع:gameover.blog.ir
با تشکر از سجاد
ایجاد سیستم ragdoll برای ولو شدن کاراکتر.
در یونیتی 5 مسیر gameobject->3d object->Ragdoll رو طی می کنیم تا پنجره ی Create Ragdoll باز بشه :
نکته : در یونیتی ورژن قدیمی مسیر game object->Create other->Ragdoll رو باید طی کنید.
سپس اجزای مختلف مدل رو می کشیم می اندازیم در فیلدهای مربوطه:
[تصویر: unity4_5_ragdoll.jpg]
کارکتر رو در قسمتی بالا تر بذارید و اجرا کنید تا کاراکتر ولو بشه:
[تصویر: ragdoll.jpg]
بیشتر توضیح نمی دم این کلیپ رو دانلود کنید:
http://www.mediafire.com/download/qnuor7xtbd7os3o/Ragdoll_unity_Tutorial.mp4

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

کاربرد : برخورد با موتور یا ماشین و پرتاب شدن. مشت زدن به حریف و ولو شدن. روی موتور سوار بودن و پس از برخورد با مانع پرتاب شدن از روی موتور و جدا شدن و .... . همش با کد و تکنیک می شه پیاده سازی کرد. مثلا فلان کامپوننت رو اضاف می کنید. فلان سیستم رو حذف می کنید. کاراکتر رو از زیرشاخه والد حذف می کنید . مثلا موتور والد کاراکتر ماست و کاراکتر ما فرزند اون هست و روش سواره . برای کارهای پیشرفته باید تکنیک های زیادی زد که می تونید در کنارش ragdoll رو بکار ببرید برای ولو شدن و بقیه رو خودتون پیاده سازی کنید.
۰ نظر موافقین ۰ مخالفین ۰ ۲۱ مهر ۹۴ ، ۰۰:۵۹
مدیرکل
۰ نظر موافقین ۰ مخالفین ۰ ۲۱ مهر ۹۴ ، ۰۰:۴۷
مدیرکل

منبع: gameover.blog.ir

نویسنده ی این مطلب:سجاد

web player+PC/Mac+LinUx+iOS+ANDRoid+BlackBerry+Windows Store+Windows Phone+Web GL+Xbox 360+ps3+ps4+samsung TV

http://s6.picofile.com/file/8216598492/unity5_platform_publish_formats.jpg


۰ نظر موافقین ۰ مخالفین ۰ ۱۹ مهر ۹۴ ، ۰۰:۰۱
مدیرکل
منبع:gameover.blog.ir
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 داریم.
برای دسترسی به اسکریپت بالا و تابع  hello() به این صورت عمل می کنیم:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class class2 : MonoBehaviour {
  void Start () {
    test t1 = new test ();
    t1.hello ();
  }

}


سوالی بود مطرح کنید. بی زحمت رو تبلیغاتی که میذاریم کلیک کنید بالای وبلاگ یا جاهای دیگه. ممنون از همه دوستان
۱ نظر موافقین ۰ مخالفین ۰ ۱۷ مهر ۹۴ ، ۰۹:۰۷
مدیرکل
منبع:gameover.blog.ir

حرکت گلوله/حرکت تیر/حرکت گیم ابجکت/از محل ایجاد/از محل وجود به نقطه ای که با ماوس کلیک شود در یونیتی 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 حل کردم.
در روش فوق با استفاده از تابع آرک تانژانت(Atan) از کلاس ریاضی(Mathf) ، زاویه را بر حسب رادیان برای y/x بدست آوردیم.

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

نکته مهم:
یادتون نره لولای اسپرایت رو بذارید روی نوک گلوله از طریق sprite editor
یا توی inspector می تونید بذارید روی right بستگی داره به شکل گلوله. گلوله ی من به سمت راست بود.
[تصویر: sprite_center.jpg]
نکته: اسکریپت رو باید به گلوله بدید. و خود گلوله هم باید پریفب کنید یعنی توی صحنه نباشه بکشید بندازید توی پروژه. بعدش توی کد کلیک player کد ایجاد پریفب گلوله رو بدید.

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

Vector3 diff Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
diff.Normalize();
float rot_z Mathf.Atan2(diff.ydiff.x) * Mathf.Rad2Deg;
transform.rotation Quaternion.Euler(0f0frot_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(ساختار انسانی) رو انتخاب کنید. بعدش هر جا رو خواستید ماسک کنید تا انیمیشن روش تاثیر بذاره.مثلا همه قسمت ها جز دست چپ.:

http://s6.picofile.com/file/8215595150/avatarMask.jpg

این فیلم رو ریختیم روی مدیافایر ببینید:

http://www.mediafire.com/download/onpdsvsab0gs4ca/Unity__tweaking_animations_using_Layers_in_Mecanim_%5BYT-f22%5D%5BrX9Trne1obs%5D.rar

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

منبع:gameover.blog.ir

کلمه ی global و بعدش یه نقطه (.) و سپس اسم متغیر رو بنویس تمام.
مثال:
دو ابجکت ساز به نام های obj1 و obj2 .
دو روم بساز به اسم room1 و room2 .
obj1 رو بذار روی room1
obj2 رو بذار روی room2
--
obj1:
create:

کد :

global.My_cash=56 
mouse global left pressed:
کد :

room_goto(room2);
Draw:
کد :

draw_text(10,20,"room1" + "          :"+ string(global.My_cash));

obj2:
mouse global left pressed:
کد :

room_goto(room1);
draw:
کد :
draw_text(10,20,"room2" + "          :"+ string(global.My_cash));

اجرا بگیر و روی یک جای روم کلیک کن تا بین روم ها حرکت کنی و نتیجه رو ببینی.
اینم سورس با گیم میکر 8.1 (البته سورس مهم نیست چون توضیحات کامل بود و توی گیم میکر استادیو و ... هم می تونید استفاده کنید احتمالا اگه منسوخ نباشه)
http://s6.picofile.com/file/8215594726/globalVars.gm81.html
۰ نظر موافقین ۰ مخالفین ۰ ۱۳ مهر ۹۴ ، ۰۲:۰۸
مدیرکل

روش های زیای هست مثل 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 به مدل دادید.

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

منبع:gameover.blog.ir

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

یک تکنیک مدلسازی یک شهر بزرگ در بلندر از روی نقشه ی اصلی:
مراحل کار :

1. آخرین ورژن اسکریپت Open Street Map (یا OSM) رو از اینجا دانلود کنید:
http://s2.picofile.com/file/8288927776/io_import_scene_osm.py.html
این اسکریپت مثل خود بلندر به زبون paython برنامه نویسی شده.

2. اسکریپت رو در پوشه ی Add-ons مسیر نصب بلندر کپی کنید(برای من در این مسیر: C:\Program Files\Blender Foundation\Blender\2.73\scripts\addons هست) بعدش برید توی بلندر و از منوی File->User Preferences و گزینه ی Street رو جستجو کنید و وقتی اورد تیک بزنید.

3. به سایت http://openstreetmap.org/ برید و در کادر جستجو اسم مکان مورد نظر رو بنویسید. مثلا : اهواز. سپس جستجو رو بزنید تا نقشه بیاد و اگه خواستید zoom کنید.
نکته: اگه صفحه تغییر کرده بود می تونید history مرورگر رو پاک کنید تا به حالت اولیه بره.

[تصویر: osm1.jpg]


4. سپس Export بزنید و برای انتخاب یک ناحیه ی محدود می تونید گزینه ی Manually select a different area رو بزنید و به صورت مستطیلی انتخاب کنید. و سپس Export رو می زنید تا فایل map.osm دانلود بشه. (سرعت اینترنت شما باید کمی بالا باشه و یادتون نره اگه خودکار خواست دانلود کنه آدرس رو کپی کنید و ببرید توی Internet download manager و با اون دانلود کنید. معمولا حدود 2 مگ برای نقشه های متوسط هست)

5. حالا برید فایل map.osm رو در blender ایمپورت کنید(حتما گزینه ی import roads and pathsرو تیک بزنید تا جاده ها و مسیرها رو لود کنه)

6.ممکنه چیزی نبینید و کمی zoom کنید و صحنه رو بچرخونید و از همه ی زوایا بررسی کنید.(اگه فایل رو با IDM دانلود کنید بهتره)

7. بعدش می تونید خطوط رو انتخاب کنید و از منحنی(curve) تبدیل کنید به مش(Alt+C در مد Object برای Covert to Mesh) تا بشه ویرایش کرد.

8. بعدش می تونید انتخاب کنید قسمت های دلخواه رو و به هم وصل کنید یا پر کنید(با کلید F در Edit mode) و سپس E بزنید و Extrude کنید در محور Z بیاریدش بالا.
۲ نظر موافقین ۰ مخالفین ۰ ۱۱ مهر ۹۴ ، ۰۳:۱۳
مدیرکل
منبع:gameover.blog.ir

برای فعال سازی و غیرفعال سازی هاله از طریق اسکریپ سیشارپ از این کدها استفاده کنید:

Component halo = GetComponent ("Halo");
halo
.GetType().GetProperty("enabled").SetValue(halo, false, null); //غیرفعال
halo.GetType().GetProperty("enabled").SetValue(halo, true, null);//فعال

 



۰ نظر موافقین ۰ مخالفین ۰ ۱۱ مهر ۹۴ ، ۰۲:۵۲
مدیرکل
منبع:gameover.blog.ir
اگه یک متن طولانی داشته باشیم روی خط افقی می ره جلو و از room می زنه بیرون. برای جلوگیری از این مشکل باید هر جا خواستیم بره خط بعدی از کاراکتر "#" استفاده کنیم. (برای رفتن به خط بعدی باید بین متن علامت "#" بذارید.)
مثال :
توی رویداد DRAW اینو بذار تست بگیر تا متوجه منظورم بشید:
کد :
// alamate "#" baraye raftan be Next Row
draw_text(10,5,"salammercsalammercsalammercsalammercsala#mmercsalammercsalammercs#alammercsalamm ​ ercsalammercsalammercsalamme#rcsalammercsalammercsalammercsalammercsa#lammercsal ​ ammercsalammercsalamme#rcsalammercsalammercsalammercsalammercsalammercsalammercs ​ alammercsalammercsalammercsala#mmercsalammercsala#mmercsalammercsalammercsalamme ​rcsalammercsalammerc");

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

منبع: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 ها باز می شه.

http://s3.picofile.com/file/8215211568/blendTreeGraph.jpg


در سمت چپ فقط گره ریشه (root node) وجود داره و هیچ گره یا نود فرزندی(child node) هنوز بهش اضافه نکردیم.

در سمت راست root node رو با چند Animation Clip می بینید که به عنوان گره ی فرزند بهش اضافه کردیم.

برای اضافه کردن کلیپ های انیمیشن به درخت ادغام( blend tree ) می توانید blend tree را انتخاب و سپس روی آیکن بعلاوه(plus icon) در فیلد motionدر کادر خصوصیات(inspector) کلیک کنید.

http://s6.picofile.com/file/8215212226/MecanimBlendTreeInitial.png

قبل از افزودن هر موشن، یک Blend Node در inspector نمایان می شود.با استفاده از plus icon می توانید کلیپ های انیمیشن را یا blend tree های child (فرزند) را اضافه کنید.به طور جایگزین،می توانید animation clip ها یا child blend node ها را با راست کلیک روی blend tree و انتخاب از منوی context اضافه کنید.

http://s3.picofile.com/file/8215212684/AnimatorBlendTreeContextMenu.png

وقتی یک درخت ادغام با استفاده از کلیپ های انیمیشن و پارامترهای ورودی تنظیم شد،inspector در هنگام تغییر مقدار پارامتر، یک تجسم گرافیکی یا ویژوال( graphical visualization) از چگونگی ترکیب انیمیشن ها به ما نشان می دهد.(وقتی اسلایدر یا نوار لغزان را drag می کنید فلش های جهت دار از ریشه ی درخت سایه یا shading خودشان را تغییر می دهند تا کلیپ انیمیشن غالب را نشان دهند یا برجسته کنند)

http://s6.picofile.com/file/8215214176/AnimatorBlendTreeInspectorPreview.png

در تصویر فوق یک 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


Blend Trees and Root Motion

درخت ادغام و حرکت ریشه ای
ادغام بین انیمیشن ها به وسیله ی خطوط ارتباط نمایش داده می شود.(برای مثال میانگین هر انیمیشن میانگینی است که انیمیشن های مجزا مجزا شده ای هست که با استفاده از پارامتر blending  موزون یا weight می شود.) به هر حال شما باید توجه کنید که root motion به همان صورت الحاق نمی شود.برای اطلاعات بیشتر صفحه ی  root motion  را مطالعه بفرمایید( برای اطلاعات بیشتر در مورد اینکه چه تاثیری روی کاراکتر شما می گذارد):
http://docs.unity3d.com/Manual/RootMotion.html

نکته مترجم : root motion یا حرکت ریشه ای یک چیز مثل همون پارامتر apply root motion هست که  وقتی به یک کاراکتر انیمیشن یا انیماتور می دادیم باید گزینه رو غیر فعال می کردیم تا کاراکتر توی هوا معلق نشه یا نیروهای دیگه روی اون تاثیر بد نذارند. موفق باشید. گیم آور
۰ نظر موافقین ۱ مخالفین ۰ ۱۰ مهر ۹۴ ، ۲۱:۱۸
مدیرکل
منبع:gameover.blog.ir
مترجم:گیم آور

Animation Layers

یونیتی از لایه های انیمیشن برای مدیریت state machine های پیچیده برای body part های مختلف استفاده می کند.

فرض کنید شما یک لایه lower-body(پایین) برای دویدن/پریدن(walking-jumping) دارید و همینطور یک لایه upper-body (بالاتر) رای پرتاب اشیا+تیراندازی.

شما می توانید لایه های انیمیشن را از طریق Layers Widget در گوشه ی بالا و چپ Animator Controller مدیریت کنید.

http://s6.picofile.com/file/8215186118/MecanimAnimationLayers.png

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


http://s6.picofile.com/file/8215186342/MecanimAnimationLayers2.png

شما می توانید در هر لایه ماسک گذاری کنید. maskبخشی از مدل انیمیت شده روی انیمیشینی هست که باید بکار بسته شود.

پارامتر Blending type دو مقدار می گیرد. مقدار Override باعث می شود اطلاعات لایه های دیگر ignore یا نادیده گرفته شود.مقدار Additive باعث می شود انیمیشن به بالای لایه های قبلی اضافه شود.

با فشردن کلید مثبت(+) بالای widget(ویجت) می توانید یک لایه ی جدید ایجاد کنید.

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

http://s3.picofile.com/file/8215188784/AnimatorMaskOnLayer.png


سمبول یا نماد ‘M’در Layers sidebar به معنی این است که لایه mask(ماسک) دارد.

همگام سازی لایه انیمیشنAnimation Layer syncing):
اغلب اوقات مناسب است از یک state machine در لایه های مختلف استفاده ی مجدد کنیم.به عنوان مثال اگر بخواهید یک  رفتار “wounded” (در لغت به معنی مجروح و جریحه دار و خسته است) را شبیه سازی یا simulate کنید به جای انیمیشن های “healthy” (سلامت)برای walk / run / jump (راه رفتن/دویدن/پریدن)   از انیمیشن های “wounded”(مجروح) استفاده می کنید.برای اینکار می تونید روی Sync checkbox روی یکی از لایه های خود استفاده کنید و لایه ای را که می خواهید همزمان یا همگام( Sync) شود انتخاب کنید.ساختار state machine همانگونه خواهد بود اما در حقیقت کلیپ های انیمیشن با حالت های متمایز استفاده می شوند.
این یعنی Synced layer تعریف ماشین حالت خودش را به هیچ وجه ندارد،اما در عوض نمونه ای از سورس لایه ی سینک(Sync) شده هست.هر تغییری که روی لی اوت یا ساختار view ی لایه های سینک شده انجام دهید(مثل اضافه یا حذف خطوط انتقال یا transition بین انیمیشن ها ) روی سورس لایه ی sync شده اعمال می شود.فقط تغییراتی که در synced layer یکتا هستند،انیمیشن های همگام شده ای هستند که با هر state (حالت) استفاده می شوند.
http://s3.picofile.com/file/8215191934/AnimatorSyncedLayer.png
در عکس فوق لایه “Fatigued” با base layer سینک(همگام) شده است.
ساختار ماشین حالت(state mechine به همون پنجره ی فوق می گیم) همانند base layer است و انیمیشن های منحصر به فرد(فردی) به طور متفاوتی در هر حالت swap (تعویض)می شود به جز انیمیشن های معادل مناسب.

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

منبع:gameover.blog.ir

به لینک رفته و چند ثانیه صبر کنید و سپس رد تبلیغ رو بزنید.

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

http://s6.picofile.com/file/8215092800/z_006_26082015_031934.jpg

http://opizo.com/8VnAov

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

gameover.blog.ir

 

سازنده:sajjad3011

http://s9.picofile.com/file/8272354200/chController.jpg

 

این اسکریپت رو بدید به 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

http://s17.picofile.com/file/8413050276/usersManagerPHP.zip.html

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

تشکر یادتون نره.

اینم شمارم:

09358077198

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

منبع: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"

http://s6.picofile.com/file/8214468292/changeui_text.jpg

نظر یادتون نره.موفق باشید.

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

منبع:gameover.blog.ir

برای اینکه دیتا بیس بسازید نیاز به نرم افزار navicat دارید که ورژن premium رو از اینترنت دانلود کنید . اموزشم نمی خواد ور برید حله winking
-

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

این پارامتر رو اگه فعال کنیم باعث میشه تشخیص کلایدر بهتر بشه وگرنه باید چند کلایدر بدیم به مدل.

به هر حال راه های دیگه ای هم هست مثل Polygon collider و ... .

موفق باشید.

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

منبع:gameover.blog.ir


نویسنده :alimka
منبع:http://www.crydev.ir/thread79.html

برای اینکه بتونیم از این کد ها استفاده کنیم ابتدا باید دوتا شی ایجاد کنیم . مثلا دو مکعب ایجاد می کنیم به نام Enemy و Player.

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

این پکیج حدود 245 مگابایت هست .
بسیار حجیم و عالی جهت ساختر کاراکتر اول شخص و سوم شخص می باشد . پکیج دارای سه دموی متفاوت به همراه آموزش بوده و می توانید از آن در ساخت کاراکتر خود استفاده کنید .
[تصویر: character_system.jpg]
یه مدل نینجا توش هست و شاید یه سری مدل دیگه که بشه چایگزین کرد .
و یه سری انیمیشن واسه پراز و راه رفتن و افت زدن از بغل و یه rigid body واسه فیزیک و یه سری اسکریپت دیگه داره واسه پرش و شاید شنا کردن و .... (من شنا کردن و ... رو نتونستم بیابم happy )

روش کارش سادست. پکیج رو با ماوس بکشید توی یونیتی import کنید و پس از تایید و ایمپورت کامل کافیه توی اون کادر جستجو در پنجره ی asset ها در project کلمه ی ninja رو جستجو کنید و مدل رو که پیدا کرد بکشید بیارید توی صحنه یا Hierarchy به بازیتون اضافه کنید.
یک plane هم با رنگ سبز(دلخواه) ایجاد کنید واسه زمین. و یک cube هم دوست داشتید بذارید که بتونید پرش رو تست بگیرید.
همه چی تموم بازی رو اجرا کنید.
با z پرواز کنید و با z فرورد بیاید.(چند تا z شت سر هم بزنید ارتفاع رو زیاد می کنه) و وقتی z رو بعد از چند لحظه می زنید سقوط می کنه و اگه از ارتفاع بیفتید روی زمین حالت زمین خوردن و انیمیشن مربوط رو به خوبی اجرا می کنه براتون.
با کلیک ماوس و راست کلیک می تونید لگد و مشت بزنید و الی آخر.

[تصویر: charSys.jpg]

خود پکیج هم می خواید توی اینترنت هست .
من قبلا از http://www.myunity.ir گرفته بودمش ولی الان دیگه اونجا نیست انگار. از هر جا پیدا کردید دانلود کنید.
ولی در کل بگم اینم یه نمونه ی ساده هست.
بعدا انشاءا... با برنامه نویسی و اسکریپت سازی بتونید مسائل پیچیده تری رو توی بازی های یونیتی خودتون حل کنید.
مثلا من توی سایت های دیگه ای هم سر زدم دیدم اسکریپت های فیزیک یا vehicle واسه یه ماشین رو یکی از بچه های سایت persian-designers فک کنم خیلی خوب ساخته بود و ماشینش خیلی خوب پستی و بلندی ها رو می رفت و گرافیکش هم به جز زمین بد نبود big grin
با X میشینه و دوباره پا میشه و با C شمشیر بر می داره و دوباره میذاره سر جاش(اگه دوباره x بزنید) .
اگه دوبار D بزنید از راست اوفت میزنه و اگه دوباره A بزنید از چپ. اگه دوبار W بزنید از جلو افت میزنه و اگه دوبار S بزنید از عقب افت میزنه.big grin
اینم یکی از نمونه کارهام کلیپشو ببینید با کیفیت کم گذاشتم با حجم 900 کیلوبایت بذار همه بتونن دانلود کنن:
http://s5.picofile.com/file/8127041492/charSysUnity_mp4_sajjad3011.zip.html
از zip در بیرید mp4 هست
۲ نظر موافقین ۰ مخالفین ۰ ۰۵ مهر ۹۴ ، ۱۷:۵۰
مدیرکل
منبع :gameover.blog.ir
نکته:محور Y یعنی خود محور  به سمت بالا و پایین هست و چرخش حول این محور به معنی چرخش به چپ و راست هست.
دوربین رو بذارید پشت player و در زیرشاخه player.
سپس اسکریپت زیر رو بدید به 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); 
}
معمولا اسکریپت های کوچکی که توی وبلاگ می ذاریم رو سعی می کنیم خودمون طراحی کنیم.نظر یاتون نره.موفق باشید.
۰ نظر موافقین ۰ مخالفین ۰ ۰۵ مهر ۹۴ ، ۱۷:۴۳
مدیرکل

منبع:gameover.blog.ir
یه آرایه از گیم ابجکت تعریف کن. بعدش توی  inspector اندازه رو توی پارامتر size تعیین کن مثلا 3 بده تا سه تا ورودی بهت بده. بعدش سه تا گیم ابجکت empty بساز توی hierarchy و اونا رو بکش بنداز روی ورودی ها. سپس توی صحنه پوزیشن(موقعیت) این empty game object ها رو  هرجور می خوای تنظیم کن. بعدش توی کد سیشارپ که به ماشین میدی کد حرکت مثل این رو بذار:

توی update بگو:

 اگه i=2 بود بره به پوزیشن 2 :

transform.position = Vector2.Lerp (transform.position, pos2,10* Time.deltaTime); 

وگرنه اگه i=3 بود بره به پوزیشن  3:

transform.position = Vector2.Lerp (transform.position, pos3,10* Time.deltaTime); 

وگرنه اگه i=1 بود بره به پوزیشن  1:

transform.position = Vector2.Lerp (transform.position, pos1,10* Time.deltaTime);

می تونی مقدار اولیه i رو توی تابع start برابر 1 بگیری.

توی کد برخورد با پوزیشن 1 مقدار i رو 2 کن

توی کد برخورد با پوزیشن 2 مقدار i رو 3 کن

توی کد برخورد با پوزیشن 3 مقدار i رو 1 کن.

--

روی کدها خوب فکر کنید ببینید چی گفتم. اگه موفق به نوشتن کد نشدید بگید براتون بسازم.
---
یه مثال هم قبلا زده بودم با برنامه اینو ببینید :

http://gameover.blog.ir/1394/05/30/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DB%8C%DA%A9-%D9%85%D9%88%D8%AC%D9%88%D8%AF-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-NPC-%D9%88-waypints-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C
http://s5.picofile.com/file/8153960892/wayPints_1.jpg
۰ نظر موافقین ۰ مخالفین ۰ ۰۵ مهر ۹۴ ، ۰۲:۳۳
مدیرکل
منبع:gameover.blog.ir
۰ نظر موافقین ۰ مخالفین ۰ ۰۴ مهر ۹۴ ، ۲۳:۲۸
مدیرکل
منبع:gameover.blog.ir

روش اول:

  Invoke("DoSomething", 10);//this will happen after 10 seconds



روش دوم:

//gameover.blog.ir
StartCoroutine(ExecuteAfterTime(10));

IEnumerator ExecuteAfterTime(float time)
 {
     yield return new WaitForSeconds(time);
 
     // Code to execute after the delay
 }




این تابع برای اجرای یک تابع بکار می ره.و اگه ازش استفاده کنیم با اسفاده از دستور yield می تونیم در هر نقطه از برنامه کار رو متوقف کنیم.وقتی coroutine ریسام میشه(resume به معنی ادامه دادن یا از سر گرفتن)دستور yield مقداری رو برگشت می ده. Coroutines در مواقعی که در حال مدلسازی رفتاری روی چند فریم هستیم،عالی است. Coroutine ها به طور مجازی سربار اجرایی(performance overhead) ندارند.تابع StartCoroutineمستقیما برگشت(return) داده می شود،همچنین می توانید نتیجه را yieldکرد.این باعث میشه که تابع صبر کنه تا زمانی که coroutine کارش تمام بشه بعدش دستورات بعدی رو از سر بگیره.

البته توی 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);
    }
}


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

ارسال داده های فرم به وب سرور :

کد سیشارپ:

(اسم اسکریپت باید طبق کلاس داخلی، WWWFormImage  باشه.

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 یا ... رو بدید.


۰ نظر موافقین ۰ مخالفین ۰ ۰۴ مهر ۹۴ ، ۲۲:۴۲
مدیرکل
منبع: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

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

http://www.sketchtoy.com

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

http://www.mediafire.com/download/5n31g677onxh2iu/HttpUtils2_db+downloader+online.zip


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

منبع: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;
      ۰ نظر موافقین ۰ مخالفین ۰ ۰۱ مهر ۹۴ ، ۱۳:۵۵
      مدیرکل

       منبع :gameover.blog.ir

      فکر کنم فقط بعضی هاشون انیمیشن دار هستن:

      http://tf3dm.com/3d-model/zombie-pack-5-zombies-fully-rigged-animated-5522.html

      http://tf3dm.com/3d-model/zombie-66495.html

      http://tf3dm.com/3d-model/romeo-zombie-84057.html

      http://tf3dm.com/3d-model/zombie-man-86116.html

      http://tf3dm.com/3d-model/engineer-zombie-96267.html

      http://tf3dm.com/3d-model/heavy-zombie-74177.html

      http://tf3dm.com/3d-model/soldier-zombie-69380.html

      http://tf3dm.com/3d-model/puo-53550.html

      http://tf3dm.com/3d-model/puo-80561.html

      http://tf3dm.com/3d-model/toon-zombie-41216.html

      http://tf3dm.com/3d-model/tf2-soldier-as-zombie-15511.html


      سگ زامبی:

      http://tf3dm.com/3d-model/zombie-dog-57394.html

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