您的位置:首页 > 移动开发 > Unity3D

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

2015-09-20 16:48 603 查看
  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、完成以后的效果,录屏鼠标看不见了,抱歉了。

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: