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

آموزش مدل سازی با 3ds Max آموزش مدل سازی در Maya آموزش گرافیک کامپیوتری با OpenGL
آموزش ساخت بازی با C#‎ آموزش ساخت بازی حدس تصویر آموزش گنجینه برنامه نویسی اندروید
آموزش پروژه محور یونیتی Unity آموزش یونیتی Unity – ساخت منو آموزش ساخت بازی در ویژوال بیسیک
مجموعه آموزش های ساخت بازی ●  آموزش های رایگان تبلیغات دیجیتال هوشمند

امتیاز موضوع:
  • 6 رأی - میانگین امتیازات: 4.67
  • 1
  • 2
  • 3
  • 4
  • 5
برنامه نویسی و راهکارهایی در یونیتی
#31
تکنیک beast و نورپردازی lightmap و bake کردن صحنه به منظور پردازش کمتر و کارایی و کیفیت گرافیک بهتر:
این تکنیک بسیار موثر هست و به شدت کارایی داره و پردازش رو کم می کنه و بازی سازان بزرگ دنیا از این تکنیک در خیلی از بازی ها استفاده می کنند و به جزات می شه گفت یکی از قوی ترین تکنیک ها هست.

برای bake کردن ابتدا چند منبع نور نقطه ای (point light) یا ... رو توی صحنه بذارید . رنگ نورها و شدت اون ها رو به اندازه ی مطلوب و موقعیت دلخواه رو تنظیم کنید تا نور مورد نیاز روی گیم ابجکت دلخواهتون ایجاد بشه و صحنه رو از تاریکی در بیاره.

گیم ابجکت شما می تونه یک مدل uv map شده باشه و تکستچر هم روش انداخته باشید مهم نیست.

اونو انتخاب کنید و در کادر خصوصیات(inspector)در همون نواحی بالایی،روی دکمه ی select کلیک کنید تا پنل import settings باز بشه.

در قسمت Meshes به سربرگ Model و گزینه ی Generate Lightmap UVs رو فعال کنید.

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

دوباره در hierarchy(پنل اجزای صحنه) مدلتون رو انتخاب کنید و در پنل inspector گزینه ی Static رو فعال کنید.

برای بقیه ی مدل هاتون هم که میخواید نور ثابت یا static داشته باشید کافیه عملیات فوق رو تکرار کنید.

حالا وقت Lightmapping هست.

از پنجره ی Window گزینه ی Lightmapping رو انتخاب کنید تا پنل مربوط باز بشه.

حالا می تونید روی bake scene کلیک کنید تا صحنه bake بشه. باید کمی صبور باشید.

نکته ی مهم: دقت کنید که تمام نورها رو باید در صحنه بذارید و یک بار فرصت bake دارید و نمی تونید یک بار bake کنید و بعد مثلا بعضی نورها رو حذف و اضافه کنید و دوباره bakeکنید. یعنی نه اینکه نمی شه بلکه با هر بار baking همه چیز از نو انجام خواهد شد و اگه نوری حذف شده باشه حتی baking قبلی هم حذف خواهد شد.wink
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط محمدمهدی علیجانی ، aliheadari
#32
ایولللللللللللللللللل
من دارم بازی د بعدی میسازم کمک میکنی ؟؟؟؟سجادwhat
پاسخ
 سپاس شده توسط sajjad3011
#33
حرکت یک گیم آبجکت روی سطح شیب دار

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

resim

یک روش آن است که از raycast برای چک کردن collider زیر player (یا شی در حال حرکت روی سطح شیب دار که در اصطلاح به آن Walker هم می گوییم) استفاده کنیم.اما Walker در حین حرکت به اطراف و با توجه به تغییرات باید مثل سنجاب نگاه کند.(منظورش زاویه چرخش هست).در عوض ما دو اشعه(ray) را پرتاب می کنیم.هر کدام برای یک طرف Walker:
کد php:
bool doubleRaycastDown(TerrainMovementRayProperties movementRayfloat rayLength,
        
out RaycastHit leftHitInfoout RaycastHit rightHitInfo)
{
    
Vector3 transformUp transform.up;
    
Vector3 transformRight transform.right;
    
Ray leftRay = new Ray(transform.position movementRay.originOffsetY transformUp
        
movementRay.distanceFromCenter transformRight, -transformUp);
    
Ray rightRay = new Ray(transform.position movementRay.originOffsetY transformUp
        – movementRay
.distanceFromCenter transformRight, -transformUp);

    return 
Physics.Raycast(leftRayout leftHitInforayLengthDefaultTerrainLayerMask)
        && 
Physics.Raycast(rightRayout rightHitInforayLengthDefaultTerrainLayerMask);

اگر هر دو ray به یک کالیدر با لایه ی مناسب برخورد کرد،ما میانگین position و بردارهای normal نتیجه شده ی ابجکت های RaycastHit را بکار برده و از آنها به ترتیب برای تنظیم و موقعیت دهی Walker استفاده خواهیم کرد.این کار آسان است:
کد php:
void positionOnTerrain(RaycastHit leftHitInfoRaycastHit rightHitInfo,
        
float maxRotationDegreesfloat positionOffsetY)
{
    
Vector3 averageNormal = (leftHitInfo.normal rightHitInfo.normal) / 2;
    
Vector3 averagePoint = (leftHitInfo.point rightHitInfo.point) / 2;

    
Quaternion targetRotation Quaternion.FromToRotation(Vector3.upaverageNormal);
    
Quaternion finalRotation Quaternion.RotateTowards(transform.rotationtargetRotation,
        
maxRotationDegrees);
    
transform.rotation Quaternion.Euler(00finalRotation.eulerAngles.z);

    
transform.position averagePoint transform.up positionOffsetY;


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

در این روش،برای اینکه یک حرکت واقع گرایانه تری داشته باشیم باید کمی بیشتر راه رویم.همچنین Walker تمایل به گیر کردن در انواع خاصی از چاله ها و گودی ها دارد.برای غلبه بر این مشکل ما یک اشعه ی افقی کوتاه را در جهت حرکت،اضافه کردیم که تا حد لبه ی بدن کاراکتر بسط می یابد.اگر این ray با هر قطعه از زمین برخورد(collide) کند،اشعه ی رو به پایین(downward ray)آن سمت از Walker را باطل می کند.
کد php:
if(rigidbody.velocity.sqrMagnitude 0)
{
    
//if moving left
    
if(MathUtilities.VectorSimilarity(rigidbody.velocityselfTransform.right) > 0)
    {
        
RaycastHit overrideLeftHitInfo;
        
Ray overrideLeftRay = new Ray(transform.position
            
horizontalRayProperties.originOffsetY selfTransform.upselfTransform.right);
        if(
Physics.Raycast(overrideLeftRayout overrideLeftHitInfo,
            
horizontalRayProperties.attachedRayLengthDefaultTerrainLayerMask))
        {
            
leftHitInfo overrideLeftHitInfo;
        }
    }
    
//if moving right
    
else
    {
        
RaycastHit overrideRightHitInfo;
        
Ray overrideRightRay = new Ray(transform.position
            
horizontalRayProperties.originOffsetY selfTransform.up, -selfTransform.right);
        if(
Physics.Raycast(overrideRightRayout overrideRightHitInfo,
            
horizontalRayProperties.attachedRayLengthDefaultTerrainLayerMask))
        {
            
rightHitInfo overrideRightHitInfo;
        }
    }


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

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

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

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

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

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

resim
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط m.esi ، M2_DR ، aminblog76 ، aliheadari ، qwerty13
#34
ببخشید این TerrainMovementRayProperties اسم یه کلاس پیشفرض هست ؟
پاسخ
#35
نمی دونم به اونش دقت نکرده بودم. کد رو از همون لینک که منبعشو معرفی کردم کپی پیست کردم.توی اینترنت هم می گردم سه تا لینک بیشتر نمیاره.ولی به نظر یه نوع داده هست یا به قول تو یک کلاس هست که خوب کامل توضیح نداده متاسفانه ویلا ترجمه می کردم برات.
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط m.esi
#36
ساخت یک توپ و گرفتن امتیاز با هر بار کلیک یا لمس صفحه و کم شدن امتیاز در هر برخورد توپ با زمین:
resim
یک Sphere بذارید روی صحنه و یک کامپوننت RigidBody بدید بهش.
یک Plane بذارید زیر Sphere (یکم پایین ترش) به عنوان زمین(دقت کنید که sphere یا توپ توی زمین فرو نرفته باشه چون می افته پایین)
یک اسکریپت js ایجاد کنید مثل زیر و بدید به Sphere.
کد php:
public var throwSpeed float 0.05;
var 
speed float 0.1;
public var 
emtiaz:float=10;
public var 
ruye_zamin=0;
 function 
Update () {
     
speed Mathf.Lerp(speed0Time.deltaTime);
     
transform.Translate(Vector3.up speed);
     if (
Input.GetMouseButtonDown(0))
          {
         
speed throwSpeed;
         
ruye_zamin=0;
         
emtiaz+=1;
         
Debug.Log("Emtiaz : " emtiaz.ToString() );
         }
 } 
 function 
OnCollisionEnter(collision Collision) {
 if(
collision.gameObject.name=="Plane" && ruye_zamin==0
 {
 
ruye_zamin=1;
 
emtiaz-=1;
 
Debug.Log("Emtiaz : " emtiaz.ToString() );
 }

 } 
اجرا بگیرید.
با کلیک روی توپ امتیاز میارید و هربار که به زمین برخورد می کنه امتیاز کم میشه(با هر برخورد یک واحد کم میشه)
می تونید رکورد بزنید.
بقیه رو خودتون روش کار کنید.
(برای تنظیم دوربین می توی نید روی صحنه ی دلخواه برید و و دوربین رو انتخاب کرده و ctrl+shift+F بزنید تا دوربین رندر روی نمای جاری set بشه)
اینم ویدئوی نمایشی:
http://s4.picofile.com/file/8181869792/v...1.zip.html
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط TakOn1 ، aminblog76
#37
دانلود فایل و ذخیره در محل پروژه توسط سیشارپ در یونیتی :

کد php:
using UnityEngine;
using System.Collections;

public class 
NewBehaviourScript MonoBehaviour {
    public 
string url "http://sajjad3011.xzn.ir/sajjad3011.avi";
    
IEnumerator Start() {
        
WWW www = new WWW(url);
        yield return 
www;
        
//renderer.material.mainTexture = www.texture;
        //save downloaded File
        
System.IO.File.WriteAllBytes("sajjad3011.avi"www.bytes);
        
Debug.Log (Application.persistentDataPath);
    }


عکسی از اجرای اسکریپت و فایل avi دانلودی و ذخیره در مسیر جاری پروژه:
resim

نکته 1: لینک دانلود باید مستقیم باشه. نه اینکه مثل picofile ابتدا دکمه ی دانلود رو بزنیم و بعدش لینک دانلود بیاد.
نکته 2: بعضی اوقات با خطایی مثل این مواجه بشیم:
کد:
couldn't connect to host
که به علت دستکاری تنظیمات پ_ر_ا_ک_30 یونیتی یا قندشکن شما ممکن هست باشه .منظورم همون تنظیماتی هست که برای دانلود از asset store در بخش environment variables از device manager انجام دادید.که در اینجا قبلا بحثش شده بود: http://promakers.ir/showthread.php?tid=8255
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط aminblog76
#38
تعریف لیست در یونیتی(زبان برنامه نویسی: سیشارپ):
مثال :
با دستور زیر لیست moreInts از نوع int تعریف می شود و مقدایر 10 و 2 به ترتیب به انتهای آن اضافه شده و جمع آن ها در متغیر صحیح sum ذخیره می گردد :
کد php:
List<intmoreInts = new List<int>();
moreInts.Add(10);
moreInts.Add(2);
int sum moreInts[0] + moreInts[1]; 
مثال:
با دستورات زیر یک لیست تعریف می شود که هر سلول آن می تواند یک شی Person (از قبل تعریف شده) را در خود ذخیره کند.
سپس اسم شخص و رنگ و شماره :
کد php:
//personList.Cs is a Csharp Script in Unity Editor
//This script defines a List<> that can hold only Person objects.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class 
personList MonoBehaviour {
    
//-------------------------------
    
public class Person
    
{
        public 
int Age {getset;}
        public 
string FirstName {getset;}
        public 
string LastName {getset;}
        public 
Person(){}
        public 
Person(string firstNamestring lastNameint age)
        {
            
Age age;
            
FirstName firstName;
            
LastName lastName;
        }
        public 
override string ToString()
        {
            return 
string.Format("Name: {0} {1}, Age: {2}",
                                 
FirstNameLastNameAge);
        }
    }
    
//-------------------------------
    // Use this for initialization
    
void Start () {
        List <
PersonmorePeople = new List<Person>();

        
morePeople.Add(new  Person("Sajjad""SeHezar"11));
        
morePeople.Add(new  Person("Pro""Makers"2017));
    
        
Debug.Log(morePeople[0]);
        
Debug.Log(morePeople[1]);
    }
    



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

تابع public override string ToString باعث ایجاد امکان تبدیل به صورت فرمت رشته ای میشه.


در دستور string.Format پارامتر اول فرمت و پارامتر های بعی مقادیر هستند.

نکته : برای اینکه string.Format شناسایی بشه باید از دستور using System.Collections.Generic در بالای برنامه استفاده کنیم.چون تابع Format در کلاس Generic تعریف شده است.

دستورات get و set که به صورت {get; set;} اومده به طور خودکار تعریف میشه و این دستورات به ما این امکان رو می دن که با گذاشتن یک نقطه و سپس get یا set بتونیم مقدار بدیم یا مقدار فعلی متغیر رو بخونیم.

تابع public Person که همنام کلاس Person هست به ما امکان دریافت مستقیم ورودی ها رو میده.

دستور return هم توی C بخونید(باعث برگشت یک مقدار به جایی میشه که متد ToString یا تابع مربوط رو صدا بزنیم.)

در تابع Start با استفاده از دستور :
کد:
        List <Person> morePeople = new List<Person>();
سپس با کدهای زیر مشخصات دو شخص رو به انتهای لیست اضافه می کنیم.(عضو اول سلول اندیس 0 و عضو دوم روی سلول اندیس 1 قرار می گیره):
کد:
        morePeople.Add(new  Person("Sajjad", "SeHezar", 11));
        morePeople.Add(new  Person("Pro", "Makers", 2017));
سپس با کد زیر مشخصات رو به خروجی می بریم :
کد:
        Debug.Log(morePeople[0]);
        Debug.Log(morePeople[1]);

خروجی :


Name: Sajjad SeHezar, Age: 11

Name: Pro Makers, Age: 2017

resim
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط aminblog76 ، aliheadari ، qwerty13
#39
نمایش یک متن روی صفحه توسط اسکریپت سیشارپ در یونیتی:
برای اینکار از کتابخانه ی GUI و توابع تعریف شده در اون استفاده می کنیم.(مثل LabelArea و Rect . البته از Rect که مخفف Rectangle به معنی ناحیه مستطیلی هست)

کد php:
//displayText.Cs
//Display text or Label over screen in Unity
//Author:Sajjad3011
using UnityEngine;
using System.Collections.Generic;


public class 
displayTextMonoBehaviour
{
    public 
GUIStyle style;
    public 
string result "";
    
    
void OnGUI(){
        
        
GUI.TextArea(new Rect(1,1,200,10)," Hello World ",style);
        
//or
        
GUI.Label(new Rect(1,20,200,40), " Hello World (again) ",style);
    }

خروجی:
resim

نمایش پیام Hello World با استفاده از کدهای ASCII :

کد php:
using UnityEngine;
using System.Collections.Generic;
//HellowWolrld.Cs
//Author:Sajjad3011
//Promakers.ir
//show Hellow Wolrld ! using ASCII codes

public class HellowWolrldMonoBehaviour
{
    public 
string result "";
    
void Start()
    {
        List<
intiList = new List<int>(new int[] { 072101,108108111032119111114108100033 });//show Hellow Wolrld !

        
        
foreach (int i in iList.ToArray())
            
result += ((char)i).ToString();
        
        
Debug.Log(result);

    }


خروجی :
resim
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ
 سپاس شده توسط aliheadari ، qwerty13
#40
نکته ای مهم در مورد برنامه ی نویسی GUI در یونیتی :
کدهای مربوط رو (مثل اسم فونت،اندازه ی فونت) بهتره در تابع onGUI بنویسیم وگرنه ممکنه درست عمل نکنن بعضی وقت ها.
نوع داده ی IEnumerator در یونیتی + دستور yield :
معمولا زمانیکه که از بخوایم کارایی یا performance کم نشه و در مورادی که برنامه نویسی ارتباط به شبکه یا اینترنت کلاس www برای دانلود یا توقف با دستور yield رو بخوایم پیاده سازی کنیم بهتره تابع Start از نوع IEnumerator باشه و نه void.
IEnumerator به ما اجازه ی توقف چند ثانیه ای رو با استفاده از تابع WaitForSeconds فراهم می کنه که باعث میشه CPU بیش از حد در انتظار یا حالتی که بهش در اصطلاح خمیدگی یا hogging گفته میشه به سر نبره.
مثال:همون مثالی رو که قبلا برای دانلود فایل (کد سیشارپ)زدم دوباره می یارم :
کد php:
//downloadSaveFile.Cs
using UnityEngine;
using System.Collections;
//using System.Collections.Generic;

//Download and save File on Device
//Unity3d game engine
//Author:Sajjad3011
public class downloadSaveFile MonoBehaviour {
    public 
WWW www ;
    public 
string url "http://sajjad3011.xzn.ir/sajjad3011.avi";

    
IEnumerator Start() {
        
www= new WWW(url);
        yield return 
www;
        
//save downloaded File
        
System.IO.File.WriteAllBytes("sajjad3011.avi"www.bytes);
        
Debug.Log (Application.persistentDataPath);
        
Debug.Log (www.error.ToString ());
    
    } 
https://cafebazaar.ir/app/ir.s.s.hek.nokh/?l=fa
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.




پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star آموزش یونیتی از سایت یونیتی ali.z 0 156 25/4/1396، 03:49 عصر
آخرین ارسال: ali.z
  آموزش شیدر نویسی در یونیتی قسمت 1 ErfanAhmadi 15 5,462 15/3/1396، 05:53 عصر
آخرین ارسال: mamali me
  آموزش یونیتی از مبتدی تا متوسط برنامه ریزی شده amirhosein.raad 24 3,741 26/2/1396، 08:24 عصر
آخرین ارسال: TakOn1
  پرداخت درون برنامه ای بازار sajjad3011 0 478 4/10/1394، 10:41 عصر
آخرین ارسال: sajjad3011
Big Grin دانلود کتاب فارسی آموزش کامل زبان برنامه نویسی پایتون Teshne 3 1,392 19/2/1394، 06:25 عصر
آخرین ارسال: sajjad3011



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