转载

unity3d模仿魔兽世界鼠标对游戏操作

1、新建unity3d项目,在项目中导入CharacterController包。在游戏中创建Plane作为地面,把Plane的Tag设为Ground。创建Directional light照亮游戏世界。把第三人称控制器放到Plane上面,之后把挂载第三人称的脚本Remove掉,把它的Tag设为Player。

2、创建LookTargetPos脚本,把它挂载到第三人称控制器上。它的作用是当鼠标左键按下且按下的位置为Plane时,第三人称控制器朝向鼠标按下方向。

using UnityEngine; using System.Collections; public class LookTargetPos : MonoBehaviour {  public static Vector3 targetPos;//用来保存鼠标点击到地面的位置  private bool isMouseDown = false;//判断鼠标左键是否一直按下  void Start()  {   targetPos = this.transform.position;  }  // Update is called once per frame  void Update()  {   if (Input.GetMouseButtonDown(0))   {    isMouseDown = true;    LookAtPos();   }   else if (Input.GetMouseButtonUp(0))   {    isMouseDown = false;   }   //如果鼠标左键一直按下,则一直更新鼠标位置   if (isMouseDown == true)   {    LookAtPos();   }  }  void LookAtPos()  {   Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);   RaycastHit hitinfo;   bool isCollider = Physics.Raycast(ray, out hitinfo);   //判断鼠标是否点击地面   if (isCollider == true && hitinfo.collider.tag == "Ground")   {    targetPos = hitinfo.point;    targetPos.y = this.transform.position.y;    this.transform.LookAt(targetPos);   }  } } 

3、创建PlayerMove脚本,把它挂载到第三人称控制器上。它的作用是控制第三人称控制器移动到鼠标左键按下的位置。

using UnityEngine; using System.Collections; public enum Playerstate {  Moveing,  Idle } public class PlayerMove : MonoBehaviour {  private CharacterController controller;  public int speed = 4;  private float distance;//用来保存游戏主角和目标点的距离  public Playerstate state;//保存游戏主角的状态  // Use this for initialization  void Start()  {   controller = this.GetComponent<CharacterController>();   state = Playerstate.Idle;  }  // Update is called once per frame  void Update()  {   Move();  }  void Move()  {   distance = Vector3.Distance(this.transform.position, LookTargetPos.targetPos);   if(distance>0.05f)   {    controller.SimpleMove(this.transform.forward * speed);    state = Playerstate.Moveing;    print(distance);   }   else   {    state = Playerstate.Idle;   }  } } 

4、创建PlayerState脚本,把它挂载到第三人称控制器上。它的作用是控制第三人称控制器动画播放。

using UnityEngine; using System.Collections; public class PlayerState : MonoBehaviour {  private PlayerMove playerState;  private float distance;  // Use this for initialization  void Start()  {   playerState = this.GetComponent<PlayerMove>();  }  // Update is called once per frame  void LateUpdate()  {   //如果游戏主角在移动就播放跑的动画   if (playerState.state == Playerstate.Moveing)   {    PlayAnimation("run");   }   //如果游戏主角在等待就播放站的动画   else if (playerState.state == Playerstate.Idle)   {    PlayAnimation("idle");   }  }  void PlayAnimation(string animationName)  {   animation.CrossFade(animationName);  } } 

5、创建CameraFollow脚本,把它挂载到Main Camera上。它的作用是:1、让Main Camera跟随第三人称控制器移动;2、改变Main Camera视角;3、控制Main Camera与第三人称控制器的距离。

using UnityEngine; using System.Collections; public class CameraFollow : MonoBehaviour {  private Vector3 followPos;//用来保存摄像机和游戏主角的相对位置  private GameObject player;  public float scrollSpeed = 10;//摄像机拉近的速度  private bool isRotating = false;//判断鼠标右键是否按下  public float rotateSpeed = 2;//摄像机左右旋转的速度  private float distance;//保存摄像机和游戏主角距离  // Use this for initialization  void Start()  {   player = GameObject.FindGameObjectWithTag("Player");   followPos = player.transform.position - this.transform.position;   this.transform.LookAt(player.transform.position);  }  // Update is called once per frame  void Update()  {   Follow();   RotateView();   ScrollView();  }  //使摄像机跟随游戏主角运动  void Follow()  {   this.transform.position = player.transform.position - followPos;  }  //滑动鼠标滑轮的时候可以改变摄像机与游戏主角的距离  void ScrollView()  {   distance = followPos.magnitude;   distance += Input.GetAxis("Mouse ScrollWheel");   distance=Mathf.Clamp(distance,2,18);   followPos = followPos.normalized * distance;  }  //按下鼠标右键的时候移动鼠标可以改变摄像机的视角  void RotateView()  {   if(Input.GetMouseButtonDown(1))   {    isRotating = true;   }   else if(Input.GetMouseButtonUp(1))   {    isRotating = false;   }   if(isRotating)   {    this.transform.RotateAround(player.transform.position, player.transform.up, rotateSpeed * Input.GetAxis("Mouse X"));    Vector3 originalPos = this.transform.position;    Quaternion originalRotation = this.transform.rotation;    this.transform.RotateAround(player.transform.position, this.transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));    float x = this.transform.eulerAngles.x;    print(x);    //限制摄像机旋转的最大,最小位置    if(x<10||x>70)    {     this.transform.position = originalPos;     this.transform.rotation = originalRotation;    }   }   followPos = player.transform.position - this.transform.position;  } } 

6、完成以后的效果,录屏鼠标看不见了,抱歉了。

unity3d模仿魔兽世界鼠标对游戏操作

unity3d模仿魔兽世界鼠标对游戏操作

正文到此结束
Loading...