3 votes

La fonction est appelée beaucoup trop souvent

Il s'agit d'un script d'IA basique, où la fonction AttackPlayer ne doit se produire qu'une seule fois. L'attaque est un saut, mais au lieu d'une seule fois, elle est appelée 12 fois avant que le message "Attacking Denied" n'apparaisse, ce qui se traduit par un énorme boost horizontal.

Qu'est-ce que je fais de travers ?

var player : GameObject; 
var speed : float=6f; 
var range : float=15f;
var hitRange : float=6f;
var rotationSpeed : float=5f;
var delta : Vector3;
var distance;
var jumpForce : float = 8.0;
var airModifier : float = 20.0;

var test : float = 0;

private var horMovement : Vector3 = Vector3.zero;
private var forwardMovement : Vector3 = Vector3.zero;
private var jumping : boolean = false;
private var grounded : boolean = true;

function Start()
{
    player = GameObject.FindGameObjectWithTag("Player");
}

function FixedUpdate()
{
    distance = Vector3.Distance(transform.position, player.transform.position);
    if(distance<=range){   
        MoveTowards();
        RotateTowards();
        AttackPlayer();
    }
}

function MoveTowards()
{
    //are we grounded?
        if (Physics.Raycast(transform.position, -transform.up, 2)) {
            grounded = true;
        } else {
            horMovement *= airModifier;
            forwardMovement *= airModifier;
            grounded = false;
        }
    delta = player.transform.position - transform.position;
    delta.Normalize();
    delta.y = 0;
    var moveSpeed = speed * Time.deltaTime;
    transform.position = transform.position + (delta * moveSpeed);
}

function RotateTowards()
{
    transform.rotation = Quaternion.RotateTowards (transform.rotation, Quaternion.LookRotation(delta), rotationSpeed);
    transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0);
}

function AttackPlayer()
{
    if (!(grounded)){
    print("Attacking Denied");
    return;
    }

    if(distance<=(hitRange) && (grounded) && !(jumping)){
        rigidbody.AddRelativeForce(transform.up * jumpForce, ForceMode.Impulse); 
        Jumping = true;
        test += 1;
        print(test);
    }
}

2voto

Jeffrey Sweeney Points 3052

Dans ce dernier bloc, le Jumping = true; devrait être jumping = true; .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X