Unity 3D脚本
1 创建脚本
1.1 C#脚本
Project视图
右键 > Create
> C# Script
using UnityEngine;
public class CSharp : MonoBehaviour{
void Start(){
}
void Update(){
}
}
1.2 JavaScript脚本
Project视图
右键 > Create
> Javascript
function Start(){
}
function Update(){
}
以后脚本都以C#为例
1.3 设置脚本自定义图标
选中脚本 -> 点击
2 MonoBehaviour
所有继承MonoBehaviour
的类从脚本唤醒到销毁有着完整的生命周期
Awake()
唤醒方法
当游戏对象被创建时调用,无论脚本
是否激活
都会调用。
Start()
开始方法
在
脚本第一次激活
的时候立即执行(位于Awake()
之后执行),只会执行一次(即使重新激活脚本
,也不会执行了)。
Update()
更新方法
只要脚本处于激活状态之下,每一帧都会调用
Update()
LateUpdate()
延迟更新方法
处于激活状态下,在
Update()
调用后会调用LateUpdate()
FixedUpdate()
固定更新函数
在游戏运行过程中,每一帧处理的时间是不固定的。当需要固定间隔执行一些代码时就会用到
FixedUpdate()
函数。也是在激活状态下。
固定调用时间可以在:Edite
->Project Settings
->Time
下的Fixed Timestep
设置
OnDestory()
销毁事件
当前脚本
销毁
时调用。
OnDisable()
禁用事件
在脚本被
禁用
时调用(每次禁用都会调用)
OnEnable()
激活事件
脚本在
激活
时调用(每次激活都会调用)
OnGUI()
绘制GUI时调用。现在一般不适用此GUI。Untiy有了
UGUI
3 调试
Debug.Log() |
输出普通信息(白色) |
Debug.LogWarning() |
输出警告信息(黄色) |
Debug.LogError() |
输出错误信息(红色) |
void Start(){
Debug.Log("log...");
Debug.LogWarning("warning....");
Debug.LogError("error....");
}
4 游戏对象的操作
4.1 创建游戏物体
void Start(){
// 创建胶囊体
GameObject.CreatePrimitive(PrimitiveType.Capsule);
}
PrimitiveType
类型:
类型 | 说明 |
---|---|
Capsule | 胶囊体 |
Sphere | 球体 |
Cylinder | 圆柱体 |
Cube | 正方体 |
Plane | 平面 |
Quad | 片 |
4.2 获取游戏对象
通过指定
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
}
}
从Hierarchy
视图中拖一个游戏物体到My Cube
后面;或者点小圆圈选择一个。
同过代码获取游戏对象
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
// 通过游戏名称查找游戏对象
myCube = GameObject.Find("Cube");
// 通过标签查找游戏对象
myCube = GameObject.FindWithTag("Player");
// 也是通过游戏标签获取一个游戏对象
myCube = GameObject.FindGameObjectWithTag("Palyer");
// 通过标签获取多个游戏对象
var list = GameObject.FindGameObjectsWithTag("cubes");
// 通过类型或游戏对象
var obj = GameObject.FindObjectOfType(typeof(Rigidbody));
// 通过类型获取对象
var lists = GameObject.FindObjectsOfType(typeof(Rigidbody));
}
}
5 添加组件和修改组件
void Start(){
// 向当前游戏对象添加一个 刚体组件
gameObject.AddComponent<Rigidbody>();
// 获取当前游戏对象上的 刚体 组件
var rigidbody = GetComponent<Rigidbody>();
// 修改组件值
rigidbody.mass = 100;
}
其他组件操作都一样
6 发送消息
游戏对象间通讯
使用GameObject.SendMessage()
方法
// 方法名:要在游戏对象中调用的方法;
GameObject.SendMessage(string methodName);
// 方法名 和 要传递的`参数`
GameObject.SendMessage(string methodName, object value);
// 方法名 和 配置项->
GameObject.SendMessage(string methodName, SendMessageOptions option);
SendMessageOptions | |
---|---|
DontRequireReceiver | 不需要回应 |
RequireReceiver | 必须回应 |
GameObject.SendMessage(string methodName,object value ,SendMessageOptions option);
游戏对象A代码:
void Start(){
// 获取发送消息的游戏对象
var myCube = GameObject.Find("TestCube");
if(myCube != null){
// 向获取到的游戏对象发送消息
myCube.SendMessage("methodName");
}
}
TestCube游戏对象中代码:
// 额外添加 methodName 让A对象里的 SendMessage 调用。
public void methodName(){
print("call....");
}
SendMessageUpWards
向物体和父物体发送消息
BroadcastMessage
对物体和所有子物体发送消息(广播消息)
7 克隆游戏物体 Instantiate
方法
// 手动在unity编辑中赋值
public GameObject cube;
void Start(){
// 克隆cube 第一个参数就是 cube变量 第二个参数:克隆的游戏物体在世界中的这边 第三个参数:不旋转
var go = Instantiate(cube,Vector3.zero,Quaternion.identity);
}
8 移动、旋转和缩放游戏对象(Transform
组件)
每个游戏物体都会有一个Transform
组件,这个组件是无法移除的。
Transform
面板一共包含3个属性:Position
(位置) Rotation
(旋转) Scale
(缩放)
我们可以用
Scene
视图工具
来拖动和旋转游戏对象,也可以直接改变
Transform
组件里的值。
8.1 游戏对象的位置
在3D世界中,任何一个模型的三维坐标都保存在Vector3
结构中,该结构保存了 x坐标,y坐标,z这边。改变Vector3
结构里面的值,对应场景里面模型也会改变位置。
8.2 移动游戏对象
using UnityEngine;
public class Test : MonoBehaviour{
void Update(){
// 直接改变
transform.position = new Vector3(0, 100, 0);
// 相当于在游戏对象的当前位置 加上 给定的 Vector3
transform.Translate(new Vector3(0, 0, 10));
}
}
8.3 缩放游戏对象
// x为x轴向的缩放,y为y轴向的缩放,z为轴向的缩放
transform.localScale = new Vector3(x, y, z);
// 整体缩放 1.5 倍;
transform.localScale *= 1.5f;
8.4 旋转游戏对象
旋转有两种:
自转
-
围绕旋转
围绕一个点旋转
// 设置对象自转,按照z轴自转
transform.Rotate(Vector3.forward);
// 围绕一个点旋转 围绕的位置 按照z轴旋转 旋转角度
transform.RotateAround(myCube.transform.position, Vector3.forward, 2);
8.4 工具类
Time类
Time.time
当前游戏时间
Time.timeScale
游戏时间的缩放,当设置为0.5f
时,现实过去1秒,游戏过去0.5秒。
Time.deltaTime
上一帧所消耗是时间
Time.fixedTime
每一次执行FiexdUpdate的时间间隔
Time.fixdDeltaTime
固定更新上一帧消耗的时间
Time.realtimeSinceStartup
从游戏开始一直到现在的真实时间,不受Time.Scale影响。
Random类
Random.Range(int min,int max)
生成 min 到 max范围的随机数,返回int
Random.Range(float min,float max)
生成 min 到 max范围的随机数,返回float
8.5 输入控制Input
键盘:
Input.GetKeyDown(KeyCode.W)
按下 W
Input.GetKeyUp(KeyCode.S)
放开 S
Input.GetKey(KeyCode.A)
按住 A
鼠标:
Input.GetMouseButton(0)
鼠标 左键 按住
Input.GetMouseButtonDown(1)
鼠标 右键 按下
Input.GetMouseButtonUp(2)
鼠标 中键 抬起
自定义输入
主菜单 -> Edit
-> Project Settings
-> Input
-> Axes
Size 可以改变Axes
下的数量
Horizontal
菜单 (其它菜单参数都一样)
4_1.png
Name | 名称 |
Descripttive Name | 描述 |
Descripttive Negative Name | 描述负数 |
Negative Button | 负按钮 |
Positive Button | 正按钮 |
Alt Negative Button | 次要 负按钮 |
Alt Positive Button | 次要 正按钮 |
Gravity | 重力 按钮力度 |
Dead | 小于这个数的正值或负值 都将设置为0 |
Sensitivity | 灵敏度 |
Snap | 在接受到相反的输入,将立即重置为0 |
Invert | 反向,正的变负的 |
Type | 输入类型:Key or Mouse Button 按键Mouse Movement 鼠标移动 Joystick Axis 操纵杆 |
Axis | 来自设备的输入轴 |
Joy Num | 使用哪个操纵杆 |
通过代码来获取(Axis
)输入
// 获取`Axes`下 名称为 Horizontal 的输入
float horizontal = Input.GetAxis("Horizontal");
因为Horizontal设置主要按钮为:<-(方向键左) ->(方向键右) 次要按钮:a d
按下(A) horizontal就会时负值 (D) horizontal就是正值
移动设备输入Touch
触碰
fingerId
手指id
phase
手指的阶段
position
按下的坐标
Began | 开始接触屏幕 |
Moved | 移动 |
Stationary | 静止 |
Ended | 离开屏幕 |
Canceled | 系统关闭触摸屏 |
重力感应Acceleration
Vector3 posistion = Input.acceleration
posistion.x
正向为设备向右
posistion.z
正向为设备使用者方式
posistion.y
正向为设备向上
其它相关API
Input.deviceOrientation
当前游戏运行朝向
Input.touchSupported
是否支持手指触碰操作
Input.multiTouchEnable
是否支持多点触碰
网友评论