Unity 3D 脚本编程与游戏开发 学习笔记

学习笔记

  • 内容提要
  • Unity脚本概览
    • 控制物体移动
    • 触发器事件
  • Unity 基本概念与脚本编程
    • 物体、组件和对象
    • 创建物体
    • 实例——3D射击游戏

内容提要

全书从建立编程脚本和游戏框架为出发点,逐步阐述游戏开发中的核心概念,核心的物理系统和数学基础,然后针对游戏中的界面,动画,特效和音频以及Unity 3D中各个常用模块的使用方法进行讲解,并详细介绍了游戏开发中数据管理和资源管理。

Unity脚本概览

直接通过简单实例介绍,如何通过脚本修改物体位置,处理用户输入和检测碰撞的方法。

unity规定,能够挂在物体上的脚本文件必须是“脚本组件”(另有一种不是组件的脚本文件),脚本组件要继承自MonoBehaviour,且脚本代码中的class名称必须与文件名一致。

控制物体移动

对代码要有个基本的认识吧;然后unity的话第一次接触,那就了解一些常用的函数接口,比如这里用的Debug,Input,Translate等,简单几行代码就能实现一个基本的控制移动的效果了。重点提一下,这里的Time.deltaTime 指的是两帧之间时间间隔,这样就可以保证每秒移动的距离在不同帧率的情况下都是一样的了。

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

public class MoveCase:MonoBehaviour
{
	//Start is called before the first frame update
	void Start()
	{
	}

	//Update is called once per frame
	void Update()
	{
		Debug.Log("Update Time:" + Time.time);
		float v = Input.GetAxis("Vertical");
		float h = Input.GetAxis("Horizontal");
		transform.Translate(h*10f*Time.deltaTime, v*10f*Time.deltaTime,0);
	}
}

触发器事件

知道了物体如何移动,下一步就得知道如何判断一个物体是否碰到另一个物体了。实际上,抛开高级游戏引擎提供的各种技术,直接判断物体之间的距离就足以实现碰撞检测,即两个物体之间的距离小于某个值,就是碰到了。现代游戏引擎给出了更统一,更简便的方法——使用触发器。触发器是一个组件,它定义了一个范围,当其他带有碰撞体组件的物体进入这个范围时,就会产生一个触发事件,脚本捕捉到这个事件的时候,就可以做出相应的处理。

产生触发事件的要求,一个是触发器(挂载collider组件,并勾选了 isTrigger),一个是碰撞体组件(挂在了collider组件,没有勾选isTrigger),同时挂载了刚体组件rigidbody,并勾选了 is kinematic;这样碰撞的基础条件就具备了。

using System.Collection;
using System.Collection.Generic;
using UnityEngine;

public class Coin: MonoBehaviour
{
	void OnTriggerEnter(Collider other)
	{
		Debug.Log(other.name);
		gameObject.SetActive(false);
	}
}

Unity 基本概念与脚本编程

用unity创建的游戏是由一个或多个场景组成的,默认Unity会打开 一个场景。

在游戏开发时,绝大部分操作都是在某一个场景中进行的,因此一开始不用太关心场景之间的关系,只需要关心在一个场景之内发生的事情。实际上,关键的概念只有GameObject(游戏物体),Component(组件)和父子关系3个。

Unity中坐标 X代表右,Y代表上,Z代表前

变换组件(Transform)
Position(位置),XYZ,所有值都是float,单位长度1米,对应多少个像素在游戏里有设置。
Rotation(朝向), 由于“旋转”这个词容易在“旋转的动作”和“已经旋转到的位置”之间混淆,因此在本书中会使用“朝向”一词,以表明它是物体目前具有的状态。

按照三维设计软件的惯例,Unity中朝向也是用三个角度来表示的,分别是绕X轴,y轴和z轴的旋转角度, 这种用3个角度表示朝向或旋转的方法叫欧拉角。

虽然Unity在编辑器面板上使用欧拉角表示朝向,但是在引擎内部是使用四元数表示朝向和旋转的。

物体、组件和对象

为避免未来的讨论产生混淆,先澄清一个基本问题:某个自己编写的脚本是一种组件类(class) ,挂载在物体上的脚本是一个实例化的组件,即一个对象(编程语言中的object)。

创建物体

利用预制体创建物体,要使用实例化方法Instantiate,创建环形排列的是个物体。

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

public class CreateObj:MonoBehaviour
{
	public GameObject obj;
	void Start()
	{
		for(int i = 0; i++; i< 10)
		{
			Vector3 p = new Vector3(Mathf.Cos(i*2*Mathf.PI/10), 0, Mathf.Sin(i*2*Mathf.PI/10));
			Instantiate(obj,p,Quaternion.identity);
		}
		
	}
}

跟随主角的摄像机

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

public class FollowCamera:MonoBehaviour
{
	public GameObject target;
	Vector3 dis;
	void Start()
	{
		dis = gameObject.transform.position - target.transform.position;	
	}

	void LateUpdate()
	{
		gameObject.transform.position = target.transform.position + dis;
	}
}

实例——3D射击游戏

  • 游戏总体设计

俯视角的设计游戏,玩家从侧上方俯视整个场景。

你可能感兴趣的:(unity,3d,学习)