当前位置:   article > 正文

Unity之C#脚本学习笔记

Unity之C#脚本学习笔记

参考书籍:《Unity 2017 从入门到精通》

C#脚本编写Tips

  • 所有添加到游戏对象的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)

一个游戏对象可以包含多个组件,且脚本也属于组件的一种。

  • GetComponent/GetComponents<组件(类型)名称>():得到组件/组件列表。
  • GetComponentInChildren/GetComponentsInChildren:得到得到对象或对象子物体上的组件/组件列表。

示例

  1. 新建命名为Player的空游戏对象,挂载Player.cs脚本。

  2. 脚本中在Player类中把要访问的游戏对象和组件声明为成员变量。

    //声明GameObject成员变量
    public GameObject cube;
    //声明Transform成员变量
    public Transform sphereTransform;
    
    • 1
    • 2
    • 3
    • 4
  3. 返回Unity,此时打开Player的检视视图,发现多了两个值为None的变量Cube和Sphere Transform。

  4. 将层级视图中的Cube和Sphere拖到Player脚本的对应变量中进行赋值(将对象和组件的引用保存到成员变量中)。实现了在脚本中访问这两个成员变量。

image-20221114091516041

协同程序

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是当前脚本挂载对象的组件
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

该示例中,脚本通过读取鼠标左键输入控制挂载对象旋转。

Socket通信

示例:创建简单的TCP客户端

创建流程:

  1. 创建Socket对象。
  2. 将新建的Socket对象连接指定的服务器IP和端口号。
  3. 发送数据到服务器和从服务器接收数据。

首先,初始化客户端,与服务器建立连接。

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);  //与远程主机建立连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里的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()));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

客户端从服务器接收数据。

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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

UGUI

Canvas

Canvas(画布)是存放所以UI的容器,所有的UI都必须放到画布的子节点下。

Inspector(检视视图)相关设置:

Render Mode渲染模式
Screen Space-Overlay画布拉伸以适应全屏大小,使控件渲染与其他物体前方。
Screen Space-Camera画布以特定的距离放置在指定的相机前,UI被指定相机渲染。
World Space画布和其他游戏对象一样渲染于世界空间,此时可以调整Rect Transform来改变画布大小。
UI Scale ModeUI的缩放模式
Constant Pixel Size固定的像素大小
Scale With Screen Size根据屏幕大小进行缩放
Constant Physical Size固定的物理大小(cm、mm等)

Slider滑动条示例

  • 在Scene中创建一个Slider对象,缩放到合适比例。

image-20221114203046046

控件的相关参数和事件说明如下:

  • 事件绑定

    • 可视化创建及事件绑定。

      新建脚本TestSlider.cs,代码如下:

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class TestSlider : MonoBehaviour
      {
          public void SliderOnValueChanged(float value)
          {
              Debug.Log("滑动条值变化:" + value);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      将该脚本添加到Slider上,然后将层级视图中的Slider(也就是脚本挂载的对象)拖到On Value Changed事件中,然后选择对应的SliderOnValueChanged函数,即可完成事件绑定。

      image-20221114212008422

      image-20221114212110752

      绑定成功后运行Unity,可以看到随着滑动条的拖动,控制台输出对应的值。

      image-20221114212325727

    • 直接通过脚本监听事件。

      新建脚本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);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

      将该脚本添加到Slider对象上,并将其面板中的Slider变量设置为Slider对象。完成事件绑定。

      image-20221114213137816

      运行效果和上一种方法相同。

总结示例

通过滑动条实现对bunny兔子网格渲染颜色的改变,简称“变色兔”。

首先,把bunny.obj文件拖到Assets文件夹,并进行一些调整配置。

image-20221114220943401

新建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<Renderer>().material.color = new Vector4(value, value, value, 1);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

绑定事件,运行。

image-20221114225136096

效果如下:

GIF 2022-11-14 23-04-35

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/93053
推荐阅读
相关标签
  

闽ICP备14008679号