Scripts:

1> Space键控制子弹的发射

2> 右键控制第一人称视角的旋转 (相机跟随Model旋转)

3> 仰视与俯视 (eulerAngel)

4> wsad控制移动+人物在地面上行走

5> 人物与地面碰撞造成场景旋转问题的解决方案

****************************************************************************************************************************************

一:效果实现

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_System

 

 

二:Scripts

1> Space键控制子弹的发射 (attack.cs)

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

public class Attack : MonoBehaviour {

    public GameObject bullet;
    public float Bullet_Speed = 20;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.Space))    //鼠标左键点击为0
        {
            GameObject b = GameObject.Instantiate(bullet, new Vector3(transform.position.x,transform.position.y+2,transform.position.z), transform.rotation);    //将Bullet实例化到摄像机的位置处,要指明transform.position和transform.rotation
            Rigidbody rgd = b.GetComponent<Rigidbody>();    //获得游戏物体的刚体组件(GameObject).GetComponent<Rigidbody>()
            rgd.velocity = transform.forward * Bullet_Speed;    //设置速度velocity -> transform.forward(视角的前方->1)* speed;
        }
    }
}

 

2> 右键控制第一人称视角的旋转 (相机跟随Model旋转)

★额外的问题分析1:(不是基于开篇的模型)

* 将该脚本直接拖动到Camera上可以实现相机视野的独自旋转,即使把Camera移动到人物的子目录下仍然只能控制相机视野的旋转;

如果需要在人物旋转的同时使得Camera视野跟随,首先要将Camera移动到人物的子目录下,然后将下方视野移动脚本直接拖放到人物控件上即可:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_unity3d 第一人称漫游 WDSA_02

★后续分析以及问题见第四点控制移动之后:

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

public class Model_Perspective : MonoBehaviour {

    public Transform Camera;
   // public GameObject Wizard;
    bool Model_IsRotate = false;
    // Use this for initialization
    void Start () {
		
	}
	 
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1))
        {
            Model_IsRotate = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            Model_IsRotate = false;
        }
        if (Model_IsRotate)
        {
            transform.RotateAround(transform.position, Vector3.up, 10*Input.GetAxis("Mouse X"));

            Vector3 originPosition = Camera.position;
            Quaternion originRotation = Camera.rotation;

            Camera.RotateAround(transform.position, transform.right, -10 * Input.GetAxis("Mouse Y"));
            if(Camera.eulerAngles.x<0 || Camera.eulerAngles.x>50)    //不明觉厉的欧拉角,但是能够设置x/y值来达到仰视和俯视的效果
            {
                Camera.position = originPosition;
                Camera.rotation = originRotation;
            }
           
        }
    }
}

 

3> 仰视与俯视 (eulerAngel)

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_ide_03

 

4> wsad控制移动

* 注释部分是使用射线碰撞的方式来通过鼠标点击移动;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;    //MavMeshAgent

public class Movement : MonoBehaviour {

    public NavMeshAgent agent;
    public float speed = 20;

	// Use this for initialization
	void Start () {
		
	}
	// Update is called once per frame
	void Update () {
        //if(Input.GetMouseButtonDown(0))
        //      {
        //          Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //          RaycastHit hit;
        //          bool isCollider = Physics.Raycast(ray,out hit);
        //          if(isCollider)
        //          {
        //              //print(hit.point);
        //              agent.SetDestination(hit.point);
        //          }
        //      }
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        //this.transform.Translate(new Vector3(h,transform.position.y , v) * Time.deltaTime * speed); //这一句在触碰到地形边缘的时候会造成相机的抖动,可以将Y坐标直接设置为0
this.transform.Translate(new Vector3(h, 0F, v) * Time.deltaTime * speed);
	}
}

★额外的问题分析2:(不是基于开篇的模型)

在上述的移动脚本中,我们也可以使用this.transform.Translate(new Vector3(h, 0F, v) * Time.deltaTime * speed,Space.World);

这样人物就会沿着世界坐标轴移动,但是我这篇文章中给出的视野跟随脚本是针对人物的LOCAL坐标系而进行的旋转,所以移动所参考的坐标系也就直接采用了默认的LOCAL坐标系。

★设置好个物体的布局之后,我们接下来需要做的就是让人物行走在我们指定的地面上,

首先我们需要搞清楚脚本到底该放到谁的身上,因为Camera已经是人物的子物体,所以直接将视野跟随脚本和人物移动脚本直接放在人物身上即可 :

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_控件_04

接着,我们需要给地面与人物加上碰撞器属性控件:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_unity3d 第一人称漫游 WDSA_05

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_ide_06

 ☆这里额外需要注意的一点是,不同物体也对应着不同的碰撞器:

例如,Terrain地面就对应这Terrain Collider,如果一些模型是通过Mesh Renderer(网格渲染器)来进行构建的就要使用相应的Mesh Conllider来进行物体间的碰撞

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_System_07

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_System_08

添加两个碰撞器后,我们运行查看结果:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_System_09

我们可以发现人物虽然可以移动,但是人物是漂浮的,而不能够直接落下 (受到重力影响),而且人物可能会走到地面下方(LOCAL坐标系的影响),这就需要我们给人物添加刚体属性(rigidbody),然后人物就可以落到地面,

但需要注意的是,此时不再需要给地面添加刚体属性(两个碰撞器,一个刚体)

★运行一下,人物就可以落到地面上了,但是于此同时场景/地面可能又会出现莫名的旋转:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_ide_10

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_Unity_11

首先不考虑旋转,我们还会发现这个时候我们的人物是可以穿过场景中的任何物体的,然后就是还有旋转问题,

★接下来我们来对场景进行烘焙(Baked)来指定哪些范围可以被访问,与此同时来解决异常旋转的问题:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_unity3d 第一人称漫游 WDSA_12

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_Unity_13

完成烘焙过后:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_Unity_14

完成了对场景的操作(backed),我们接下来就要对人物进行操作,来配合烘焙后的场景使用:

给人物添加新的控件:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_Unity_15

然后运行起来就可以产生预想的结果了,此时人物的刚体属性可以删除也可以留着。

(异常处理更新于:2018.12.12)

 

 

 

****************************************************************************************************************************************

2018.11.24更新:

掌握了人物移动控制和视野的旋转,就可以构造一个漫游型游戏世界;

效果展示:

unity3d 第一人称漫游 WDSA unity 第一人称视角漫游_控件_16

资源传送门:


压缩包内包含:可以打开Scene + Unity 打包.exe文件压缩包 + Fancy_World.unitypackage