Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • 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 /
This post has been wikified, any user with enough reputation can edit it.
avatar image
0
Question by trapoviejo · May 13, 2012 at 10:47 PM · javascriptaienemyfollow

Enemy following Player in range

Hi, I'm trying to do a simple script where "Cube" objects follow "PlayerCube" when PC gets in a range of <50 from any C position. If I don't do the if, it works fine, but all the cubes in my map will follow PC. It is not working (none of the cubes move when I approach them), and I guess I'm accessing the GameObjects' position wrong or maybe my mistake is in the if statement. I appreciate any help you can offer. Here is my code:

 var target : Transform; //the enemy's target
 var moveSpeed = 50; //move speed
 var rotationSpeed = 3; //speed of turning

 var myTransform : Transform; //current transform data of this enemy

 function Awake()
 {
      myTransform = transform; //cache transform data for easy access/preformance
 }

 function Start()
 { 
      target = GameObject.FindWithTag("Player").transform; //target the player

 }

 function Update () {
 //if((target.transform.position-transform.position).sqrMagnitude<20){
 var pos1 = GameObject.Find("PlayerCube").transform.position;
 var pos2 = GameObject.Find("Cube").transform.position;
 if(Vector3.Distance (pos1, pos2) < 50){
             //rotate to look at the player
     myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
     Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
                 //move towards the player
     myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
     }
     }
Comment
Add comment · 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 ianongerzzzz · Apr 13, 2017 at 06:27 AM 0
Share

Click Help. SWooing, Swoong!!

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Drakestar · May 13, 2012 at 11:55 PM

I don't know why you have the pos1 and pos2 variables inside the Update function, it doesn't make sense. Presumably you've already cached the positions for both the NPC and the player (the NPC's target). But beyond that...

In the if statement, you check whether NPC and player are within a distance of 20 in square space (using the square distance between both). Then you're doing another square-root (= accurate) distance check between 'Cube' and 'PlayerCube' (both of which presumably represent the same entities) in the second if statement. That check will fail because of the difference between a squared and square-root distance value. Assume Player(0,0) and NPC(5,5). Their distance in square space is 50. Your first if check fails, nobody does anything. The accurate distance is 7.071 (square-root of 50), so if you comment out the if statement, the second if statement evaluates to true and the rotation/movement code executes.

Make sure that all of your measurements are always in the same space (in this case, change the first if statement to use Vector3.Distance). Squared space is only useful when comparing multiple entities which are all evaluated inside that square space.

Also clean up the redundancy of pos1/pos2. GameObject.Find should never be called per frame, and you're confusing the issue by not referring to the same objects consistently.

Comment
Add comment · Show 1 · Share
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 trapoviejo · May 14, 2012 at 02:37 AM 0
Share

Thank you for your post, I solved this hourse ago :)

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.

Follow this Question

Answers Answers and Comments

6 People are following this question.

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

Related Questions

Help with Enemy AI 1 Answer

Enemy not rotating when inside range 1 Answer

Enemy following the target with ITween 2 Answers

Enemy AI Problem: Dancing? 1 Answer

Enemy detection in the light(Javascript) 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