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

amir.nemati63

کاربر VIP
سلام.
من تازه با یونیتی شروع به کار کردم.
یه باکس ساده رو به عنوان درب در نظر بگیرید که با یه انیمیشن کوتاه به زمین فرو میره و با یه انیمیشن دیگه از زمین بیرون میاد.
کد رو با جاوا طوری نوشتم که وقتی فاصله کمتر از 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]
 
آخرین ویرایش:

amir.nemati63

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

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

amir.nemati63

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


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

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



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






 
آخرین ویرایش:

جدیدترین ارسال ها

بالا