• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
Question by Ayato-Naoi · May 30, 2013 at 02:43 PM · turningslender

Turning when not seen.

Hello, I have a Slender script and it works perfectly fine, I just need to adjust it to where the enemy doesn't rotate when it is being seen. Here is the script:

@script RequireComponent( AudioSource )

public var thePlayer : Transform; private var theEnemy : Transform;

public var speed : float = 5.0;

var isOffScreen : boolean = false; public var offscreenDotRange : float = 0.7;

var isVisible : boolean = false; public var visibleDotRange : float = 0.8; // ** between 0.75 and 0.85 (originally 0.8172719)

var isInRange : boolean = false;

public var followDistance : float = 24.0; public var maxVisibleDistance : float = 25.0;

public var increaseDamageAmt : float = 24.5;

public var reduceDistAmt : float = 3.1;

private var sqrDist : float = 0.0;

public var health : float = 100.0; public var damage : float = 20.0;

public var enemySightedSFX : AudioClip;

private var hasPlayedSeenSound : boolean = false;

private var colDist : float = 10.0; // raycast distance in front of enemy when checking for obstacles

function Start() { if ( thePlayer == null ) { thePlayer = GameObject.Find( "Player" ).transform; }

 theEnemy = transform;

}

function Update() { // Movement : check if out-of-view, then move CheckIfOffScreen();

 // if is Off Screen, move
 if ( isOffScreen )
 {
     MoveEnemy();
     
     // restore health
     RestoreHealth();
 }
 else
 {
     // check if Player is seen
     CheckIfVisible();
     
     if ( isVisible )
     {
         // deduct health
         DeductHealth();
         
         // stop moving
         StopEnemy();
         
         // play sound only when the Man is first sighted
         if ( !hasPlayedSeenSound )
         {
             audio.PlayClipAtPoint( enemySightedSFX, thePlayer.position ); 
         }
         hasPlayedSeenSound = true; // sound has now played
     }
     else
     {
         // check max range
         CheckMaxVisibleRange();
         
         // if far away then move, else stop
         if ( !isInRange )
         {
             MoveEnemy();
         }
         else
         {
             StopEnemy();
         }
         
         // reset hasPlayedSeenSound for next time isVisible first occurs
         hasPlayedSeenSound = false;
     }
 }
 

}

function DeductHealth() { // deduct health health -= damage * Time.deltaTime;

 // check if no health left
 if ( health <= 0.0 )
 {
     health = 0.0;
     Debug.Log( "YOU ARE OUT OF HEALTH !" );
     
     // Restart game here!
     // Application.LoadLevel( "sceneLose" );
 }

}

function RestoreHealth() { // deduct health health += damage * Time.deltaTime;

 // check if no health left
 if ( health >= 100.0 )
 {
     health = 100.0;
     //Debug.Log( "HEALTH is FULL" );
 }

}

function CheckIfOffScreen() { var fwd : Vector3 = thePlayer.forward.normalized; var other : Vector3 = (theEnemy.position - thePlayer.position).normalized;

 var theProduct : float = Vector3.Dot( fwd, other );
 
 if ( theProduct < offscreenDotRange )
 {
     isOffScreen = true;
 }
 else
 {
     isOffScreen = false;
 }

}

function MoveEnemy() { // Check the Follow Distance CheckDistance();

 // if not too close, move
 if ( !isInRange )
 {
     rigidbody.velocity = Vector3( 0, rigidbody.velocity.y, 0 ); // maintain gravity
     
     // --
     // Old Movement
     //transform.LookAt( thePlayer );        
     //transform.position += transform.forward * speed * Time.deltaTime;
     // --
     
     // New Movement - with obstacle avoidance
     var dir : Vector3 = ( thePlayer.position - theEnemy.position ).normalized;
     var hit : RaycastHit;
     
     if ( Physics.Raycast( theEnemy.position, theEnemy.forward, hit, colDist ) )
     {
         //Debug.Log( " obstacle ray hit " + hit.collider.gameObject.name );
         if ( hit.collider.gameObject.name != "Player" && hit.collider.gameObject.name != "Terrain" )
         {            
             dir += hit.normal * 20;
         }
     }
 
     var rot : Quaternion = Quaternion.LookRotation( dir );
 
     theEnemy.rotation = Quaternion.Slerp( theEnemy.rotation, rot, Time.deltaTime );
     theEnemy.position += theEnemy.forward * speed * Time.deltaTime;
     //theEnemy.rigidbody.velocity = theEnemy.forward * speed; // Not Working
     
     // --
 }
 else
 {
     StopEnemy();
 }

}

function StopEnemy() { transform.LookAt( thePlayer );

 rigidbody.velocity = Vector3.zero;

}

function CheckIfVisible() { var fwd : Vector3 = thePlayer.forward.normalized; var other : Vector3 = ( theEnemy.position - thePlayer.position ).normalized;

 var theProduct : float = Vector3.Dot( fwd, other );
 
 if ( theProduct > visibleDotRange )
 {
     // Check the Max Distance
     CheckMaxVisibleRange();
     
     if ( isInRange )
     {
         // Linecast to check for occlusion
         var hit : RaycastHit;
         
         if ( Physics.Linecast( theEnemy.position + (Vector3.up * 1.75) + theEnemy.forward, thePlayer.position, hit ) )
         {
             Debug.Log( "Enemy sees " + hit.collider.gameObject.name );
             
             if ( hit.collider.gameObject.name == "Player" )
             {
                 isVisible = true;
             }
         }
     }
     else
     {
         isVisible = false;
     }
 }
 else
 {
     isVisible = false;
 }

}

function CheckDistance() { var sqrDist : float = (theEnemy.position - thePlayer.position).sqrMagnitude; var sqrFollowDist : float = followDistance * followDistance;

 if ( sqrDist < sqrFollowDist )
 {
     isInRange = true;
 }
 else
 {
     isInRange = false;
 }    

}

function ReduceDistance() { followDistance -= reduceDistAmt; }

function IncreaseDamage() { damage += increaseDamageAmt; }

function CheckMaxVisibleRange() { var sqrDist : float = (theEnemy.position - thePlayer.position).sqrMagnitude; var sqrMaxDist : float = maxVisibleDistance * maxVisibleDistance;

 if ( sqrDist < sqrMaxDist )
 {
     isInRange = true;
 }
 else
 {
     isInRange = false;
 }    

}

function OnGUI() { GUI.Box( Rect( (Screen.width * 0.5) - 60, Screen.height - 35, 120, 25 ), "Health : " + parseInt( health ).ToString() ); }

Comment
syclamoth

People who like this

-1 Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Benproductions1 · Jun 03, 2013 at 01:41 AM 0
Share

Format your damn code

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

15 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Slender type game 1 Answer

where is a good script to collect pages like in "slender"? 1 Answer

Slender type game need help 0 Answers

Having trouble turning off gravity through script 1 Answer

How to get an object / AI to follow you? 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges