参考书籍:《Unity 2017 从入门到精通》
所有添加到游戏对象的C#脚本类都必须直接或间接从MonoBehaviour
类中继承。
使用Start
或者Awake
函数来初始化类,避免使用构造函数。
Start和Awake函数在一定条件下会被自动调用,称为必然事件。常见的必然事件还有Update、FixedUpdate和LateUpdate。
类名(特指从MonoBehaviour
类中继承的行为类)要与脚本文件名相同,否则在添加脚本到游戏对象时会提示错误。
协同函数(Coroutines)返回类型必须是IEnumerator,并且用yield return代替yield。
这一条还不是很明白。
访问游戏对象(GameObject)
GameObject.Find():寻找指定名称或路径的游戏对象。
无法查找隐藏对象,使用方便但效率低下。
GameObject.FindWithTag():寻找指定标签的游戏对象。
Transform.Find():通过名字或路径查找子对象。
可以查找隐藏对象,前提是transform所在根节点可见(active=true)。查找对象必须是transform节点下的子对象。
访问组件(Component)
一个游戏对象可以包含多个组件,且脚本也属于组件的一种。
新建命名为Player的空游戏对象,挂载Player.cs脚本。
脚本中在Player类中把要访问的游戏对象和组件声明为成员变量。
//声明GameObject成员变量
public GameObject cube;
//声明Transform成员变量
public Transform sphereTransform;
返回Unity,此时打开Player的检视视图,发现多了两个值为None的变量Cube和Sphere Transform。
将层级视图中的Cube和Sphere拖到Player脚本的对应变量中进行赋值(将对象和组件的引用保存到成员变量中)。实现了在脚本中访问这两个成员变量。
Coroutine称为协同程序,可以和主程序并行运行,和多线程类似。
鼠标输入的相关事件包括鼠标移动、按键的点击等。Input类中和鼠标有关的方法和变量如下:
名称 | 作用 |
---|---|
mousePosition | 获取当前鼠标指针位置的像素坐标(只读) |
GetMouseButtonDown | 鼠标按键按下的第一帧返回true |
GetMouseButton | 鼠标按键按住期间一直返回true |
GetMouseButtonUp | 鼠标按键松开的第一帧返回true |
GetAxis(“Mouse X”) | 得到一帧内鼠标在水平方向的移动距离 |
GetAxis(“Mouse Y”) | 得到一帧内鼠标在垂直方向的移动距离 |
鼠标指针位置通过屏幕的像素坐标来表示。屏幕左下角为原点(0,0),右上角为(Screen.width,Screen.height)。mousePosition变量类型为Vector3,x分量对应水平坐标,y分量对应垂直坐标,z分量始终为0。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateObjControl : MonoBehaviour
{
float horizontalSpeed = 2.0f;
float verticalSpeed = 2.0f;
// Update is called once per frame
void Update()
{
// 鼠标左键按住,0左键,1右键,2中键
if (Input.GetMouseButton(0))
{
float h = horizontalSpeed * Input.GetAxis("Mouse X");
float v = verticalSpeed * Input.GetAxis("Mouse Y");
transform.Rotate(v, h, 0); // 此处的transform是当前脚本挂载对象的组件
}
}
}
该示例中,脚本通过读取鼠标左键输入控制挂载对象旋转。
创建流程:
首先,初始化客户端,与服务器建立连接。
String address = "127.0.0.1";
int port = 8000;
IPAddress ip = IPAddress.Parse(address); //将address地址字符串转换成IPAddress实例
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//使用指定的地址簇协议、套接字类型和通信协议
IPEndPoint endPoint = new IPEndPoint(ip, port); // 用指定的ip和端口号初始化IPEndPoint实例
ClientSocket.Connect(endPoint); //与远程主机建立连接
这里的address可以是局域网或者互联网的IP地址,也可以是本机的IP地址(相当于本机既做服务器又做客户端,主要用于开发测试方便)。
客户端向服务器发送数据。
string data = "hello mstifiy!";
byte[] message = Encoding.UTF8.GetBytes(data);
ClientSocket.Send(message);
//ByteBuffer buffer = new ByteBuffer();
//buffer.WriteString(data);
//ClientSocket.Send(WriteMessage(buffer.ToBytes()));
客户端从服务器接收数据。
byte[] receive = new byte[150000];
ClientSocket.Receive(receive);
string data = Encoding.UTF8.GetString(receive);
//ClientSocket.Receive(receive);
//ByteBuffer buffer = new ByteBuffer(receive);
//string data = buffer.ReadString();
Canvas(画布)是存放所以UI的容器,所有的UI都必须放到画布的子节点下。
Inspector(检视视图)相关设置:
Render Mode | 渲染模式 |
---|---|
Screen Space-Overlay | 画布拉伸以适应全屏大小,使控件渲染与其他物体前方。 |
Screen Space-Camera | 画布以特定的距离放置在指定的相机前,UI被指定相机渲染。 |
World Space | 画布和其他游戏对象一样渲染于世界空间,此时可以调整Rect Transform来改变画布大小。 |
UI Scale Mode | UI的缩放模式 |
---|---|
Constant Pixel Size | 固定的像素大小 |
Scale With Screen Size | 根据屏幕大小进行缩放 |
Constant Physical Size | 固定的物理大小(cm、mm等) |
控件的相关参数和事件说明如下:
事件绑定
可视化创建及事件绑定。
新建脚本TestSlider.cs,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestSlider : MonoBehaviour
{
public void SliderOnValueChanged(float value)
{
Debug.Log("滑动条值变化:" + value);
}
}
将该脚本添加到Slider上,然后将层级视图中的Slider(也就是脚本挂载的对象)拖到On Value Changed事件中,然后选择对应的SliderOnValueChanged函数,即可完成事件绑定。
绑定成功后运行Unity,可以看到随着滑动条的拖动,控制台输出对应的值。
直接通过脚本监听事件。
新建脚本TestSlider.cs,代码如下:
using UnityEngine;
using UnityEngine.UI;
public class TestSlider : MonoBehaviour
{
public Slider m_Slider;
private void Start()
{
//监听滑动条变化事件
m_Slider.onValueChanged.AddListener(SliderOnValueChanged);
}
void SliderOnValueChanged(float value)
{
Debug.Log("滑动条值变化:" + value);
}
}
将该脚本添加到Slider对象上,并将其面板中的Slider变量设置为Slider对象。完成事件绑定。
运行效果和上一种方法相同。
通过滑动条实现对bunny兔子网格渲染颜色的改变,简称“变色兔”。
首先,把bunny.obj文件拖到Assets文件夹,并进行一些调整配置。
新建ColorChange.cs脚本,其代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ColorChange : MonoBehaviour
{
public Slider m_Slider;
public GameObject bunny;
public void bunny_color_change(float value)
{
bunny.GetComponent().material.color = new Vector4(value, value, value, 1);
}
}
绑定事件,运行。
效果如下: