Отразяване на обект от стена, след като се удари в стената

така че се борих с това буквално през цялата миналата седмица. За да започна, в момента работя върху проект на Unity и ето кода, на който съм заседнал:

private RaycastHit hit;
private Ray cast;

private bool casthit;

void Start() {

    casthit = false;
    Ray cast = new Ray(transform.position, transform.forward);

}

void OnTriggerEnter(Collider other){

    if (other.tag == "Enemy") {

        other.GetComponent<BasicEnemy>().setHealthLower(damage);

    }

    if (other.tag != "Turret" && other.tag != "Bullet") {

        //here is where we want to reflect this object

    }


}

void Update () {

    Ray cast = new Ray(transform.position, transform.forward);

    Physics.Raycast (cast, out hit);

    transform.position += transform.forward * speed * Time.deltaTime;

}

По принцип това, което се случва, е, че имам купол, който стреля с куршуми, когато един от тези куршуми удари стена, искам той да се отрази от стената (или да отскочи от стената, ако предпочитате термина). Отразяването на стената трябва да работи по същия начин, както светлината би се отразила от повърхност. Сега проблемът е главно в това, че нямам представа как работят тези неща, особено защото трябва по някакъв начин да изчисля ъгъла, към който да се движи куршумът (така че само y стойност, която мога да дам на трансформацията, така че след това да продължи пътуване до следващата посока.

Както можете да видите, вече имам някаква основа под формата на raycasts и hit ray (защото вярвам, че ще имаме нужда от hit ray като нормален в един момент).

За съжаление обаче просто не разбирам откъде да започна моите изчисления или дори какви изчисления трябва да направя. Обичайният Vector3.reflect не е работил досега (или поне не в някое от предишните ми изчисления) и досега имам удар на пътя, където не мога да измисля нови неща, които да опитам, така че много се надявам едно от вас момчета знае как по някакъв начин да успее да направи това.

Мерси вече!


person LAKster    schedule 27.05.2015    source източник
comment
Можете да отидете на старата школа и да прочетете книга/статии за основна 3d векторна математика... (Не е много добро предложение за SO)...   -  person Alexei Levenkov    schedule 27.05.2015
comment
Vector3.Reflect. Даваш му входящ вектор и нормалата на повърхността, от която се отразява, и той ти дава резултантния вектор. docs.unity3d.com/ScriptReference/Vector3.Reflect.html   -  person Zach Thacker    schedule 27.05.2015
comment
@SirBraneDamuj Опитах Vector3.Reflect Въпреки това не изглежда да мога да направя правилно входящия вектор. Приемам, че трябва да е transform.position, но работата е там, че не се опитвам да отразя позицията, всъщност се опитвам да отразя въртенето, така че Vector3.reflect с помощта на transform.position не работи и трансформира. въртенето е кватернион, така че и това не работи   -  person LAKster    schedule 28.05.2015
comment
Има ли конкретна причина, поради която не използвате вградената физика и не преоткриете свое собствено решение?   -  person Tom    schedule 23.06.2015
comment
@Tom Хей, съжалявам за твърде късния отговор, но да, тогава имаше. Причината, поради която не можах да използвам нормалната физика на Unity, е, че те са базирани на рамка, така че ако в един момент куршумът е от едната страна на стената, а в следващия момент той е от другата страна, защото куршумът се движи в голяма скорост, това означава, че физиката на единството никога не се изпълнява. Физиката на Unity е страхотна за малки неща, но за този вид неща физиката на Unity е малко калпава   -  person LAKster    schedule 31.08.2015
comment
Проверете форумите на Unity. Вие не сте единственият човек, който има този проблем и има няколко различни решения, използващи вградения физически двигател.   -  person Tom    schedule 31.08.2015
comment
@Tom о, добре, това е страхотно :P, но досега вече отдавна съм го разбрал, но може би някой ден ще погледна тези неща   -  person LAKster    schedule 31.08.2015


Отговори (1)


Току-що намерих отговор на собствения си проблем (най-накрая).

За всеки, който се интересува, ето новия код:

void OnTriggerEnter(Collider other){

    if (other.tag == "Enemy") {

        other.GetComponent<BasicEnemy>().setHealthLower(damage);

    }

    if (other.tag != "Turret" && other.tag != "Bullet") {

        Vector3 reflectposition = -2 * (Vector3.Dot(transform.position, hit.normal) * hit.normal - transform.position);
        reflectposition.y = this.transform.position.y;
        this.transform.LookAt(reflectposition);


    }


}

void Update () {

    Ray cast = new Ray(transform.position, transform.forward);

    Physics.Raycast (cast, out hit);

    transform.position += transform.forward * speed * Time.deltaTime;

}
person LAKster    schedule 28.05.2015