文章目录
- 使用UnityGUI
- 调试
- 游戏对象的创建
- 基本函数
- 获取游戏对象
- 方法一
- 方法二
- 添加组件与修改组件
- 发送广播与消息
- 克隆
- 移动、旋转、缩放游戏对象
- 移动游戏对象
- 缩放游戏对象
- 旋转游戏对象
- 工具类
- 四元数
- 输入控制
使用UnityGUI
首先先创建一个空的GameObject,编写脚本
using System.Collections.Generic;
using UnityEngine;
public class ShowName : MonoBehaviour {
string text = "";
string myName = "";
void OnGUI()
{
//用标签显示文本
GUILayout.Label("请输入你的名字");
//用文本区域输入名字
text = GUILayout.TextField(text);
if (GUILayout.Button("提交"))
{
myName = text;
}
//当myName不为空时,说明已经提交了名字
if (!string.IsNullOrEmpty(myName))
{
GUILayout.Label("提交成功,名字: " + myName)
}
}
}
将该脚本作为组件添加到之前创建的GameObject上即可
GUILayout是自动布局的
调试
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestDebug : MonoBehaviour {
// Use this for initialization
void Start () {
Debug.Log("普通信息");
Debug.LogWarning("警告信息");
Debug.LogError("错误信息");
}
// Update is called once per frame
void Update () {
}
}
游戏对象的创建
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateGameObject : MonoBehaviour {
void OnGUI()
{
if(GUILayout.Button("创建立方体",GUILayout.Height(50)))
{
//设置该模型默认为立方体
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
//为对象添加一个刚体,赋予物理属性
obj.AddComponent<Rigidbody>();
//赋予对象的材质红色
obj.GetComponent<Renderer>().material.color = Color.red;
//设置对象的名称
obj.name = "Cube";
//设置此模型材质的位置坐标
obj.transform.position = new Vector3(0,5f,0);
}
if(GUILayout.Button("创建球体",GUILayout.Height(50)))
{
//设置该模型默认为立方体
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
//为对象添加一个刚体,赋予物理属性
obj.AddComponent<Rigidbody>();
//赋予对象的材质绿色
obj.GetComponent<Renderer>().material.color = Color.green;
//设置对象的名称
obj.name = "Sphere";
//设置此模型材质的位置坐标
obj.transform.position = new Vector3(0,5f,0);
}
}
}
基本函数
AddComponent函数是会自动添加依赖的。当添加组件时,其依赖的组件也会被自动添加。例如关节HingeJoint依赖刚体Rigidbody,当添加HingeJoint时,如果Rigidbody未添加,则Rigidbody也会被自动添加到游戏对象上
renderer.material.color设置渲染材质的颜色
transform.position设置游戏对象的位置,该位置是位于世界坐标系下的。如果要设置物体坐标系下的位置,即相对于父节点下的位置,则用到的是transform.localPosition
获取游戏对象
方法一
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetGameObject1 : MonoBehaviour {
public GameObject obj;
void Start()
{
obj.GetComponent<Renderer>().material.color = Color.red;
}
}
这里在代码当中定义了一个obj对象,但是obj对象还没有绑定到已存在的模型上。可以先把他当做组件放到之前创建的gameobject上,打开Inspector界面
)]
可以看到obj对象还没有指定相应的游戏对象。
先在Hierarchy视图中创建一个TestCube的cube模型,如图所示
用鼠标选中TestCube,将其拖动到上图None(Game Object)的位置,拖动后,发现
TestCube已经绑定到obj上了,运行场景
新创建的cube被改为红色了
方法二
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetGameObject2 : MonoBehaviour {
// Use this for initialization
private GameObject obj;
void Start () {
obj = GameObject.Find("TestCube");
obj.GetComponent<Renderer>().material.color = Color.red;
}
// Update is called once per frame
void Update () {
}
}
直接通过GameObject.Find()获取全局下name为TestCube的游戏对象,将其颜色改为红色,直接将其作为组件添加给上述的GameObject,运行场景,效果和方法一一致,cube变为红色。
添加组件与修改组件
添加组件时主要使用AddComponent方法,而删除组件时,需要使用Object.Destroy()方法,参数为需要删除的游戏对象或组件。需要注意的是:如果要删除的是某一游戏对象,则这个游戏对象下的所有组件也会被一并删除
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AlterComponent : MonoBehaviour {
public Texture texture;
private GameObject obj;
private Renderer renderer;
// Use this for initialization
void Start () {
//获取游戏对象
GameObject obj = GameObject.Find("TestCube");
//获取该对象的渲染器
renderer = obj.GetComponent<Renderer>();
}
void OnGUI()
{
if(GUILayout.Button("添加颜色",GUILayout.Width(100),GUILayout.Height(50)))
{
//修改渲染颜色为红色
renderer.material.color = Color.red;
}
if(GUILayout.Button("添加贴图",GUILayout.Width(100),GUILayout.Height(50)))
{
//添加组件贴图
renderer.material.mainTexture = texture;
}
}
}
这里随便选了一张图片作为贴图,绑定到texture属性上
运行结果如下:
发送广播与消息
游戏对象之间的互动可以通过广播来传递消息。
广播函数原型:
GameObject.SendMessage(string methodName,object value = null,SendMessageOptions options = SendMessageOptions.RequireReceiver)
调用这个函数,会向这个游戏对象所有的脚本发送信息。第一个参数是消息的名称,所有Monobehavior脚本里与该名称同名的方法将被调用,第二个参数是向该方法传递的参数,第三个参数是是否必须有接受方法的选项,一般选不要求接受方法即可。
//发送方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SendMessage : MonoBehaviour {
// Use this for initialization
public GameObject receiver;
void Start () {
receiver.SendMessage("ShowNumber", 100, SendMessageOptions.DontRequireReceiver);
}
// Update is called once per frame
void Update () {
}
}
//接受方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ReceiveMessage : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void ShowNumber(int number)
{
Debug.Log("收到的数字是 : " + number);
}
}
绑定Receiver的游戏对象
克隆
克隆指克隆具有一定功能的现成的对象,如果这个现成的对象已经被保存为文件的话,则称之为预制体。
使用Instantiate()函数完成克隆操作
首先,先制作一个预制体(prefebal)
一:在Assets文件中,右击选择Create,选择Folder,创建一个文件夹,文件夹命名为Prefebal
二:在该文件夹下右击选择Create,选择Prefebal,创建了一个空的Prefebal
三:创建一个Cube,重命名为TestPrefebal,将其拖到刚才创建到空的prefebal中
这样一个prefebal就创建完成了,此时可以先将hierarchy中创建的cube删除
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClonePrefebal : MonoBehaviour {
// Use this for initialization
public GameObject prefebal;
void Start () {
//克隆预制体
GameObject obj = Instantiate(prefebal) as GameObject;
//设置游戏对象obj的位置
obj.transform.position = new Vector3(0, 3, 0);
}
// Update is called once per frame
void Update () {
}
}
老规矩,将其拖到一个Gameobject上
点击小齿轮,可以看到当前已有的资源
搜索Test,将其绑定到Prefebal上
运行场景,可以发现场景中多出了一个cube了
移动、旋转、缩放游戏对象
unity中,每个游戏对象都会带有transform属性,即使这个游戏对象其他属性都没有,但transform一定是会有的。比如我创建一个空的gameobject
transform属性一定是存在的
这三个属性的作用也如他们的英文名一样,position设置的是该对象在世界坐标系中的位置,Rotation设置该对象的旋转角度,Scale设置该对象的缩放比例
移动游戏对象
在界面中,按w即可移动
脚本中:
transform.Translate(Vector3 offset);
//相当于
transform.position = transform.position + offset;
缩放游戏对象
在界面中,使用R
脚本中:
transform.localScale = new Vector3(x,y,z);
//如果三个轴的缩放比例一致的话,像下面这样,三个方向上同时拉伸1.2倍
transform.localScale *= 1.2f
旋转游戏对象
界面中,按e
脚本中:
//设置游戏对象自转
transform.Rotate()
//设置游戏对象围绕某一个点旋转
transform.RotateAround()
//上一帧消耗的时间,用作模型旋转的速度系数
Time.deltaTime
//x轴的正方向
Vector3.right
//y轴正方向
Vector3.up
//z轴正方向
Vector3.forward
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AlterObject : MonoBehaviour {
//游戏对象一定要设置成public,否则无法完成绑定
public GameObject cube;
public GameObject cylinder;
void OnGUI()
{
if (GUILayout.Button("向左移动物体"))
{
cube.transform.Translate(new Vector3(-0.5f, 0, 0));
}
if (GUILayout.Button("向右移动物体"))
{
cube.transform.Translate(new Vector3(0.5f, 0, 0));
}
if (GUILayout.Button("放大物体"))
{
cube.transform.localScale *= 1.2f;
}
if (GUILayout.Button("缩小物体"))
{
cube.transform.localScale *= 0.8f;
}
if(GUILayout.Button("旋转物体")){
cube.transform.Rotate(new Vector3(0, 10, 0));
}
if (GUILayout.Button("围绕球体旋转物体"))
{
cube.transform.RotateAround(cylinder.transform.position, Vector3.up, 10);
}
}
}
说明一下RotateAround(),第一个参数是指定旋转的物体,第二个参数是指定旋转的轴,第三个参数是旋转的角度
工具类
//Time类
//当前游戏时间
Time.time
//游戏时间的缩放(即时间流逝的速度,为1时,游戏时间和真实世界的时间是一致的)
Time.timeScale
//上一帧所消耗的时间
Time.deltaTime
//固定增量时间(每一次执行FixedUpdate()函数的时间间隔。可通过“Edit""Project Settings""Time"菜单项设置
Time.fixedDeltaTime
//固定更新上一帧所消耗的时间
Time.fixedDeltaTime
//真实逝去时间(截止到目前共运行的真实时间,不受Time.scale影响,游戏暂停该时间仍然增加)
Time.realtimeSinceStartup
四元数
精确计算模型旋转角度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateObject : MonoBehaviour {
public GameObject obj;
const float rotateSpeed = 50f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//模型绕y轴旋转
obj.transform.rotation = Quaternion.Euler(0f, rotateSpeed * Time.time, 0);
}
}
输入控制
PC端输入指键盘和鼠标的输入检测,一般分为3类,按下,按住,抬起
//按下A键
if(Input.GetKeyDown(KeyCode.A)){...}
//按住A键
if(Input.GetKey(KeyCode.A)) {...}
//抬起A键
if(Input.GetKeyUp(KeyCode.A)) {...}
//按下鼠标左键
if(Input.GetMouseButtonDown(0)){...}
//按住鼠标左键
if(Input.GetMouseButton(0)) {...}
//抬起鼠标左键
if(Input.GetMouseButtonUp(0)) {...}
//按下鼠标右键
if(Input.GetMouseButtonDown(1)){...}
//按住鼠标右键
if(Input.GetMouseButton(1)) {...}
//抬起鼠标右键
if(Input.GetMouseButtonUp(1)) {...}