Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 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 /
  • Help Room /
avatar image
0
Question by chas02068909 · Feb 25, 2016 at 12:10 PM · animationcharactercontrolleranimator controllermousepositionmousedown

Control my character with mouse click

HI, I Like to move my character whith mouse click technique and I like that it react with objects in the scene. Can someone help me to do this please. I have an example from unity asset store https://www.assetstore.unity3d.com/en/#!/content/44429 its a good exemple but the character dont react when I add object to the scene. I copy the script also:

 using UnityEngine;
 using System;
 using System.Collections;
 using System.Collections.Generic;
 
 public class CharacterDemoController : MonoBehaviour 
 {
     Animator animator;
 
     public GameObject        floorPlane;//in this demonstration this is set manually, the Retail Ability system has methods for dealing with this automatically via data structures for environments
     public GameObject        floorPlane2;
 
     public int                 WeaponState=0;//unarmed, 1H, 2H, bow, dual, pistol, rifle, spear and ss(sword and shield)
     public bool             wasAttacking;// we need this so we can take lock the direction we are facing during attacks, mecanim sometimes moves past the target which would flip the character around wildly
 
     float                rotateSpeed = 20.0f; //used to smooth out turning
 
     public Vector3         movementTargetPosition;
     public Vector3         attackPos;
     public Vector3        lookAtPos;
     float                gravity = 0.3f;//unused in this demonstration
     
     RaycastHit hit;
     Ray ray;
     
     public bool rightButtonDown=false;//we use this to "skip out" of consecutive right mouse down...
     
     // Use this for initialization
     void Start () 
     {    
         animator = GetComponentInChildren<Animator>();//need this...
         movementTargetPosition = transform.position;//initializing our movement target as our current position
     }
     
     // Update is called once per frame
     void Update () 
     {
         //The Update logic does:
         //
         //    Get UI input from keyboard, and mouse clicks
         //
         //    Tells mecanim what weaponstate we are in
         //
         //    Tells mecanim what animation we should be playing based on variables such as idling, pain or death
         //
         //    Handle movement and direction
         //
         //
 
         if ( ! Input.GetKey(KeyCode.LeftAlt))//if we are not using the ALT key(camera control)...
         {
             // UI goal    
             if(Input.GetMouseButton(0))//is the left mouse button being clicked?
             {
                 ray = Camera.main.ScreenPointToRay (Input.mousePosition);//get a ray that goes from the camera -> "THROUGH" the mouse pointer - > and out into the scene
                 if(floorPlane.GetComponent<Collider>().Raycast(ray, out hit, 500.0f)) //check to see if that ray hits our "floor"                                                
                 {
                     movementTargetPosition = hit.point;//mark it where it hit
                     wasAttacking = false;//we're moving now, not attacking
                 }
             }
         }
         
         switch(Input.inputString)//get keyboard input, probably not a good idea to use strings here...Garbage collection problems with regards to local string usage are known to happen
         {                         //the garbage collection memory problem arises from local alloction of memory, and not freeing it up efficiently
             case "0":
                 WeaponState = 0;//unarmed
                 break;
             case "1":
                 WeaponState = 1;//1H one handed weapon
                 break;
             case "2":
                 WeaponState = 2;//2H two handed weapon(longsword or heavy axe)
                 break;
             case "3":
                 WeaponState = 3;//bow
                 break;
             case "4":
                 WeaponState = 4;//dual weild(short swords, light axes)
                 break;
             case "5":
                 WeaponState = 5;//pistol
                 break;
             case "6":
                 WeaponState = 6;//rifle
                 break;
             case "7":
                 WeaponState = 7;//spear
                 break;
             case "8":
                 WeaponState = 8;//Sword and Shield
                 break;
             
             case "p":
                 animator.SetTrigger("Pain");//the animator controller will detect the trigger pain and play the pain animation
                 break;
             case "a":
                 animator.SetInteger("Death", 1);//the animator controller will detect death=1 and play DeathA
                 break;
             case "b":
                 animator.SetInteger("Death", 2);//the animator controller will detect death=2 and play DeathB
                 break;
             case "c":
                 animator.SetInteger("Death", 3);//the animator controller will detect death=3 and play DeathC
                 break;
             case "n":
                 animator.SetBool("NonCombat", true);//the animator controller will detect this non combat bool, and go into a non combat state "in" this weaponstate
                 break;
             default:
                 break;
         }
         
         animator.SetInteger("WeaponState", WeaponState);// probably would be better to check for change rather than bashing the value in like this
         
         if ( ! Input.GetKey(KeyCode.LeftAlt)) // if we're changing camera transforms, do not use "USE"
         {
             if(Input.GetMouseButton(1))// are we using the right button?
             {
                 if(rightButtonDown != true)// was it previously down? if so we are already using "USE" bailout (we don't want to repeat attacks 800 times a second...just once per press please
                 {// RUNGY addin enemy collider "test for nearest hit" here, they need to actually take precednce over the ground
                     
                     ray = Camera.main.ScreenPointToRay (Input.mousePosition);// make a ray based on the camera and mouse pointer
                     if(floorPlane.GetComponent<Collider>().Raycast(ray, out hit, 500.0f))                                                 
                     {
                         movementTargetPosition = transform.position; //we are attacking so lock our position to where we are
                         attackPos = hit.point;// establish the point that we hit with the mouse
                         attackPos.y = transform.position.y;//use our height for the LOOKAT function, so we stay level and dont lean the character in weird angles
                         Vector3 attackDelta = attackPos - transform.position;//we need the Vector delta which is an un-normalized direction vector
                         attackPos = transform.position + attackDelta.normalized * 20.0f;//look 20 meters ahead, so we don't spin around wildly if mecanim moves past the target
                         animator.SetTrigger("Use");//tell mecanim to do the attack animation(trigger)
                         animator.SetBool("Idling", true);//stop moving
                         rightButtonDown = true;//right button was not down before, mark it as down so we don't attack 800 frames a second 
                         wasAttacking =true;//some mecanims will actually move us past the target, so we want to keep looking in one direction instead of spinning wildly around the target
                     }
                 }
             }
         }
         
         if (Input.GetMouseButtonUp(1))//ok, we can clear the right mouse button and use it for the next attack
         {
             if (rightButtonDown == true)
             {
                 rightButtonDown = false;
             }
         }
         
         Debug.DrawLine ((movementTargetPosition + transform.up*2), movementTargetPosition);//useful for visuals in editor
                 
         //AttackCode has to go here for targeting reasons
         Vector3 deltaTarget = movementTargetPosition - transform.position;
         if(!wasAttacking)
         {
             lookAtPos = transform.position + deltaTarget.normalized*2.0f;
             lookAtPos.y = transform.position.y;
         }
         else
         {
             lookAtPos = attackPos;
         }
 
         Quaternion tempRot = transform.rotation;     //save current rotation
         transform.LookAt(lookAtPos);                        
         Quaternion hitRot = transform.rotation;        // store the new rotation
         // now we slerp orientation
         transform.rotation = Quaternion.Slerp(tempRot, hitRot, Time.deltaTime * rotateSpeed);
         
         if(Vector3.Distance(movementTargetPosition,transform.position)>0.5f)
         {
             animator.SetBool("Idling", false);
         }
         else
         {
             animator.SetBool("Idling", true);
         }
     }
     
     void OnGUI()
     {
         string tempString = "LMB=move RMB=attack p=pain abc=deaths 12345678 0=change weapons";
         GUI.Label (new Rect (10, 5,1000, 20), tempString);
     }
 }
 
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

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.

Follow this Question

Answers Answers and Comments

3 People are following this question.

avatar image avatar image avatar image

Related Questions

first person controller 0 Answers

Can't play an animation from the Animator 1 Answer

Placing my own animation idle&move to player 0 Answers

Animator Override controller SubstateMachine issue 0 Answers

Attach gun to two hands 0 Answers


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