gameover.blog.ir
برای اینکه تکستچر کش نیاد:
شما باید رو تکسچری که ایمپورت کردید کلیک کنید و از روی 2d sprite به texture تغییر بدین و از وارپ مود گزینه repeat رو بزنیین و apply کنید.
تکستچر رو هم باید بندازید روی یک متریال فکر کنم. بعدش متریال رو drag کن روی ابجکت دلخواه.
gameover.blog.ir
به لینک زیر برید و چند ثانیه صبر کنید سپس رد تبلیغ رو بزنید.
اسکریپت سیشارپ هست.
برای لرزش دوربین پس از انفجار x و y و یکم حرکت بدید تا دوربین تکون بخوره .
روش دیگه اینه که می تونید یک انیمیشن ساده هم بدید به دوربین یه لحظه سریع تکون بخوره..
GAMEOVER.BLOG.IR
به لینک برید و چند ثانیه منتظر بمونید سپ رد تبلیغ رو بزنید.
اسکریپت اول:
اسکریپت دوم:
در این اسکریپ مهم نیست دوربین orthographic باشه یا perpective.
http://opizo.com/SKCz8Jgameover.blog.ir
حرکت پلیر سه بعدی با استفاده از کاراکتر کنترلر و دستور Input.GetAxis("Horizontal") بدون افت فریم ریت:
دستور Input.GetAxis چیست و چگونه کار می کند؟
این دستور کلیدهای افقی و عمودی WASD رو چک می کنه.
اگه هیچکدوم فشرده نبود صفر 0 برگشت میده ویلا یا منفی یک -1 یا مثبت یک +1 برگشت میده.
WS بالا پایین یا عمودی
AD چپ و راست یا افقی
خودمون تعیین می کنیم کدوم رو چک کنه.
اگه افقی فلش چپ و راست AD باید ورودی بدیم horizontal .
مثال:
Input.GetAxis("Horizontal")
اگه عمودی فلش بالا پایین WS باید ورودی بدیم vertical .
مثال:
Input.GetAxis("Vertical")
حالا کجا ازش استفاده میشه؟
برای حرکت کاراکتر میایم xz رو تنظیم می کنیم. x یعنی چپ راست و z یعنی جلو عقب بر حسب مثبت یا منفی بودن مقداری که بهشون میدیم.
پس برای مثال داریم:
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical"));
چون محاسبات محلی هست بایستی به جهانی تبدیل کنیم. پس داریم:
moveDirection = transform.TransformDirection(moveDirection);
دستور Transform Direction، مقادیر XYZ محلی را به مقادیر جهانی تبدیل میکنه.
بعدش یه فاکتور یا متغیر سرعت هم که قبلا باید تعریف کنیم در اون ضرب می کنیم تا مقدار زیاد بشه :
moveDirection *= speed;
در نهایت ازش استفاده میکنیم.
مثلا برای پرش میایم y رو تنظیم می کنیم:
if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; }
jumpSpeed هم متغیری هست قبلا فرض کردیم تعریف شده و سرعت پرش رو مشخص می کنه.
نکته: در حالت پیش فرض، کلید پرش، کلید space است.
ولی شخصیت ما چطوری بعد از پرش به زمین فرود بیاد؟
فرض می کنیم player ما کامپوننت rigidBody نداره .پس شرط بذارید تا زمانیکه y از صفر بیشتر بود این خط اجرا بشه:
moveDirection.y -= gravity * Time.deltaTime;
gravity هم جاذبه هست و از قبل تعریف می کنیم.
Time.deltaTime باعث میشه y طبق زمان کم بشه نه در فریم.(پس یه حرکت فرود نرم تر خواهد داشت)
در نهایت بای یک متغیر از نوع CharacterController بسازید و کامپوننت کاراکتر کنترلر بدید به player و drag کنید روی این متغیر:
public CharacterController controller;
برای حرکت نهایی هم این کد رو بنویسید:
controller.Move (moveDirection * Time.deltaTime) ;
using UnityEngine; using System.Collections; public class RotateCamera : MonoBehaviour { private Vector3 moveDirection = Vector3.zero; void Update (){ float speed=5; float jumpSpeed=5; float gravity=5; float x,y,z; 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
using UnityEngine; using System.Collections; [RequireComponent(typeof(AudioSource))] public class ExampleClass : MonoBehaviour { public AudioClip clip; void Start() { AudioSource.PlayClipAtPoint(clip, new Vector3(5, 1, 2)); } }
gameover.blog.ir
void Start () { StartCoroutine ("Countdown", 10); } private IEnumerator Countdown(int time){ while(time>0){ Debug.Log(time--); yield return new WaitForSeconds(1); } Debug.Log("Countdown Complete!"); }
gameover.blog.ir
برای اینکار باید متغیر Z از پوزیشن دوربین رو زیاد و کم کنید تا دوربین نزدیک یا دور بشه.
مثال:
اسکریپتی بسازید و بدید به دوربین اصلی و این کد رو در تابع آپدیت بذارید(با کلید A و S تست کنید بعد از اجرا):
void Update(){ if (Input.GetKey (KeyCode.A)) { this.transform.position+=new Vector3(0,0,1); } if (Input.GetKey (KeyCode.S)) { this.transform.position-=new Vector3(0,0,1); } }
gameover.blog.ir
نکته: اگه دانلود نشد با شیلتر فکن باز کنید
به لینک زیر رفته 14 ثانیه صبر کرده سپس رد تبلیغ بزنید:
gameover.blog.ir
آنتی آلیاس اگه 1 و 2 و 4 باشه به ترتیب مضاعف میشه و پیکسلی بودن گوشه های مدل رو حذف می کنه و کیفیت میره بالا اما پردزش سنگین میشه و بازی تیک و لگ بر می داره و ممکنه بعضی وقتا کرش کنه.
بدون آنتی آلیاس گوشه ها دندانه دار یا در اصطلاح jagged میشه(اما پردزش بهتره):
بدون آنتی آلیاس:
برای رفع این مشکل آنتی آلیاسینگ رو صفر می کنیم:
QualitySettings.antiAliasing = 0;
gameover.blog.ir
سورس انگری بردز ساده در یونیتی 5.1.0f3
gameover.blog.ir
GetComponent رو توی آپدیت ننویسید سعی کنید کش کنید
cache یعنی ادرس محسابه شده ی حافظه رو بریزید تو متغیر دیگه و از اون
رفرنس استفاده کنیدبعد از _transform استفاده کنید. برای ریجید بادی هم
همین تکنیک رو بکار بگیرید
تو استارت که می ذاری یک بار می ره آدرس حافظه رو پیدا می کنه.
void Start(){ _transform = this.transform;//cache for optimization }
gameover.blog.ir
یعنی محدود کردن. مثلا متغیری رو با تابع Clamp بین 1 و 10 محدود می کنیم تا اگه مقداری کمتر یا بیشتر بود در inspector به طور خودکار به میزان حداکثر یا حداقل تنظیم بشه.
gameover.blog.ir
دقت کنید برای اینکار یک اشعه یا ray باید به سمت جلو یا forward تا فاصله(distace) دلخواه پرتاب کنیم. در صورتی که برخورد صورت گرفت باید تشخیص بدیم با چی برخورد انجام شده. برای اینکار ابتدا به درب یک برچسب یا تگ(tag) دلخواه مثلا door می دیم. سپس از طریق کد بررسی می کنیم اگر با درب برخورد داشتیم یا درب روبروی دید دوربین بود انیمیشن باز شدن درب اجرا بشه.
نکته ی مهم: شما باید گزینه ی loopTime از انیمیشن خودتون رو در inspector غیرفعال کنید تا انیمیشن تکرار نشه.
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()
gameover.blog.ir
این تنظیمات در منوی Edit | Graphics Emulation هست. برای انتخاب شبیه ساز کارت های گرافیکی ایکس باکس و کنسول و اینتل و ان ویدیا و موبایل و غیره.
البته شبیه ساز ها کمی سیستم رو کند می کنن(مثل برنامه blue Stacj وسه شبیه سازی اندروید روی سیستم که سخت افزار رو شبیه سازی می کنن)
gameover.blog.ir
مثال:
public Animator myAnimator; void Start(){ int randomValue=Random.Range(0,3); myAnimator.SetInteger("AttakType",randomValue); }
gameover.blog.ir
using UnityEngine; public class MyScript : MonoBehaviour { void OnGUI() { #if DEMO GUILayout.Label("This is a demo version"); #endif } }
gameover.blog.ir
با استفاده از این پکیج می تونید یک اجرا کننده ی فایل mp3 ایجاد کنید و فایل های صوتی رو اجرا کرده،پاز یا استاپ کنید. و همینطور با لمس یا کلیک دکمه ی next و prev به فایل صوتی بعدی یا قبلی سوئیچ کنید. البته باید لیست فایل ها رو از قبل درون برنامه جاسازی کنید. به هر حال به درد زمانی می خوره که می خواید حین بازی بین اهنگ های موجود سوئیچ کنید و با اون اهنگ دلخواه ، بازیتون رو ادامه بدید یا ایده های دیگه ای از این قبیل که می تونید خودتون اون رو ویرایش کنید.
state machine behaviour ها توسط C# سیشارپ ایجاد شدند.
همه ی state machine behaviour ها از کلاس پایه ی یکسانی ارث می برند:StateMachineBehaviour
از آنجا که آنها از ارث بری(inheritance) پشتیبانی می کنند،اگر تابعی وجود داشته باشد می توانید آن را به کلاسهای چندگانه بیافزایید.
سپس به آسانی می توان به آن دست یافت.
برای اطلاعات بیشتر در مورد inheritance (ارث بری) اطلاعات پیوست شده در زیر را بخوانید.
override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { }
The Animator parameter is a reference to the specific animator
that this state machine behaviour is on.
For example, this could be used to set the values of animator parameters that were only necessary in this state, such as those for a blend tree.
The AnimatorStateInfo is the current info for the state that the state machine behaviour is on. It is the equivalent of writing animator.GetCurrentStateInfo(layerIndex); This can be useful in operations that involve the normalised time of the clip.
The layerIndex is the layer the state machine behaviour’s state is on. For example, zero for the base layer, one for the first, and so on.
As with MonoBehaviours, the functions of a StateMachineBehaviour are called under specific circumstances.
OnStateEnter is called on the first frame of the state being played.
OnStateUpdate is called after MonoBehaviour Updates on every frame whilst the animator is playing the state this behaviour belongs to.
OnStateExit is called on the last frame of a transition to another state.در آخرین فریم یک انتقال به وضعیت دیگر فراخوانی می شود
OnStateMove is called before OnAnimatorMove would be called in MonoBehaviours for every frame the state is playing. When OnStateMove is called, it will stop OnAnimatorMove from being called in MonoBehaviours.
OnStateIK is called after OnAnimatorIK on MonoBehaviours for every frame the while the state is being played. It is important to note that OnStateIK will only be called if the state is on a layer that has an IK pass. By default, layers do not have an IK pass and so this function will not be called. For more information on IK see the information linked below.
OnStateMachineEnter is called on the first frame that the animator plays the contents of a Sub-State Machine.
OnStateMachineExit is called on the last frame of a transition from a Sub-State Machine.
مثال:
using UnityEngine; public class SpecialAttackParticlesSmb : StateMachineBehaviour { public GameObject particles; // Prefab of the particle system to play in the state. public AvatarIKGoal attackLimb; // The limb that the particles should follow. private Transform particlesTransform; // Reference to the instantiated prefab's transform. private ParticleSystem particleSystem; // Reference to the instantiated prefab's particle system. // This will be called when the animator first transitions to this state. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // If the particle system already exists then exit the function. if(particlesTransform != null) return; // Otherwise instantiate the particles and set up references to their components. GameObject particlesInstance = Instantiate(particles); particlesTransform = particlesInstance.transform; particleSystem = particlesInstance.GetComponent <ParticleSystem> (); } // This will be called once the animator has transitioned out of the state. override public void OnStateExit (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // When leaving the special move state, stop the particles. particleSystem.Stop(); } // This will be called every frame whilst in the state. override public void OnStateIK (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // OnStateExit may be called before the last OnStateIK so we need to check the particles haven't been destroyed. if (particleSystem == null || particlesTransform == null) return; // Find the position and rotation of the limb the particles should follow. Vector3 limbPosition = animator.GetIKPosition(attackLimb); Quaternion limbRotation = animator.GetIKRotation (attackLimb); // Set the particle's position and rotation based on that limb. particlesTransform.position = limbPosition; particlesTransform.rotation = limbRotation; // If the particle system isn't playing, play it. if(!particleSystem.isPlaying) particleSystem.Play(); } }
override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { player = GameObject.Find(“Player”); }
using UnityEngine; public class ExampleMonoBehaviour : MonoBehaviour { private Animator animator; // Reference to the Animator component on this gameobject. private ExampleStateMachineBehaviour exampleSmb; // Reference to a single StateMachineBehaviour. void Awake () { // Find a reference to the Animator component in Awake since it exists in the scene. animator = GetComponent <Animator> (); } void Start () { // Find a reference to the ExampleStateMachineBehaviour in Start since it might not exist yet in Awake. exampleSmb = animator.GetBehaviour <ExampleStateMachineBehaviour> (); // Set the StateMachineBehaviour's reference to an ExampleMonoBehaviour to this. exampleSmb.exampleMb = this; } }
using UnityEngine; public class ExampleStateMachineBehaviour : StateMachineBehaviour { public ExampleMonoBehaviour exampleMb; }
gameover.blog.ir
پکیج EhneHeacy 1.3.1 یک پکیج بسیار پر ترفدار برای کاربرانی است که با نرم افزار یونیتی 3D کار میکنند
این پکیج کار شما را ساده تر میکند مثلا برای فعال یا غیر فعال کردن آبجکت ها را آسان میکند
در کل این پکیج پنجره ی Hierarchy را که در نرم افزار یونیتی میباشد را پیشرفته میکند
و همچینین امکانات این پنجره را بیشتر میکند
از نظر من حتما دانلود کنید زیرا که سریع تر میتوانید پروژه ی خود را تکمیل کنید !!!!!!!
(منبع اش یادم نیست ویلا میذاشتم)
gameover.blog.ir
به لینک زیر برید و چند ثانیه صبر کنید و سپس رد تبلیغ رو بزنیدرمز: ams
gameover.blog.ir
Edit -> Project Settings -> Physics
در این قسمت لایه های تعریف شده نشون داده میشه.
می تونید مثلا چند cube تو لایه دلخواه بذارید بعدش تو ماتریس تصادم لایه هایی که می خواید برخورد صورت نگیره و rigidBody اون لایه ها روی هم عمل نکنه و در هم فرو بره رو در خروجی تست کنید.
مثلا به عکس زیر نگاه کنید:
لایه 1 با لایه 2 و 3 تصادم نخواهد داشت.و فیزیک اشیایی که در این لایه ها قرار بدیم روی هم تاثیری نداره.
لایه ی 2 با لایه 3 هم تصاد نداره.
می تونید اشیا رو تو لایه ها بذارید و از ارتفا بندازید زمین(بهشون ریجید بادی بدید) و نتیجه اجرا رو ببنید. اسم لایه ها رو دقت کنید طبق عکس تنظیم کنید. یا دلخواه.
gameover.blog.ir
مخفی کردن متغیر ها از inspector و hierarchy :
برای اینکار از این کدها کمک می گیریم :
HideFlags.HideInHierarchy; HideFlags.HideInInspector;مثال:
using UnityEngine; public class MyHideFlags : MonoBehaviour { public HideFlags myHideFlags; void OnEnable() { hideFlags = myHideFlags; } }
gameover.blog.ir
ابتدا به دشمن یک کاراکتر کنترلر بدید(با زدن دکمه add component) یا Component/Physics/Character Controller.
این دو خط رو سعی کنید بالای اسکریپت باشه(اگه تکراری بود باید حذف کنید):
using UnityEngine; using System.Collections;
public class Enemy : MonoBehaviour { public float speed = 4f; public float jetPackSpeed = 0.3f; public float jumpSpeed = 8f; public float gravity = 10; private Transform _Player; private CharacterController character; private Transform tr; private float vSpeed = 0f; private bool jump = false; void Start () { _Player = GameObject.FindGameObjectWithTag("Player").transform; character = GetComponent<CharacterController>(); tr = transform; } void Update () { // find the vector enemy -> player Vector3 chaseDir = _Player.position - tr.position; chaseDir.y = 0; // let only the horizontal direction float distance = chaseDir.magnitude; // get the distance if (distance <= 2) Debug.Log("Attacking Player"); else { // find the player direction Quaternion rot = Quaternion.LookRotation(chaseDir); // rotate to his direction tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * 4); if (character.isGrounded){ // if is grounded... vSpeed = 0; // vertical speed is zero if (jump){ // if should jump... vSpeed = jumpSpeed; // aplly jump speed jump = false; // only jump once! } } else // but if lost ground, check if it's an abyss if (!Physics.Raycast(tr.position, -tr.up, 20f)){ // if no ground below vSpeed = jetPackSpeed; // use jetpack } vSpeed -= gravity * Time.deltaTime; // apply gravity // calculate horizontal velocity vector chaseDir = chaseDir.normalized * speed; chaseDir.y += vSpeed; // include vertical speed // and move the enemy character.Move(chaseDir * Time.deltaTime); } } // if collided with some wall or block, jump void OnControllerColliderHit(ControllerColliderHit hit){ // only check lateral collisions if (Mathf.Abs(hit.normal.y) < 0.5){ jump = true; // jump if collided laterally } } }
gameover.blog.ir
سوال:
دوستان من یه مشکلی دارم اون اینکه تو 3d max قسمت هایی رو Detach می کنم
ولی وقتی وارد یونیتی می کنم اون قسمت ها به صورت شی تو خالی نمایش داده
میشه . کمک کنید بد جور گیر کردم .
عکس :
in 3dmax
in unity:
جواب:
بهش shell بدید.
gameover.blog.ir
این دو تابع با play بازی به صورت خودکار اجرا میشن..
awake سریعتر call (فراخوانی) میشه...
اگه تیک اسکریپت رو غیر فعال کنیم، تابع Awake فقط اجرا میشه ... ولی اگه اسکریپت فعال باشه اول awake و سپس Start اجرا میشه...
تابع start و awake فقط یکبار اجرا میشن...
دقت کنید که چه اسکریپت فعال باشه چه نباشه، awake همیشه اجرا میشه.... ولی start با فعال بودن اسکریپت، و همینطور بعد از Awake...
ولی update بارها call میشه مثل رویداد step توی game maker....
---
مثال :
اسکریپت سیشارپی به نام script1.cs ایجاد کنید و کد زیر رو بریزید توش:
using UnityEngine; using UnityEditor; using System.Collections; public class script1 : MonoBehaviour { void Awake () { Debug.Log("Awake called."); } void Start () { Debug.Log("Start called."); } }
gameover.blog.ir
هر فایل apk یک امضای الکترونیکی داره که مختص توسعه دهنده اون هست این امضای الکترونیکی رو فقط توسعه دهنده در اختیار داره
بیسیک هنگام کامپایل به صورت پیش فرض apk رو با debug key امضا میکنه که این امضا یک امضای عمومی هست و همه اون رو در اختیار دارن و مختض برنامه شما فقط نیست
گوگل پلی از همون ابتدا این قانون رو داشت که برنامه رو نباید با debug key آپلود کنید به نظر میرسه بازار هم به تازگی این قانون رو پیاده کرده که به نفع خود توسعه دهنده هست
--------------------
برای basic4android:شما برای حل این مشکل باید به قسمت Tools < private sign key برید و اطلاعاتی رو که برای یک امضای جدید لازمه وارد کنید تا فایل امضای شما رو در محل مورد نظر ذخیره کنه بعد شما هر وقت که خواستین کامپایل نهایی خودتون رو از برنامه بگیرید به قسمت Tools < private sign key برید و فایل امضای خودتون رو لود کنین و از برنامه کامپایل بگیرین
منبع :
gameover.blog.ir
اول بازیتون باید توی کافه بازار تایید بشه مثلا یه بازی رایگان که تایید شده.
اسمش هست com.sherkateMan.eseBarname
این com.sherkateMan.eseBarname رو کپی می کنی می برید توی adad.ir
بهتون یک شناسه می ده که اونو باید بذارید توی قسمت token در فایل AndroidManifest.xml
دمانیفست و فایل های jar رو جتما در پوشه ی assets->Plugins->Android میذارید
اگه پوشه نبود ایجادش کن.
بعدش اسکریپت سیشارپ رو نسبت میدین به پریفب و پریفب رو می کشیش تو صحنه
همین تمام
توی فایل مانیفست test mode رو روی false می ذاریم تا در حالت تست نباشه.
اینم فایل های لازم jar و prefab و اسکریپت سیشارپی که بای بدید به پریفب:
برای دانلود ابتدا به لینک زیر برید و چند ثانیه صبر کرده و سپس رد تبلیغ رو بزنید
نکته مهم: حتما از یونیتی 5.2 به بالا استفاده کنید چون یونیتی 5.1 و قدیمی تر تظیمات اینترنت و غیره رو به مانفست اعمال نمی کنه و باید دستی اعمال کنید اما یونیتی 5.2 به بالا خودکار تنظیمات نیاز به اینترنت و بعضی تنظیمات اصلی رو اعمال می کنه.
gameover.blog.ir
Overloading یا سربارگذاری:
متد های که نام یکسان دارند اما پارامتر های ورودی متفاوتی دارند، برای مثال public bool Retrieve() و public bool Retrieve(int id) در این مثال متد Retrieve دارای دو overload است. OverLoading زمانی است که شما چند متد همنام در یک محدوده (scope) با امضاهای (signatures) متفاوت دارید .
همچنین Overloading چند ریختی زمان کامپایل (Compile Time Polymorphism) می باشد .
//Overloading public class test { public void getStuff(int id) {} public void getStuff(string name) {} }
Overriding یک اصل یا قانون است که به شما اجازه می دهد تا قابلیت های متدها را در کلاس های مشتق شده تغییر دهید
همچنین Overriding چند ریختی زمان اجرا (Run Time Polymorphism) می باشد.
//Overriding public class test { public virtual getStuff(int id) { //Get stuff default location } } public class test2 : test { public override getStuff(int id) { //base.getStuff(id); //or - Get stuff new location } }
gameover.blog.ir
return برای توابعی بکار می ره که نوعشون void نباشه. مثل int یا float یا string یا ....
مثلا وقتی یک تابع جمع می نویسیم دو عدد رو جمع می کنیم باید مقدار حاصل رو
توی اسم تابع برگشت بدیم. دقت کن اسم تابع خودش یک متغیر هست.
اگه نوع تابعی void یا غیر برگشتی باشه تهش نباید return بزنیم ویلا خطا میده.
float sum(int a,int b){ return(a+b); }
gameover.blog.ir
پارامتر Trigger در پنجره ی Animator یک متغیر با اسم دلخواه از نوع Boolean هست که بعد از انتقال یا سوئیچ بین دو انیمیشن مقدارش خودکار False میشه.(نکته:صفر یعنی false و هر چیزی غیر از صفر یعنی True)
با کد سیشارپ هم میشه پارامتر رو True کرد خودکار:(ضمنا بعد از انتقال خودکار False میشه)
Animator.SetTrigger("esmeParameter");
Animator.ResetTrigger("esmeParameter");
gameover.blog.ir
یکی از تنظیمات occlusion culling و یکی از تنظیمات دیگه گزینه ی near
دوربین هست. near پارامتر نزدیک بودن هست.مثلا اگه بهش عدد 10 بدیم اشیا تا
10 متری رندر میشه و باقی رندر نمیشه مگه اینکه پلیر حرکت کنه و تا مرز ده
متر اشیا رندر میشه.
تکنیک دیگه اینه که بیایم خودمون اسکریپت بنویسیم ابتدا آرایه ای بسازیم که کل اشیای صحنه داخلش باشه.(یعنی از نوع GameObject باشه)
سپس Tag هر گیم ابجکت رو چک کنیم اگه غیر از tag زمین و خودمون بود شرط دوم رو اجرا کنیم و اون اینه :
با تابع Vector3.Distance به الگوی
public static float Distance(Vector3 a, Vector3 b);
دقت کنید اسکریپت test.cs زیر رو بدید به دوربین اصلی و دوربین رو بکشید روی متغیر mainCam رها کنید و یادتون نرده گیم ابجکت سه بعدی اسپرایت(sprite) دو بعدی شما حتما باید Collider سه بعدی(3d) داشته باشه نه box collider 2d یا ... .
به هر شی یک Tag بدید و بعد از اجرا روی هر شی دلخواه کلیک کنید اسم تگ رو برگشت میده. با بازی کردن و تغییر اسکریپت شما می تونید استفاه های بیشتری ببرید. موفق باشید
using UnityEngine; using System.Collections; //GameObject touch detection
//Author:sajjad3011
public class test : MonoBehaviour { public Camera mainCam; RaycastHit hit; void Update () { try{ Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) if (Input.GetMouseButtonDown(0)) {Debug.Log(hit.collider.tag);} } catch{ } } }
منبع:gameover.blog.ir
سازنده:گیم آور
در این آموزش دو صحنه ساده ایجاد می کنیم و دو دکمه می ذاریم که روی همه رزولوشن ها اجرا میشه و بهش رویداد کلیک می دیم و مرحله رو لود می کنیم.(بدون save)
آموزش خیلی ساده هست و فایل متنی PDF همراه اسکریپت وجود دارد. این آموزش برای افراد خیلی مبتدی هست که می خوان دکمه ای ایجاد کنن و می خوان با کلیک روی او یک عملی انجام بشه.
دانلود فیلم:
منبع:gameover.blog.ir
سازنده:گیم آور
تشکر و نظر یادتون نره اگه به دردتون خورد.
در
این فیلم آموزش ساخت یک گیم پلی سه بعدی برای اندروید و حرکت پلیر با جوی
استیک مجازی و تنظیم تکستچر زمین در یونیتی 5 رو یاد می گیرید .
به
کمک جوی استیک مجازی به سادگی پلیر رو حرکت می دید به چپ و راست و جلو و
عقب به همراه دکمه ی jump که با لمس عمل پرش رو برای پلیر انجام میده.
تکستچر زمین رو تنظیم می کنیم که کیفیت بهتر بشه از طریق تکرار و tiling.
خروجی هم با ctrl+shift+B می تونید خودتون روی android بسازید.
باز هم سوالی بود پشتیبانیتون می کنیم توی gameover.blog.ir و کانال تلگرام که توی وبلاگ لینک هست.
علت ساخت این آموزش این بود که برنامه نویسی سیشارپ شما بهتر بشه.
ضمنا سورس پروژه هم هست به همراه فایل متنی آموزش.
یادتون نره حتما باید برنامه 7zip رو برای باز کردن آموزش داشته باشید.
رمز : gameover
کیفیت فیلم عالی هست و کاملا واضح. هر مشکلی توی دانلود براتون پیش اومد توی کانال تلگرام و وبلاگ مطرح کنید ما لینک مستقیم آموزش رو روی mediaFire بهتون میدیم تا مستقیم دانلود کنید.
رایگان
فیلم:
سورس:
Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported in Unity 5. If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component. Scene hierarchy path "plane_h1", Mesh asset path "" Mesh name "Plane"
void Start(){ public static void Destroy(this, 5.1f); }
gameover.blog.ir
اموزش ساخت منو توقف بازی در یونیتی
کد توقف pause بازی در یونیتی:
Time.timeScale=0;
Time.timeScale=1;
توقف موقت بازی:private IEnumerator Pause(int p)
{
Time.timeScale = 0.1f;
yield return new WaitForSeconds(p);
Time.timeScale = 1;
}
private IEnumerator Pause(int p)
{
Time.timeScale = 0.1f;
float pauseEndTime = Time.realtimeSinceStartup + 1;
while (Time.realtimeSinceStartup < pauseEndTime)
{
yield return 0;
}
Time.timeScale = 1;
}
روش js:منسوخ
function PauseWaitResume (pauseDelay : float) { Time.timeScale = .0000001; yield WaitForSeconds(pauseDelay * Time.timeScale); Time.timeScale = 1.0; }
کد توقف بازی در یونیتی 5:
آرام کردن زمان در لحظه ی تیر زدن و حرکت slow motion:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { if (Input.GetButtonDown("Fire1")) { if (Time.timeScale == 1.0F) Time.timeScale = 0.7F; else Time.timeScale = 1.0F; Time.fixedDeltaTime = 0.02F * Time.timeScale; } } }
دوستان تازه کار کدها رو کپی پیست نکنید فقط سعی کنید یاد بگیرید مفهومش رو تا بتونید تغییر بدید. سوالی بود بپرسید.
GameObject.Rotation=new Vector(0,90,0);
gameover.blog.ir
کرک ورژن 5.X :
http://opizo.com/WpLPzb
https://s1.picofile.com/file/8226922692/Crack_UnitySetup64_5_2_1f1.zip.html
gameover.blog.ir
سازنده:مهدی+سجاد
این جلسه اسکریپت به شما برنامه نویسی way point آموزش داده میشه به طوری که می تونید به سرعت یاد بگیرید خودتون برنامه ای بنویسید تا در محیط ویرایش قبل از runTime یعنی محیط Scene Editor با استفاده از توابع Draw بین اشیای مختلف خط ارتباط ترسیم کنید تا بهتر از طراحی های خودتون مخصوصا در بازی های مهندسی شده استفاده کنید. کیفیت آموزش عالی هست و هر مشکلی بود توی وبلاگ ما و گروه تلگرام پاسخگو خواهیم بود انشاءا... .
gameover.blog.ir
کد روشن و خاموش کردن چراغ/روشن و خاموش کردن لامپ/خاموش و روشن کردن چراغ/خاموش و روشن کردن لامپ:
public GameObject lamp;
برای کلیک دکمه ی دلخواه این کد رو بذارید که هر بار not می کنه (علامت تعجب ! به معنی نات یا معکوس کردن از true به false یا بلعکس می باشد):
target.SetActive(!target.activeSelf);
gameover.blog.ir
تگ یا Tag عنی برچسب یا اسم مستعار.
توی html ما قبلا به چند تا ابجکت id می دادیم که ثابت بود و هر ابجکت یه
اسم ثابت داشت نمی تونستیم تغییرش بدیم ولی می تونستیم یه کلاس یا class
تعریف کنیم و همه ی ابجکت های لخواه رو از نوع اون کلاس تعریف کنیم یا
برچسب بزنیم. بعدش که میخواستیم تغییراتی روی اون ابجکت ها ایجاد کنیم دیگه
دستی اینکار سخت بود. کافی بود اسم اون کلاس رو داشته باشیم و خصوصیاتشو
دستکاری کنیم یا بهشون دستیابی داشته باشیم.
توی html چیزی بود تو مایه های tagByName یا tagByID که بهش ایدی میدادیم و
خودش همه رو لیست می کرد بعدش میریختیم توی ارایه و با یه حلقه ی تکرار به
کل ابجکت های ریخته شده توی ارایه دسترسی داشتیم و یه سری عملیات کلی روی
اونا انجام میدادیم.
توی unity یه چیز توی همون مایه ها هست یبه اسم tag.
مثلا من سه تا دوربین دارم:
cam1
cam2
cam3
--
به هر سه تاشون برچسب cam می زنم
بعدش با کدی مثل این همشون رو غیر فعال می کنم:
//Disable all cameras with tag 'cam' var cameras = GameObject.FindGameObjectsWithTag("cam"); for (var cams : GameObject in cameras) { cams.GetComponent(Camera).enabled = false; }بعدش با کد دوربین رو فعال می کنم:
منبع:gameover.blog.ir
http://www.mediafire.com/download/ur2egvx855irm9e/soldier_ArmyPilot-20Animation.7z
نکته :
باید حتما برنامه 7zip رو داشته باشید برای اینکه فایل فشرده شده با پسوند 7z هست.
gameover.blog.ir
بعد از چند ثانیه رد تبلیغ رو بزنید(حجم 14 کیلو بایت )
Bouncy.physicmaterial فیزیک ماده فنر
Collision_Material.physicMaterial فیزیک ماده ی تصادم یا برخورد
Ice.physicmaterial فیزیک ماده یخ
Metal.physicmaterial فیزیک آهن
Rubber.physicmaterial فیزیک لاستیک
Vehicle.physicMaterial فیزیک وسیله نقطه
Wood.physicmaterial فیزیک چوب
منبع:gameover.blog.ir
وکتور 4 پارامتر چهارم هست.
ما بردار 5 بعدی و .... هم داریم.
مثل آرایه ای که چند مقدار می گیره.
حالا اگه سه باشه بهش می گیم بردار سه بعدی.
اگه چهار باشه برای موارد خاص بکار می ره.
مثلا رنگ
Red
Green
Blue
اون آخری هم آلفا یا شفافیت نور.
بقیه رو بدو دوست من.
gameover.blog.ir
توی وبلاگ سعی می کنم مطالب رو از هیچ جایی نگیرم جز خود سایت یونیتی.
شکل زیر رو ببینید تکمیله نیاز به دیدن فیلم و ... هم نیست که این همه سایت سرگردون می کنه آدمو.
قسمت هایی که مکعب مستطیلی هست.اون نواحی فقط رندر میشه.(رندر به معنی اینه که پرداش بیشتری برای سایه زنی و .... انجام میشه نه اینکه اون بیرونی ها دیده نشن. اونا یه جوری مثل عکس یا حالت از پیش رندر شده دارن و پردازش اضافه نمیشن و مصرف بهینه میشه)
وب پیج رو zip کردم بعد از آنزیپ با فایرفاکس باز کنید. موفق باشید
منبع:gameover.blog.ir
Sprite spr1=Resources.Load<Sprite>("sprites/newSprite");//load Assets/Resources/sprites/newSprite.png GetComponent<SpriteRenderer> ().sprite = spr1;
نکته بسیار مهم:
پسوند فایل رو نباید توی کد قرار بدید.
همچنین مسیر باید اسلش داشته باشه. بک اسلش کار نمی کنه.طبق هلپ یونیتی.
نکته مهم بعدی:
مسیر فایل sprites/newSprite.png باید حتما در زیر شاخه ی زیر باشه حتما:
Assets/Resources
Rigidbody2D body2d; body2d = GetComponent<Rigidbody2D> (); if (condition) { body2d.constraints = RigidbodyConstraints2D.FreezePositionX; } else { body2d.constraints = RigidbodyConstraints2D.None; }
شلیک سینوسی در فضای سه بعدی به سمت هدفی که در روبروی ما قرار دارد
اگه می خوای دقیق و به صورت دایره ای و هوشمند بزنی به هدف:
اولا باید فاصله خودتو تا هدف محاسبه کنی
این با تابع Distance بدست میاد.
بعدش با معادله ی دایره،فیثاغوریث یا توابع مثلثات میزنی به هدف.
فرمولشم اینه:
X2=R*Cos(teta)+x1 y2=R*Sin(teta)+y1
در سه بعدی اگه بخوای به جلو بره این میشه:
به جای X1,Y1 مختصات دو بعد از گیم ابجکت گلوله رو باید بدی به طوری که رو به جلو باشه یعنی Z به جای X1 و Y هم به جای Y1 .
X2,Y2 رو بعدش بده تیر .
تتا رو از صفر تا 180 مقدار میدی
به R هم فاصله نقطه ایجاد تیر تانک تا هدف رو میدی.
مثلا یک حلقه while یا تایمر بنویس که تتا teta رو از منفی 90 تا مثبت 90 درجه دونه دونه زیاد کنه.
بعدش می گی:
//sajjad3011 teta=-90; float distance = Vector3.Distance(transform.position,hadaf.position); midz = distance / 2; while(teta<+90) { teta++; deltaZ=radius*cos((teta*3.14)/180); deltaY=radius*sin((teta*3.14)/180); z=z+midz+deltaZ; y=y+deltaY; position=new Vector3(this.position.x,y,z)//be x dast nemizanim chon Left/Right ro kari nadarim faghat z/jelo+y/bala }
بخوام توضیح بدم باید این برنامه رو درک کنی و فقط توی سه بعدی تجسم کن که حرکت ما به سمت جلو هست پس خودت توی فضا میری سمت راست فکر کن توی محیط حاضر هستی و پس می فهمی x همون z(یعنی حرکت به جلو در واقیت و حرکت به راست ما در تجسم ) هست و y همون y .
(رسم دایره با استفاده از مثلثات و حلقه تکرار):
http://gameover.blog.ir/1394/03/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%88-%D8%B3%D9%88%D8%B1%D8%B3-%DA%86%D8%B1%D8%AE%D8%B4-%D8%AF%D8%A7%DB%8C%D8%B1%D9%87-%D8%AD%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D8%B7%DB%8C%D9%84-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%B1%D9%85%D9%88%D9%84%D9%87%D8%A7%DB%8C-%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%DB%8C
تئوری کار همینا بود و اگه خطایی داشت با فکر کردن حلش کنید.
نکته آخر:
به جای حلقه ی تکرار بهتره حتما از تایمر کمک بگیرید و خودتون یک تایمر بنویسید چون حلقه های تکرار وقت پردازنده رو می گیرن و بهینه نیست.
var target : Transform; //the enemy's target var moveSpeed = 3; //move speed var rotationSpeed = 3; //speed of turning var range : float=10f; var range2 : float=10f; var stop : float=0; var myTransform : Transform; //current transform data of this enemy function Awake() { myTransform = transform; //cache transform data for easy access/preformance } function Start() { target = GameObject.FindWithTag("Player").transform; //target the player } function Update () { //rotate to look at the player var distance = Vector3.Distance(myTransform.position, target.position); if (distance<=range2 && distance>=range){ myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime); } else if(distance<=range && distance>stop){ //move towards the player myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime); myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } else if (distance<=stop) { myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime); } }
//tirZadan.csکد زیر هم به پریفب گلوله میدیم:
//Author:sajjad
//gameover.blog.ir
//@gameoverblog
using UnityEngine; using System.Collections; public class tirZadan: MonoBehaviour { // Use this for initialization public Transform emptyGameObject; public float distance; public GameObject enemy,prefBullet,bullet; public AudioClip shootAudio; public Transform shootPoint; float volumeSeda=1.0F;
int tedadTir=10;
void Update () { if (Input.GetButtonDown ("Fire1")) //age left_click shod { if(tedadTir > 0) { tedadTir--; bullet= Instantiate(prefBullet, emptyGameObject.position, Quaternion.identity)as GameObject; AudioSource.PlayClipAtPoint(shootAudio, shootPoint.transform.position, volumeSeda); } } }//update }
//bullet.cs
using UnityEngine; using System.Collections; public class bullet: MonoBehaviour { public RigidBoy rb; float distance=0.0f;//fasele sefr yani faghat vaghti tir barkhord kard be hadaf void Start(){ rb.AddRelativeForce(Vector3.forward );//partabe tir be samte jelo Destroy(gameObject, 3.0f);//hazfe tir pas az 3 sanie } void OnGUI(){ myRaycast(); } void myRaycast(){ RaycastHit hit; Ray myRay = new Ray(transform.position, Vector3.forward); if(Physics.Raycast (myRay, out hit, distance)){ if(hit.collider.tag == "enemy"){ Destroy(enemy); Destroy(this.gameobject); }//if }//if }//myRaycast }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public float speed = 10.0F; void Update() { Vector3 dir = Vector3.zero; dir.x = -Input.acceleration.y; dir.z = Input.acceleration.x; if (dir.sqrMagnitude > 1) dir.Normalize(); dir *= Time.deltaTime; transform.Translate(dir * speed); } }
using UnityEngine; using System.Collections; public class TiltAround : MonoBehaviour { private Quaternion localRotation; // public float speed = 1.0f; // ajustable speed from Inspector in Unity editor // Use this for initialization void Start () { // copy the rotation of the object itself into a buffer localRotation = transform.rotation; } void Update() // runs 60 fps or so { // find speed based on delta float curSpeed = Time.deltaTime * speed; // first update the current rotation angles with input from acceleration axis localRotation.y += Input.acceleration.x * curSpeed; localRotation.x += Input.acceleration.y * curSpeed; // then rotate this object accordingly to the new angle transform.rotation = localRotation; } }منبع:
در این آموزش با کیفیت عالی یاد می گیرید که در یونیتی انیمیشن دو بعدی بسازید و کاراکتر رو برای پرش و دویدن به چپ و راست انیمیت کنید و بعدش کدی با سیشارپ بنویسید که کاراکتر به همراه انیمیشن به حرکت در بیاد.
حجم آموزش: 128 مگ. بعد از آنزیپ دو برابر میشه حجمش.
نکته : باید برنامه 7 zip رو نصب کنید تا بتونید این اموزش رو آنزیپ کنید.
فرمت فایل بعد از انزیپ: mp4
اسکریپت گیم پلی دو بعدی و اسکریپت تعقیب پلیر توسط دوربین هم هدیه ما به شما.
قیمت این آموزش بسیار کم و ارزون هست ولی کیفیت اموزش عالیه و تضمین یادگیری.
اگه مشکلی توی دانلود یا ... پیش اومد تو نظرات بگید ایمیل بدید لینک mediaFire رو بهتون ارسال می کنیم.
منبع:gameover.blog.ir
ساخت یه بازی با دو تا دوربین سخت نیست.
دو تا Camre رو Add کنید .
مقدار خصوصیت H هر دو تا دوربین رو بذارید 0.5
Y بازیکن اول رو بدید 0.5
Y بازیکن دوم رو بدید 0
--
با اینکار بازیکن اول دوربینش بالای صحنه قرار می گیره و اون یکی پایین.
کیفیت : عالی
حجم:26 مگ (بعد از آنزیپ کردن میشه 60 مگ)
بعد از build به apk ،در قسمت بالا و سمت راست پنجره ی console لاگ یا نوشته ها روی فلش کوچک پایین بزنید یک گزینه Editor Log رو می بینید.روش بزنید می گه چند درصد مربوط به کدوم بخش هست.
***Player size statistics***
Level 0 'Assets/Loader.unity' uses 459.0 KB compressed / 1.6 MB uncompressed.
Level 1 'Assets/Game.unity' uses 2.3 MB compressed / 7.8 MB uncompressed.
Total compressed size 2.8 MB. Total uncompressed size 9.4 MB.
Textures 3.9 mb 41.2%
Meshes 2.3 mb 23.9%
Animations 679.1 kb 7.0%
Sounds 0.0 kb 0.0%
Shaders 538.1 kb 5.6%
Other Assets 653.8 kb 6.8%
Levels 147.8 kb 1.5%
Scripts 453.3 kb 4.7%
Included DLLs 136.0 kb 1.4%
File headers 747.4 kb 7.8%
Complete size 9.4 mb 100.0%
Used Assets, sorted by uncompressed size:
277.1 kb 2.9% Assets/Player/Human.blend
264.1 kb 2.7% Assets/Player/Orc.blend
216.1 kb 2.2% Assets/Monsters/Foo.blend
213.0 kb 2.2% Assets/Dungeon/Dungeon.blend
170.8 kb 1.8% Assets/Monsters/FooSkin.png
...
Yes, Unity should make this critical information way more obvious!
Sometimes it's as simple as a texture you have forgotten to downscale, or a model that needs to have Compression turned on (model and/or animation). Sometimes you've inadvertently depended upon an expensive DLL (like XML). Sometimes a package you're using (like Detonator) has a lot of big unused Resources (unused mere assets don't matter).
Note on the above sizes: these are for a WebPlayer; unlike Android and iOS, web builds don't have to include the Player, since the user installs that separately (I suspect that's actually the entirety of your "problem").
http://answers.unity3d.com/questions/153065/file-size-is-far-too-big.html
منبع:gameover.blog.ir
روش قدیمی(منسوخ):
یک روش سنتی اینه که یک گیم ابجکت تهی یا empty game object بسازیم و دشمن و یک cube با رنگ قرمز رو بندازیم توی زیرشاخش(به عنوان فرزندش).
بعدش این مکعب رو scale کنیم و در مثلا راستای محور x جهانی(تحت زاویه ای که خود دشمن قرار گرفته یا نسبت به مرکز خودش) اونو کم کنیم مثال:
using UnityEngine; using System.Collections; //Author:sajjad3011 public class NewBehaviourScript : MonoBehaviour { public GameObject navarKhun; /* void Start () { navarKhun = GameObject.Find("Cube"); } */ public void btnChangeHeight() { navarKhun.gameObject.transform.localScale -= new Vector3(1,0,0); } }توضیح:
Image im; im.rectTransform.rect.width=100همچنین باید اسپرایت یا image خون رو lookat کنیم به دوربین که روش به سمت دوربین باشه.
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Transform target; void Update() { // Rotate the camera every frame so it keeps looking at the target transform.LookAt(target); } }دوربین رو باید بدیم به target در inspector تا نوار خون نگاهش به سمت دوربین باشه.
منبع:gameover.blog.ir
در قسمت سراسری public Animator anim; در قسمت دلخواه کد: غیر فعال کردن: anim.enabled=false; فعال کردن: anim.enabled=true;
منبع:gameover.blog.ir
مسیر Window->Profiler رو طی کنید.
در شکل زیر می بینیم هشتاد درصد پردازش مربوط به animator هست:
پس برای بهینه سازی بازی باید سعی کنید فقط در صورت نیاز کامپوننت انیمار رو setActive(true و در غیر اینصورت setActive(false کنید.
منبع:gameover.blog.ir
کاربرد:
تایپ خودکار متن در بازی ها:
اینم مثال:
using UnityEngine; using System.Collections; using UnityEngine.UI; // attach to UI Text component (with the full text already there) public class UITextTypeWriter.cs : MonoBehaviour { Text txt; string story; void Awake () { txt = GetComponent<Text> (); story = txt.text; txt.text = ""; // TODO: add optional delay when to start StartCoroutine ("PlayText"); } IEnumerator PlayText() { foreach (char c in story) { txt.text += c; yield return new WaitForSeconds (0.125f); } } }
منبع:gameover.blog.ir
using System.Xml; ... XmlDocument mydoc = new XmlDocument(); mydoc.Load("www.example.com/file.xml"); string mypoint = mydoc.GetElementById("mytext").InnerText;
public static void ClearLog() { var assembly = Assembly.GetAssembly(typeof(UnityEditor.ActiveEditorTracker)); var type = assembly.GetType("UnityEditorInternal.LogEntries"); var method = type.GetMethod("Clear"); method.Invoke(new object(), null); }نکته:کلمه var در js داریم اما توی سیشارپ هم var داریم برای مواردی که متغیری رو می خوایم در زمان اجرا پس از مقدار دادن نوعش رو تعیین کنیم.همچنین برای شناخت توابعی که نوشتیم اینا رو یادتون نره باید ضمیمه کنیم:
using System.Reflection; using UnityEditor;
منبع:gameover.blog.ir
رفتن به مرحله ی بعد پس از برخورد با درب در یونیتی_دقت کنید درب باید تگ door1 داشته باشه و گزینه ی isTrigger فعال باشه و پلیر باید isTrigger حتما غیرفعال باشه.. کد رو بدید به پلیر
برای کلایدرهای سه بعدی:
void OnTirggerEnter ( Collision Other ) { if ( Other.gameObject.name == "door1"){ Application.LoadLevel(Application.loadedLevel + 1); } }
برای کلایدر های دو بعدی
void OnTriggerEnter2D( Collider2D Other ) { if (Other.gameObject.name == "door1"){ Application.LoadLevel(Application.loadedLevel + 1); } }
OnTirggerEnter2d هم واسه دو بعدی هست.
Other.gameObject.tag همیشه داد به شرطی که به درب یک تگ(برچسب) بدیم (door1 یا door یا ...)
نکته:دقت کنید در حالت دو بعدی و سه بعدی اگه توابع اشتباه بدید کار نخواهد کرد کدها.
منبع:gameover.blog.ir
Occlusion Culling باعث میشه اجسام پشت دوربین رندر نشه و سرعت بازی رو خیلی بالا میبره و باعث کارایی بی نظیری در رندر میشه و حتی برای بازی های اپن ورد open world هم پاسخگو هست.
--
بعضی اوقات می خوایم فقط صحنه هایی که در محدوده ی دوربین هستن یا توی یک محوطه مکعبی دلخواه هستن رندر بشه فقط، تا سرعت بازی بره بالا یا بهینه تر بشه و پردازش اضافی برای قسمت هایی که پشت دوربین هست جهت رندر انجام نشه. اگه اشتباه نکنم طبق توضیحات سایر دوستان به این کار می گیم Occlusion system .
آموزش فارسی رو می تونید در دو تا فیلم آپارات ببینید :
منبع:gameover.blog.ir
حذف سایه ها و شرطهای اضافه تابع Update و استفاده از FixedUpdate.
cache کردن کلاس ها مثل tranform و ... مثال :
private Transform _transform; void Start () { _transform = this.transform;//cache for optimization }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { IEnumerator WaitAndPrint() { // suspend execution for 5 seconds yield return new WaitForSeconds(5); print("WaitAndPrint " + Time.time); } IEnumerator Start() { print("Starting " + Time.time); // Start function WaitAndPrint as a coroutine yield return StartCoroutine("WaitAndPrint"); print("Done " + Time.time); } }
منبع :gameover.blog.ir
مثال1:
متغیری از نوع عمومی public می سازیم که باید کامپوننت انیمیشن هم drag کنیم روش در inspector.
روش زیر برای انیمیشن هایی که با انیماتور نمی شه اجرا کرد(انیمیشن های سنتی یا legacy که با نرم افزارهای قدیمی ریگ شده) و حتی انیمیشن های جدید(هر دو ) جواب مید:
public Animation anim; void Start() { anim.Play("esme animation"); }
مثال2:
متغیری از نوع خصوصی private می سازیم که کامپوننت انیمیشن رو از طریق کد دریافت می کنیم.
private Animation anim; void Start () { anim.GetComponent<Animation> (); anim.Play("esme animation"); }
نکته:
کامپوننت انیمیشن هم باید به player بدید. برای اینکه خودش کامپوننت رو بده یا نذاره حذفش کنید این دستور رو قبل از اسم کلاس بیارید:
[RequireComponent(typeof(Animation))]
نکته مهم: گزینه LEgacy یا سنتی در حالت دو بعدی یافت نمیشه و احتمالا فقط برای حالت سه بعدی در بخش Rig باید تنظیم بشه.(دو بعدی هم بهتره با Animator کار بشه نه Animation)
شاید یکی از دلایل افت فریم و کند شدن بازی های یونیتی اینه که از چند کامپوننت انیمیاتور استفاده کنیم.
پس بهتره بعضی اوقات به جای انیماتورها از کامپوننت انیمیشن استفاده بشه.
ابتدا کاراکتری که می خواید براش انیمیشن های مختلف بسازید انتخاب کنید( از کادر hierarchy(کادر اجزای صحنه))
سپس به منوی window->animation برید و انیمیشنی رو ایجاد کنید(Create new animation clip)
سپس کامپوننت animation بدید به کاراکترتون. و size بدید و انیمیشن ها رو بیارید توش:
دستور Crossfade:
سپس از کد زیر الهام بگیرید برای سوئیچ بین انیمیشن ها :(دقت کنید اسم اسکریپت و کلاس سیشارپ ما باید حتما یکسان باشه.در اینجا ExampleClass)
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Animation anim; void Start() { anim = GetComponent<Animation>(); } void Update() { if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1F) anim.CrossFade("Run"); else anim.CrossFade("Idle"); } }
using UnityEngine; using System.Collections; public class create : MonoBehaviour { Ray ray; RaycastHit hit; public GameObject prefab; void Update () { ray=Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray,out hit)){ if(Input.GetKey(KeyCode.Mouse0)) { GameObject obj=Instantiate(prefab,new Vector3(hit.point.x,hit.point.y,hit.point.z), Quaternion.identity) as GameObject; } } } }نکته :
هرمشکلی در پرداخت یا دانلود بود در وبلاگ gameover.blog.ir مطرح کنید.
شماره تماس بذارید برای تلگرام
09039739619
09358077198
منبع:gameover.blog.ir
// When the audio component has stopped playing, play otherClip using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public AudioClip otherClip; AudioSource audio; void Start() { audio = GetComponent<AudioSource>(); } void Update() { if (!audio.isPlaying) { audio.clip = otherClip; audio.Play(); } } }
روش بعدی:
using UnityEngine; using System.Collections; [RequireComponent(typeof(AudioSource))] public class ExampleClass : MonoBehaviour { public AudioClip engineStartClip; public AudioClip engineLoopClip; void Start() { GetComponent<AudioSource> ().loop = true; StartCoroutine(playEngineSound()); } IEnumerator playEngineSound() { audio.clip = engineStartClip; audio.Play(); yield return new WaitForSeconds(audio.clip.length); audio.clip = engineLoopClip; audio.Play(); } }منبع :
منبع:gameover.blog.ir
مثال:
برای خروج از بازی وقتی روی یک cube کلیک شد بهش این کد رو میدیم:
void OnMouseDown(){ Application.Quit(); }
مثال: برای باز شدن سایت و مثلا ارسال عدد 9 به فایل get.php:
void OnMouseDown(){ Application.OpenURL("http://example.com/get.php?Scrore=9"); }
منبع:gameover.blog.ir
GetComponent.<AudioSource> ().Stop(); GetComponent.<AudioSource> ().Play();
using UnityEngine; using UnityEngine.UI; using System.Collections; using System.IO; public class BestScore2 : MonoBehaviour { public Text textBestScore; // you dont need this void Start () { string t = "your text"; string path = "Builds/FormulaOne_Data/BestScore.txt"; System.IO.File.WriteAllText (@path, t); // for writing string text = System.IO.File.ReadAllText(@path); // for reading textBestScore.text = text; // you dont need this } }
نکته:اولا این کتاب خیلی کمیاب هست و حتی توی سایت های خارجی هم بسیار نادر هست ولی ما این کتاب رو به رایگان براتون می ذاریم تا دانلود بفرمایید.
تعداد صفحه: نزدیک 800
نکته ی مهم : افراد عادی که با انجین های بازی سازی unity کار نکردن یا کلا قصد ساخت بازی (چه دو بعدی چه سه بعدی) رو دارن نیازی به این کتاب نیست و باید اول بدون درگیر شدن با جزئیات،برن مستقیم با یونیتی کار کنن .
چون در openGL فقط کارهای گرافیک رو انجام میدیم تحت Visual c ++ و خروجی اندروید و غیره هم در کار نیست.(و الان هم واسه عهد بوقه و شما بهتره برید سمت unity)، یه خروجی صرفا EXE می سازیم که کتابخانه ها و فایل های DLL و Lib یا ... رو به محیط ویژوال استادیو add reference و تیک می زنیم و فایل dll رو در c:\windows\system32 میریزیم و lib رو هم در پوشه ی include و الی آخر... .
این کتاب برای زمانی هست که شما حرفه ای یونیتی یا انیجن های دیگه می شید.بین انجین های دیگه مثل cry یا unreal و unity و game maker studio (خود گیم میکر منسوخ هست و حتما استادیو خروجی اندروید میده) و OGRE و torque 3d و S2Engine HD هم هم خودتون مختارید با چی کار کنید. اما بنده توصیه ام اینه که شروع کارتون با unity باشه بعدش حالا خواستید برید سمت انجین های دیگه تا تست کنید و خودتون تشخیص بدید برتری های یونیتی رو. فقط فیزیک یونتیی کمی توی قسمت Rigid body و سرعت های بالا ممکنه ضعیف عمل کنه که اونا رو باید با تکنیک پیاده سازی کرد و شاید آنریل توی سیستم های فیزیک قوی تر باشه.اما باز هم شروع کار یونیتی از نظر ما.
بعد از تسلط به یونیتی و شروع بازی سازی،اونجایی که دوست دارید مطالعات آزاد تری رو در زمینه ی کدنویسی سخت تر با open GL انجام بدید(هر چند منسوخ هست) فقط به صرف اینکه ایده های ساخت انجین های بازی سازی رو درک کنید می تونید از کتب openGL مثل این و سایر کتب و directX و .... کمک بگیرد.(فرق open GL هم با directX اینه که openGL از توابع بیشتری استفاده می کنه و اشیای سه بعدی و ترسیمات texture و فایل های عکس و انداخت اونا روی مدل و shader ها(متریال های روی مدل ها) و نورپردازی ها و سایه گذاری ها و به طور کلی فقط کار گرافیک رو انجام میده و با صدا و سایر جنبه ها کاری نداره.(مباحث دیگه مثل openAL یا Cross Platform 3D Audio مربوط به صدا) و Directx هم جزو برنامه نویسی های حرفه ای تر هست که مستقیما با سحت افزار درگیر می شید و اونجا برای حرفه ای ها هست که دوست دارن کدهاشون با سرعت بیشتری بدون تبدیلات اضافه به فرمت اجرایی روی سیستم عامل ویندوز در بیاد و الی آخر...)
این شما و این یکی از بهترین کتاب های openGL (فقط حرفه ای ها مطالعه کنن و مبتدیان سعی کنید درگیر جزئیات این کتاب نشید که چطوری بازی بسازیم و از کجا شروع کنیم.اگه سوالی در رابطه با بازی سازی دارید در وبلاگ نظر بدید بنده ی حقیر راهنماییتون خواهم کرد انشاءا... . چون خودم مدت ها سر در گم بودم و چندین سال در این باب تحقیق کردم و البته باز هم بی سواد هستم در برابر اساتید و تمام شما بزرگواران. .و من ا... توفیق):
منبع:gameover.blog.ir
از منوی Edit زیرمنوی Render settings رو انتخاب کنید و گزینه ی Fog رو در پنل باز شده در کادر inspector فعال کنید و تنظیمات مثل رنگ و شدت و غیره رو دستکاری کنید:
منبع:gameover.blog.ir
using UnityEngine; using System.Collections; //Smooth camera for 2d platforms //Author:Sajjad3011 //unity 5 public class camera2d : MonoBehaviour { public Transform target; private float smooth=1f; void FixedUpdate () { transform.position = Vector3.Lerp(transform.position, target.position, smooth * Time.deltaTime)-new Vector3(0,0,0.4f); } }نکته: طبق کد حتما باید توی FixedUpdate کار کنید. اگه توی Update بذارید صحنه لرزش پیدا کرده یا پرک پرک می زنه.
using UnityEngine; using System.Collections; public class SmoothFollow2D : MonoBehaviour { private Vector3 velocity = Vector3.zero; public Transform target; // Update is called once per frame void Update () { if (target) { Vector3 point = GetComponent<Camera>().WorldToViewportPoint(target.position); Vector3 delta = target.position - GetComponent<Camera>().ViewportToWorldPoint(new Vector3(0.2f, 0.5f, point.z)); //(new Vector3(0.5, 0.5, point.z)); Vector3 destination = transform.position + delta; transform.position = Vector3.SmoothDamp(transform.position, destination, ref velocity, 0); } } }