عملکرد درب در یونیتی

شروع موضوع توسط amir.nemati63 ‏5 اکتبر 2012 در انجمن ساخت و طراحی بازی

کلمات کلیدی:
  1. amir.nemati63

    amir.nemati63 کاربر VIP

    ارسال‌ها:
    537
    تشکر شده:
    1,265
    امتیاز دستاورد:
    16
    سلام.
    من تازه با یونیتی شروع به کار کردم.
    یه باکس ساده رو به عنوان درب در نظر بگیرید که با یه انیمیشن کوتاه به زمین فرو میره و با یه انیمیشن دیگه از زمین بیرون میاد.
    کد رو با جاوا طوری نوشتم که وقتی فاصله کمتر از 5 واحد باشه و کلید E زده بشه ، درب باز بشه و در صورت فشار مجدد کلید ، درب بسته بشه.
    همینطور اگر کاراکتر از محدوده ی 5 واحد دور تر بشه درب بصورت اتوماتیک بسته میشه.
    تا اینجاش مشکلی ندارم.
    ولی وقتی درب رو به مکان دیگه ای غیر از مختصات (0و0و0) که انیمیشن رو براش ساختم میبرم ، وقتی انیمیشن اجرا میشه ، درب به محل (0و0و0) منتقل و اجرا میشه.
    میخواستم بدونم از دوستان کسی هست که بدونه چطور میشه این مشکل رو رفع کرد تا انیمیشن درب در محل خودش اجرا بشه؟

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

    آبجکت Button کلیدی هست کنار درب که کد بهش نسبت داده شده .
    آبجکت DoorMesh همون باکس معرف درب هست و Player هم کاراکتر بازی .
    پیشاپیش متشکرم.:rose:

    [JSS]#pragma strict

    enum DoorStates{ Close, Open };

    private var Player : GameObject;
    private var Button : GameObject ;
    private var DoorMesh : GameObject ;
    private var DoorState : DoorStates;
    private var distance : float ;


    function Start ()
    {
    DoorState = DoorStates.Close;
    Player = GameObject.FindWithTag("Player");
    Button = GameObject.FindWithTag("Button");
    DoorMesh = GameObject.FindWithTag("Door");
    }

    function Update ()
    {
    Door();
    }

    function Door()
    {

    distance = Vector3.Distance(Player.transform.position , Button.transform.position);
    Debug.Log(distance);



    if( distance < 5 && Input.GetButtonDown("Action") )
    {
    if (DoorState == DoorStates.Close)
    {
    DoorOpen();
    }
    else if (DoorState == DoorStates.Open )
    {
    DoorClose();
    }

    }
    if (distance > 5 )
    {
    if (DoorState == DoorStates.Open )
    {
    DoorClose();
    }
    }

    }

    function DoorOpen()
    {
    DoorMesh.animation.CrossFade("Open");
    DoorState = DoorStates.Open;
    }

    function DoorClose()
    {
    DoorMesh.animation.CrossFade("Close");
    DoorState = DoorStates.Close;
    }[/JSS]
     
    آخرین ویرایش: ‏5 اکتبر 2012
    نوشته شده توسط amir.nemati63 در ‏5 اکتبر 2012
  2. amir.nemati63

    amir.nemati63 کاربر VIP

    ارسال‌ها:
    537
    تشکر شده:
    1,265
    امتیاز دستاورد:
    16
    خودم جواب سوالم رو پیدا کردم.
    مینویسم تا اگر کسی مشکل مشابه داشته باشه استفاده کنه.
    کافیه یه game object بسازیم و این درب رو به عنوان فرزند اون قرار بدیم و مختصات local شیئ والد رو برابر (0,0,0) قرار بدیم.

    یه مشکل دیگه که دارم اینه که وقتی درب رو کپی میکنیم و بیش از یه درب داریم ، اسکریپت فقط برای درب اول کار میده و همه ی متغیر ها و توابع رو به اون نسبت میده.
    اگر کسی راه حلی داره خواهشا" بگه.
    ممنون.
     
    نوشته شده توسط amir.nemati63 در ‏7 اکتبر 2012
  3. amir.nemati63

    amir.nemati63 کاربر VIP

    ارسال‌ها:
    537
    تشکر شده:
    1,265
    امتیاز دستاورد:
    16

    خوب من خودم یه راه حل برای مشکل بالا پیدا کردم.
    به این صورت که یه متغیر از نوع String برای نام تگ دربها انتخاب میکنیم و به هر درب تگ جداگانه ای میدیم.
    با این کار ، با یه اسکریپت واحد تعداد زیادی آبجکت کنترل میشن.

    کد متغیر اضافه شده رو میذارم برای اینکه اگر کسی بعد ها به این مشکل برخورد راحت حلش کنه.
    البته تصمیم گرفتم عملکرد درب رو از راه اصولی خودش یعنی تابع OnTriggerEnter و هم خانواده هاش پیش ببرم.



    [JSS]var doorTagName : String;[/JSS]






     
    آخرین ویرایش: ‏12 اکتبر 2012
    نوشته شده توسط amir.nemati63 در ‏12 اکتبر 2012

به اشتراک بگذارید