Jump to content
This site uses cookies! Learn More

This site uses cookies!

armedunity.com uses cookies to improve user experience.

By continuing to use this site, you agree to allow us to store cookies on your computer.

  • 0
Sign in to follow this  
CakeMonsTv

Making enemy character in AU FPS kit

Question

Hi

 

I'm trying to make enemy character who is in idle animation and when i shoot him, his body will be replace with ragdoll. Im using AU fps kit by the way. Can anyone help me please?

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Unity has built in rag doll creator. It just basically adds sphere colliders and rigid bodies to each of the joints. Initialize them as disabled and when you die, enable them. That's it

Share this post


Link to post
Share on other sites
  • 0

Thanks! i got it working. I also assigned AI script to enemy character, but it follows me above the floor. Any idea how to fix that?

 

code:

var speed = 3.0;
var rotationSpeed = 5.0;
var shootRange = 15.0;
var attackRange = 30.0;
var shootAngle = 4.0;
var dontComeCloserRange = 5.0;
var delayShootTime = 0.35;
var pickNextWaypointDistance = 2.0;
var target : Transform;

private var lastShot = -10.0;

// Make sure there is always a character controller
@script RequireComponent (CharacterController)

function Start () {
    // Auto setup player as target through tags
    if (target == null && GameObject.FindWithTag("Player"))
        target = GameObject.FindWithTag("Player").transform;

    Patrol();
}

function Patrol () {
    var curWayPoint = AutoWayPoint.FindClosest(transform.position);
    while (true) {
        var waypointPosition = curWayPoint.transform.position;
        // Are we close to a waypoint? -> pick the next one!
        if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
            curWayPoint = PickNextWaypoint (curWayPoint);

        // Attack the player and wait until
        // - player is killed
        // - player is out of sight        
        if (CanSeeTarget ())
            yield StartCoroutine("AttackPlayer");
        
        // Move towards our target
        MoveTowards(waypointPosition);
        
        yield;
    }
}


function CanSeeTarget () : boolean {
    if (Vector3.Distance(transform.position, target.position) > attackRange)
        return false;
        
    var hit : RaycastHit;
    if (Physics.Linecast (transform.position, target.position, hit))
        return hit.transform == target;

    return false;
}

function Shoot () {
    // Start shoot animation
    GetComponent.<Animation>().CrossFade("shoot", 0.3);

    // Wait until half the animation has played
    yield WaitForSeconds(delayShootTime);
    
    // Fire gun
    BroadcastMessage("Fire");
    
    // Wait for the rest of the animation to finish
    yield WaitForSeconds(GetComponent.<Animation>()["shoot"].length - delayShootTime);
}

function AttackPlayer () {
    var lastVisiblePlayerPosition = target.position;
    while (true) {
        if (CanSeeTarget ()) {
            // Target is dead - stop hunting
            if (target == null)
                return;

            // Target is too far away - give up    
            var distance = Vector3.Distance(transform.position, target.position);
            if (distance > shootRange * 3)
                return;
            
            lastVisiblePlayerPosition = target.position;
            if (distance > dontComeCloserRange)
                MoveTowards (lastVisiblePlayerPosition);
            else
                RotateTowards(lastVisiblePlayerPosition);

            var forward = transform.TransformDirection(Vector3.forward);
            var targetDirection = lastVisiblePlayerPosition - transform.position;
            targetDirection.y = 0;

            var angle = Vector3.Angle(targetDirection, forward);

            // Start shooting if close and play is in sight
            if (distance < shootRange && angle < shootAngle)
                yield StartCoroutine("Shoot");
        } else {
            yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
            // Player not visible anymore - stop attacking
            if (!CanSeeTarget ())
                return;
        }

        yield;
    }
}

function SearchPlayer (position : Vector3) {
    // Run towards the player but after 3 seconds timeout and go back to Patroling
    var timeout = 3.0;
    while (timeout > 0.0) {
        MoveTowards(position);

        // We found the player
        if (CanSeeTarget ())
            return;

        timeout -= Time.deltaTime;
        yield;
    }
}

function RotateTowards (position : Vector3) {
    SendMessage("SetSpeed", 0.0);
    
    var direction = position - transform.position;
    direction.y = 0;
    if (direction.magnitude < 0.1)
        return;
    
    // Rotate towards the target
    transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
    transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
}

function MoveTowards (position : Vector3) {
    var direction = position - transform.position;
    direction.y = 0;
    if (direction.magnitude < 0.5) {
        SendMessage("SetSpeed", 0.0);
        return;
    }
    
    // Rotate towards the target
    transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
    transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);

    // Modify speed so we slow down when we are not facing the target
    var forward = transform.TransformDirection(Vector3.forward);
    var speedModifier = Vector3.Dot(forward, direction.normalized);
    speedModifier = Mathf.Clamp01(speedModifier);

    // Move the character
    direction = forward * speed * speedModifier;
    GetComponent (CharacterController).SimpleMove(direction);
    
    SendMessage("SetSpeed", speed * speedModifier, SendMessageOptions.DontRequireReceiver);
}

function PickNextWaypoint (currentWaypoint : AutoWayPoint) {
    // We want to find the waypoint where the character has to turn the least

    // The direction in which we are walking
    var forward = transform.TransformDirection(Vector3.forward);

    // The closer two vectors, the larger the dot product will be.
    var best = currentWaypoint;
    var bestDot = -10.0;
    for (var cur : AutoWayPoint in currentWaypoint.connected) {
        var direction = Vector3.Normalize(cur.transform.position - transform.position);
        var dot = Vector3.Dot(direction, forward);
        if (dot > bestDot && cur != currentWaypoint) {
            bestDot = dot;
            best = cur;
        }
    }
    
    return best;
}

Share this post


Link to post
Share on other sites
  • 0

Because your moving towards a position with the inclusion of the y axis which is a nogo. MoveTowards Vector3(target.x, transform.position.y, target.z). don't  MoveTowards(target); a lot of people tend to make that same mistake

 

and FYI, never use movetowards, use rigid body.applyforce or controller.move

Share this post


Link to post
Share on other sites
  • 0

i  copied  ur enemy ai script to my enemy it shows error "'auto way point' does not denote a value"

Share this post


Link to post
Share on other sites
  • 0

@yusufpl this a help question from 2016, not a script for ppl to copy into there projects

Share this post


Link to post
Share on other sites
  • 0

can u help me to make ranged enemy for au fps kit

i am a begginner

 

Share this post


Link to post
Share on other sites
  • 0

Only difference between a ranged enemy and a cqb enemy is the attack distance. Take a cqb enemy, change the attack range from 1 to 100 and presto, you have a spicy meatball. Not sure if au fps kit uses hitboxes, but if does, just change it to raycast and that's you basic ranged enemy. Ofcourse there are other elements to give the ai more realistics, but the basic concept is already there. Please login or register to see this link.

 

and I'm not sure if you know what cqb stands for but it stands for close quarters combat (why the b stands for combat, your guess is as good as mine. My guess is bc cqc sounds retarded)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×