Scripts:
1> Space键控制子弹的发射
2> 右键控制第一人称视角的旋转 (相机跟随Model旋转)
3> 仰视与俯视 (eulerAngel)
4> wsad控制移动+人物在地面上行走
5> 人物与地面碰撞造成场景旋转问题的解决方案
****************************************************************************************************************************************
一:效果实现
二: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移动到人物的子目录下,然后将下方视野移动脚本直接拖放到人物控件上即可:
★后续分析以及问题见第四点控制移动之后:
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)
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已经是人物的子物体,所以直接将视野跟随脚本和人物移动脚本直接放在人物身上即可 :
接着,我们需要给地面与人物加上碰撞器属性控件:
☆这里额外需要注意的一点是,不同物体也对应着不同的碰撞器:
例如,Terrain地面就对应这Terrain Collider,如果一些模型是通过Mesh Renderer(网格渲染器)来进行构建的就要使用相应的Mesh Conllider来进行物体间的碰撞:
添加两个碰撞器后,我们运行查看结果:
我们可以发现人物虽然可以移动,但是人物是漂浮的,而不能够直接落下 (受到重力影响),而且人物可能会走到地面下方(LOCAL坐标系的影响),这就需要我们给人物添加刚体属性(rigidbody),然后人物就可以落到地面,
但需要注意的是,此时不再需要给地面添加刚体属性(两个碰撞器,一个刚体)
★运行一下,人物就可以落到地面上了,但是于此同时场景/地面可能又会出现莫名的旋转:
首先不考虑旋转,我们还会发现这个时候我们的人物是可以穿过场景中的任何物体的,然后就是还有旋转问题,
★接下来我们来对场景进行烘焙(Baked)来指定哪些范围可以被访问,与此同时来解决异常旋转的问题:
完成烘焙过后:
完成了对场景的操作(backed),我们接下来就要对人物进行操作,来配合烘焙后的场景使用:
给人物添加新的控件:
然后运行起来就可以产生预想的结果了,此时人物的刚体属性可以删除也可以留着。
(异常处理更新于:2018.12.12)
****************************************************************************************************************************************
2018.11.24更新:
掌握了人物移动控制和视野的旋转,就可以构造一个漫游型游戏世界;
效果展示:
资源传送门:
压缩包内包含:可以打开Scene + Unity 打包.exe文件压缩包 + Fancy_World.unitypackage