Unity3D FPS 第一人称视角移动

  第一次写博客,有什么不足之处请多多原谅,本章的主要讲的是fps的第一人称视角,我们要知道,第一人称视角在unity3d里怎么实现,主要有两个,一个是主角和另一个是摄像机。

(如果你们认真看完这个教程fps第一人称视角是完全可以学会的。不要跳行看,看完这个教程一个小时都不到。我相信有人连这个都没看直接看下面

 

首先上图:

Ethan这个主角是unity自带的模型,Main Camera是一个摄像机。(图片我没处理(你以为我不想啊博客没有截屏我有ps但是我已经懒得处理了)自已放大看)

第一步:将摄像机移到主角身上作为一个子级物体(然后在Scene面板,将移动摄像机到主角面前如我上面那图)。如我上图那样子。(这时候陈独秀同学会问:上面图那么大你要我怎么找啊)陈独秀你给我过来我一巴掌你,你不会看Create面板吗?就是那个黑色箭头那个面板。对你没看错。就是黑色箭头那里。(虽然画的丑了点,但是你们看明白就行了)

第二步:在主角身上添加一个Character Controller组件。(陈独秀:这什么鬼组件,在哪里啊),呵呵,Character Controller这个组件是角色控制器的意思。位置:在我上面图片右下角那里有一个Add Component在physics里面。

然后可以写(复制)代码了是不是很开心。(开心个鬼看到代码就直接复制粘贴你们nb,不修改,你们复制下面的代码能运行我拜你为师)(照着下面照片的代码抄的同学注意了最后面一行还有一个})

对没错就是上面那个那些代码。就50行不到就ok了,完成第一人称视角。(陈独秀:解析呢。都没有解析学个毛啊)

唉陈独秀同学就是这么心急。我一行一行给你们解析清楚ok(说是这么说反正你们又不顺着网线来打我);

ps: 别复制下面代码。

CharacterController playerController;  //这行代码是声明一个CharacterController类;


    Vector3 direction; //声明3维向量;

    public float speed = 1;   //主角的移动速度
    public float jumpPower = 5; //主角跳的高度
    public float gravity = 7f; //重力

    public float mousespeed = 5f; //鼠标快慢

    public float minmouseY = -45f; //限制鼠标y轴(你们想一想眼睛能看到后面的吗?可以的话你nb)
    public float maxmouseY = 45f;

    float RotationY = 0f;
    float RotationX = 0f;这两个存放的是鼠标输入

    public Transform agretctCamera;  //这个必须在Create面板拖放Main Camera(也就是摄像机)这个位置里否则没有效果,这个类是存放的是摄像机位置;

// Use this for initialization
void Start () {

        //这个函数就不说明了,看到这里的都是基础过关了吧?
        playerController = this.GetComponent<CharacterController>(); //获取依附在这个物体上的CharacterController组件

        Screen.lockCursor = true;//鼠标隐藏(新的unity5.0版本以上好像用这个会警告,我就不用新的了反正旧的能用我去研究新的用法干嘛,我有病啊,(你以为我会告诉你我他喵的根本看不懂官方怎么解析的么呵呵))

    }

// Update is called once per frame
void Update () {//这个方法都要我解析,陈独秀你过来,(蠢蠢欲动的陈独秀:我什么都没说好吗,关我什么事)

        float _horizontal = Input.GetAxis("Horizontal");//将水平轴的给_horizontal
        float _vertical = Input.GetAxis("Vertical");//同上(呵呵我会告诉你我懒得打)


        if (playerController.isGrounded)
        //(陈独秀:这个playerController是什么鬼啊)呵呵陈独秀同学坐下,我先给你一巴掌先前面不是声明了playerController获取CharacterController组件吗?这么快就忘了 你很棒棒噢。CharacterController组件中有一个检测是否到地面的方法就是.isGrounded。这个在CharacterController才有的,记住了陈独秀同学。playerController.isGrounded也就是说主角在地面上。
        {
            direction = new Vector3(_horizontal,0,_vertical);//在地面上才能移动,这个是移动向量


            if (Input.GetKeyDown(KeyCode.Space))     //检测你是否按下了空格键     
                direction.y = jumpPower;      //如果按下了空格键就三维向量中的y轴等于jumpPower(呵呵,陈独秀同学是不是又忘了jumpPower是什么了,回头看看都声明了什么)     
        }
        direction.y -= gravity * Time.deltaTime;//这个在if语句外也就是说主角的向下的重力


        playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));
        //这句就有点难理解了,我都不知道怎么解析, playerController.Move()这个是移动方法,playerController.transform.TransformDirection()这个是跟随世界坐标的意思,如果没有这个主角身体转向的时候它就是一个方向,按w的时候永远只朝着一个方向移动。唉解析什么的最烦了自已百度。


       RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;

        //存放摄像机(也就是鼠标)x轴
        RotationY -= Input.GetAxis("Mouse Y") * mousespeed;//存放摄像机(也就是鼠标)y轴


        RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);//限制鼠标上下,Mathf这个是数学函数的意思,Math不是数学吗?f不就是初中,高中的时候  你们最讨厌的函数么,像 f=xxx+xx+x那种;


        this.transform.eulerAngles = new Vector3(0,RotationX,0);//主角的y轴旋转(为什么有两个0,你想想主角围着x轴旋转会怎样)


        agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);//这个是摄像机上下左右。

好了就到这了,有些自已百度吧,比如eulerAngles这个是什么意思(难道还要我解析给你们看,我又不是百科全书,想学的人我不说也会,不想学的他早就xx掉我这条博客了,反之他又看不到,)重要的是自已理解。不是复制代码,没有用的。最后保存上面代码图片自已手动打一遍吧。不会在下面留评论,别乱喷人啊,我幼小的心灵很脆弱的,(四年前的憨憨语言)

最后给上源码一份。

这个代码可以复制哦:(照着上面图片抄的同学后悔了没)  (我回来了,时隔4年,我看到有很多人都来看这个,有什么想学的,可以在评论或者私信我,有时间我会出一个教程)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class fps1 : MonoBehaviour {
    CharacterController playerController;


    Vector3 direction;


    public float speed = 1;
    public float jumpPower = 5;
    public float gravity = 7f;


    public float mousespeed = 5f;


    public float minmouseY = -45f;
    public float maxmouseY = 45f;


    float RotationY = 0f;
    float RotationX = 0f;


    public Transform agretctCamera;


// Use this for initialization
void Start () {
        playerController = this.GetComponent<CharacterController>();
        Screen.lockCursor = true;
    }

// Update is called once per frame
void Update () {
        float _horizontal = Input.GetAxis("Horizontal");
        float _vertical = Input.GetAxis("Vertical");

        if (playerController.isGrounded)
        {
            direction = new Vector3(_horizontal,0,_vertical);
            if (Input.GetKeyDown(KeyCode.Space))           
                direction.y = jumpPower;           
        }
        direction.y -= gravity * Time.deltaTime;
        playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));

       RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;
        RotationY -= Input.GetAxis("Mouse Y") * mousespeed;
        RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);
        this.transform.eulerAngles = new Vector3(0,RotationX,0);
        agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);
}
   
}

 

  • 74
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 48
    评论
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值