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 /
avatar image
0
Question by Jesse_Pixelsmith · Sep 28, 2012 at 02:40 AM · c#movementquaternion

Quaternion.RotateTowards Problem

Hi all, I'm trying to beef up the following script to work for Diablo style movement:

http://wiki.unity3d.com/index.php/Click_To_Move_C

One of the problems I'm running into is in adding in smooth rotating for the character. Currently he'll instantly snap to face wherever the cursor points.

Instead of the line: myTransform.rotation = targetRotation;

I want to do myTransform.rotation = Quaternion.RotateTowards(myTransform.rotation, targetRotation, rotatespeed)

Now this works in the held down "else if" statement - if the player holds down the button it works smoothly. However if the player just clicks once (first "if" statement) it'll run through and loop back on update faster than the character can smoothly move to face his direction.

I tried hooking up this line outside of those if statements but I got weird results ... I had to define targetRotation outside of the if statements and ran into some problems with that - "conflicts with a declaration in a child block"

I've uploaded my script below. I think what I'm trying to do is pretty straightforward, I'm just lacking the skill in the syntax to implement it properly. I want the character to continue to rotate to face the destination even if the player just clicks once.

Any help is very much appreciated!

Jesse

 using UnityEngine;
 using System.Collections;
  
     public class moveOnMouseClick2 : MonoBehaviour {
     private Transform myTransform;                // this transform
     private Vector3 destinationPosition;        // The destination Point
     private float destinationDistance;            // The distance between myTransform and destinationPosition
  
     public float moveSpeed;                        // The Speed the character will move
     public float rotateSpeed;
     public float tolerance = 0f;
     
     private Quaternion targetRotation;
  
  
  
     void Start () {
         myTransform = transform;                            // sets myTransform to this GameObject.transform
         destinationPosition = myTransform.position;            // prevents myTransform reset
     }
  
     void Update () {
  
         // keep track of the distance between this gameObject and destinationPosition
         destinationDistance = Vector3.Distance(destinationPosition, myTransform.position);
                 
                 if(destinationDistance < 1f){        // To prevent shakin behavior when near destination
                     moveSpeed = 0;
                 }
                 else if(destinationDistance > 1f){            // To Reset Speed to default
                     moveSpeed = 3;
                 }
  
         // Moves the Player if the Left Mouse Button was clicked
         if (Input.GetMouseButtonDown(0)&& GUIUtility.hotControl ==0) {
  
             Plane playerPlane = new Plane(Vector3.up, myTransform.position);
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
             float hitdist = 0.0f;
  
             if (playerPlane.Raycast(ray, out hitdist)) {
                 Vector3 targetPoint = ray.GetPoint(hitdist);
                 destinationPosition = ray.GetPoint(hitdist);
                 
                 Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
                 
             }
             Debug.Log ("CLICKED!");
         }
  
         // Moves the player if the mouse button is hold down
         else if (Input.GetMouseButton(0)&& GUIUtility.hotControl ==0) {
  
             Plane playerPlane = new Plane(Vector3.up, myTransform.position);
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
             float hitdist = 0.0f;
  
             if (playerPlane.Raycast(ray, out hitdist)) {
                 Vector3 targetPoint = ray.GetPoint(hitdist);
                 destinationPosition = ray.GetPoint(hitdist);
             
                 Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
 
             }
         }
  
         // To prevent code from running if not needed
         
 
         myTransform.rotation = Quaternion.RotateTowards(myTransform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
         
         
         if(destinationDistance > tolerance){
             myTransform.position = Vector3.MoveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
         }
     }
 }
Comment
Add comment
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

2 Replies

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

Answer by Bunny83 · Sep 28, 2012 at 03:00 AM

targetRotation is currently a local variable inside the if block. Just make it a member variable of your class:

 private Quaternion targetRotation ;

And just execute the smoothing all the time:

 void Update ()
 {
     // [... ] 
     myTransform.rotation = Quaternion.RotateTowards(myTransform.rotation, targetRotation, rotatespeed)
 }

Now your player will always rotate towards your targetRotation. It get set inside the if statement but it's used outside.

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 Jesse_Pixelsmith · Sep 28, 2012 at 01:55 PM 0
Share

Oops, I thought this wouldnt work but I needed to take out the "Quaternion" in front of the targetRotation in the if block... kinda dumb :)

avatar image
1

Answer by justinl · Sep 28, 2012 at 02:55 AM

I think the easiest solution would be to use the free iTween library. It's a fantastic library written by Bob Berkebile that allows you to do a whole sort of different animations such as translation and rotation and it makes it ridiculously easy. You can find it in the Unity asset store.

For your example, you'd probably just need 2 lines of code to achieve what you'd like in your onClickLocation() method:

 var lookDirection:Vector3 = (clickedPosition.transform.position - theCharacter.transform.position);
 iTween.RotateTo(theCharacter, {"y", lookDirection});


Comment
Add comment · Show 2 · 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 raiden · May 27, 2013 at 12:25 AM 0
Share

justinl - O$$anonymous$$G!!! I just spent 3+ hours trying to turn and lock to a target rotation. I completely forgot about the iTween library. You have saved me hours of frustration with this issue!

Thank You!!!

-Raiden

avatar image justinl · May 27, 2013 at 02:46 AM 0
Share

You're welcome :)

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

12 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

Related Questions

The name 'Joystick' does not denote a valid type ('not found') 2 Answers

Making a bubble level (not a game but work tool) 1 Answer

How to move an object relative to another moving object? 2 Answers

I need a script in C# which moves an object in only one direction at a time. 1 Answer

Issue with Adding Quaternions 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