1.(位置大小信息)在U3D新建一个简单的项目,默认有主摄像机和灯光,然后我们新增,一个Cube,然后调整大小,将其命名成地板,下面是地板的参数,Position是位置,Rotation是旋转的信息,Scale是缩放信息,所以Z是长度,X和Y分别是平面上的宽和高
2.(刚体)然后在新建一个Cube,将其命名为Player,将其调整大小,放到地板上,默认Player是没有碰撞体积的,我们需要在Player上增加一个刚体(具有物理体积特性),点击Player然后在属性上最下面点击add Component,然后搜索rigidbody,添加上去后,将其Mass(质量)修改为2
3.(TAG)然后我们在新建一个Cube,将其命名为障碍物,然后将障碍物调整好宽高后,给它新增一个Tag(在批量操作某群实例的时候,Tag可以作为识别标识),点击障碍物,然后在属性上点击Tag,下拉菜单选择Add Tag,然后输入tag名称为障碍物,在将障碍物的Tag选择为新增的内容
4.(Prefab)因为我们会有N个障碍物,我们将障碍物从Hierarchy拖入到Assets,这里我们称之为Prefab,Prefab是一个关联性可复制的实例,然后我们在Assets中可以将刚才新加的prefab实例,拖入到场景中,用来布局障碍
5.(Script)然后我们点击Player,在属性上点击add component,搜索script,然后在Assets中找到脚本,双击就可以编辑了,这里推荐使用Visual Studio,我用的是Visual Studio 2019,然后里面默认会有一个Start和Update方法,我们将下面我已经写好的代码copy进去
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
//刚体实例
public Rigidbody rg;
//移动速度
public int speed = 200;
//方向速度
public int direction_speed = 500;
//文本实例
public Text text;
//音频实例
public AudioSource Audio;
//背景音频实例
public AudioSource Audio_BG;
//是否结束
bool isover = false;
//是否开始
bool start = false;
//运行时长
float m_timer = 0;
/// <summary>
/// 碰撞事件
/// </summary>
/// <param name="collision"></param>
private void OnCollisionEnter(Collision collision)
{
//判断碰撞的实例tag内容
switch (collision.collider.tag)
{
case "障碍物":
text.text = "失败:" + transform.position.z.ToString("f2");
isover = true;
start = false;
Play("音乐/lows");
Audio_BG.volume = 40;
break;
case "终点":
text.text = "胜利!";
start = false;
isover = true;
Play("音乐/win");
Audio_BG.volume = 40;
break;
}
}
/// <summary>
/// 初始化事件
/// </summary>
void Awake()
{
Audio.playOnAwake = false;
}
/// <summary>
/// 游戏开始事件
/// </summary>
void Start()
{
text.text = "点击回车开始\r\nA/D移动";
Audio_BG.volume = 40;
}
/// <summary>
/// 物理引擎更新事件
/// </summary>
private void Update()
{
}
/// <summary>
/// 重新开始
/// </summary>
void Gostart()
{
isover = false;
start = false;
transform.position = new Vector3(0, 1, 0);
text.text = "点击回车开始\r\nA/D移动";
}
/// <summary>
/// 播放音频
/// </summary>
/// <param name="str"></param>
/// <param name="isloop"></param>
public void Play(string str,bool isloop = false)
{
if (Audio.isPlaying)
{
Audio.Stop();
}
AudioClip clip = Resources.Load<AudioClip>(str);
Audio.loop = isloop;
Audio.clip = clip;
Audio.Play();
}
/// <summary>
/// 非物理更新
/// </summary>
void FixedUpdate()
{
//判断是否按下esc
if (Input.GetKeyDown(KeyCode.Escape))
{
start = false;
//退出游戏
Application.Quit();
return;
}
if (Input.GetKeyDown(KeyCode.Return))
{
if (!isover)
{
start = true;
text.text = "GAME START";
Play("音乐/start");
Audio_BG.volume = 80;
}
else
{
Gostart();
}
}
if (start)
{
//给刚体施加力,Time.deltaTime为运行的帧数时长,每帧0.1
rg.AddForce(0, 0, speed * Time.deltaTime);
if (Input.GetKey(KeyCode.D))
{
rg.AddForce(direction_speed * Time.deltaTime, 0, 0);
}
if (Input.GetKey(KeyCode.A))
{
rg.AddForce(-direction_speed * Time.deltaTime, 0, 0);
}
//修改文本实例属性
text.text = "距离:" + transform.position.z.ToString("f2");
if (transform.position.y < 0)
{
text.text = "失败:" + transform.position.z.ToString("f2");
isover = true;
start = false;
Play("音乐/lows");
//调整音频实例声音大小
Audio_BG.volume = 40;
}
}
if (isover)
{
m_timer += Time.time;
if (m_timer >= 800)
{
Gostart();
m_timer = 0;
}
}
}
}
然后点击Main Camera查看属性,最下面也新增 一个component为script,置入以下代码:
using UnityEngine;
public class ForwordCamera : MonoBehaviour
{
public GameObject Cameras;
public GameObject Player;
public Vector3 vector;
// Update is called once per frame
void Update()
{
//相机位置等于player的位置加上间距偏移
Cameras.transform.position = Player.transform.position + vector;
}
}
内容有点多,剩下的以后说吧。。