Unity 5.x游戏开发指南笔记(一)

使用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)) {...}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值