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
              
 
               
              Your answer
 
 
             Follow this Question
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
