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、完成以后的效果,錄屏鼠標看不見了,抱歉了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM