Unity3D高级编程

1、标签(Tag)和图层(Layer)

他们都用于游戏物体分类,但是侧重点不一样。

标签便于代码中对特定物体进行操作。

图层则服务于渲染和碰撞管理,如控制摄像机渲染、光源影响及碰撞设置。

标签和图层的位置:

(1)标签Tag

用来对游戏物体进行分类的,从而更加方便的在代码中对某一类物体进行统一操作。

常用函数:

函数名        功能

GameObject.FindWithTag()

GameObject.FindGameObjectWithTag()

查找场景中指定标签的物体,但是当场景中有多个同样标签的物体时,无法保证返回的时哪一个。
GameObject.FindGameObjectsWithTag()返回场景中指定标签的所有物体

(2)层Layer

为了渲染和碰撞进行分类。

1)让摄像机只渲染某些层的物体,对另一些层的物体不渲染(即不显示)

2)让光源只照亮某些层的物体,而对另一些层的物体不影响。

3)供射线投射用于选择性地忽略碰撞体或创建碰撞

函数名功能
Physics.Raycast()发射射线、检测碰撞。其中有一个参数可以选择射线可以与哪些层的物体发生碰撞检测
collider2D.IsTouchingLayers()collider是一个2D碰撞体,此函数判断此2D碰撞体是否与指定层上的物体接触
gameObject.layer获取该游戏物体对应的层

4)设置层与层之间能否碰撞

在【Edit -> Project Settings -> Physics】中,

用来设置层与层之间能否发生碰撞的。如果把✔去掉,就表示行和列分别对应的两个层不会发生碰撞。

2、预制体

(1)预制体变体

当你将一个已经是预制体的游戏对象再次拖入Assets窗口时,弹窗就会提示,想要创建另一个原始预制体还是想要创建该原始预制体的变体。当选择第二个选项,则预制体变体创建成功。

预制体变体是原始预制体的派生类(是子类),子类也受到基类的影响,但也可以和基类有不同的地方。其不同的地方不受基类影响,子类也可以New实例,叫做预制体变体实例。

(2)修改预制体

如果Hierarchy中预制体实例被修改了,面板上就会多出一些选项。

当前预制体实例添加了2物体之后,图片出现"+"号,这表示这个2是新添加的,并不是原始预制体本身拥有的。此时可以:

1)Revert All:重置预制体,清除所有修改,把预制体变回原来的样子

2)Apply All:应用所有修改,报错所有修改,此时Assets中的预制体也将被改变

(3)将预制体实例变回一个普通的GameObject

断绝预制体实例和Assets中预制体的关系,它就会变回一个普通的游戏物体。

(4)删除预制体

当删除了Assets中的预制体,Hierarchy中的此预制体实例会变红,这时在提示我们预制体丢失,但不会影响使用,想让他不再是红色,破坏它把它变回普通游戏物体即可。

3、Time类使用

属性        功能
Time.time        游戏开始到现在所花的时间,单位是秒。
Time.timeScale时间缩放值,值1意味着实时。值0.5意味着半速,值0意味着暂停。用于游戏的快进暂停功能
Time.deltaTime上一帧到这一帧的游戏时间
Time.fixedDeltaTime固定时间间隔

4、异步加载场景

示例代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AsyncTest : MonoBehaviour
{
    private AsyncOperation operation;
    float timer = 0;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(loadScene());    
    }

    IEnumerator loadScene()
    {
        operation = SceneManager.LoadSceneAsync("SampleScene");
        operation.allowSceneActivation = false;
        yield return operation;

    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log(operation.progress);
        timer += Time.deltaTime;

        if(timer > 5)
        {
            operation.allowSceneActivation = true;
        }
    }
}

5、角色移动

(1)直接修改组件位置

最基础的方式,是改变物体位置的最直接的方式。

适用于既没有物理系统,也对移动没有特殊要求的情况。

示例:

public class MoveTest : MonoBehaviour
{
    public float speed;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Move();
    }

    void Move()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveZ = Input.GetAxisRaw("Vertical");
        Vector3 dir = new Vector3(moveX, 0, moveZ).normalized;

        transform.Translate(dir * Time.deltaTime * speed);
    }
}

注意!!

1)GetAxis和GetAxisRaw的区别:如果你希望有一个平滑的输入响应,适用于移动角色等需要渐变效果的情况,可以使用 Input.GetAxis("Horizontal")。如果你需要快速、立即响应的输入,比如在一些快节奏的游戏中,可能更适合使用 Input.GetAxisRaw("Horizontal")。

2)直接移动的方法汇总:

  • transform.Translate(dir * Time.deltaTime * speed);
  • transform.position += dir * Time.deltaTime * speed;
  • transform.TransformPoint(dir * Time.deltaTime * speed);

(2)资源商城下载角色控制系统成品

比如去商城搜索 3rd person

(3)角色控制器组件Character Controller

向人物添加Character Controller组件

参数描述
Slope Limit 斜度限制可直接沿着向上移动的最大坡度
Step Offset 每步偏移量可直接跨越的最大障碍高度
Skin Width 蒙皮厚度皮肤厚度,值较大可减少抖动,较小可能导致角色卡住,一般设置为半径的10%(ps:但是这样会导致角色挨不着地面,所以这时候可以调整Center的Y轴值,即可使角色接触地面)
Min Move Distance 最小移动距离当橘色的单次移动距离小于该值时,则被忽略,不生效。可用于减少抖动
Radius & Height 半径和高度所控制角色的半径和高度

示例:

public class MoveTest : MonoBehaviour
{
    private CharacterController player;

    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 dir = new Vector3(horizontal, 0, vertical);
        player.SimpleMove(dir);

        if(player.isGrounded)
        {
            Debug.Log("正在地面上...");
        }
    }
}

注意!!移动的两个方法Move和SimpleMove的区别:

1)Move为更复杂的移动,不计算重力影响。

  • 无重力效果,自定实现重力,可做跳跃功能
  • 返回值(CollisionFlags对象),返回角色与物体碰撞的信息

2)SimpleMove:以一定速度来移动,移动时自动计算重力因素影响

  • 不受Y轴速度影响,自带重力吓偶句,无法实现跳跃功能
  • 返回值为Bool,当角色接触地面返回True,反之为False
  • SimpleMove方法是CharacterController组件提供的一个用于处理角色平面移动的简化方法,它自动处理了角色与地面的碰撞检测和摩擦,但它不支持跳跃等垂直方向的动作

(4)通过物理系统自己做

通过物理方式对物体施加力,改变物体运动状态的方式让物体移动,其中最核心的组件就是Rigidbody。

Rigidbody参数说明:

示例:

public class MoveTest : MonoBehaviour
{
    Rigidbody rb;
    public float speed;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 dir = new Vector3(horizontal, 0, vertical).normalized;
        rb.MovePosition(transform.position + dir * Time.deltaTime * speed);
    }
}

刚体移动的方法:

  • AddForce: rb.AddForce(dir * speed * Time.deltaTime)
  • 修改velocity:rb.velocity += dir * speed * Time.deltaTime
  • MovePosition: rb.MovePosition(transform.position + dir * speed * Time.deltaTime);

(5)CharacterController和Rigidbody的区别

1)CharacterController

  • 处理斜坡
  • 处理台阶
  • 不会卡墙

2)Rigidbody

  • 自带重力
  • 提供阻力
  • 可以和物理对象交互

(6)完整的角色控制器代码

示例代码:

public class MoveTest : MonoBehaviour
{
    private CharacterController cc;
    public float speed = 12f;
    public float gravity = -9.81f;
    public float jumpHeight = 3f; // 跳跃高度

    public Transform groundCheck; // 用来获取生成球体的位置
    public float groundDistance = 0.4f;
    public LayerMask groundMask; // 值判断为地面的层

    Vector3 velocity;
    bool isGrounded; // 检测是否在地面

    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {

        // CheckSphere 检验球,创建一个看不见的球用来检测,碰到就是true没有碰到就是false
        // 第一个值是球的位置,第二个是圆的半径,第三个是可筛选的层
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask); // 检测是否在地面

        if ((isGrounded && velocity.y < 0))
        {
            velocity.y = -2;
        }

        float moveX = Input.GetAxisRaw("Horizontal");
        float moveZ = Input.GetAxisRaw("Vertical");

        Vector3 dir = (transform.right * moveX + transform.forward * moveZ).normalized;

        // 平移
        cc.Move(dir * speed * Time.deltaTime);

        if(Input.GetButtonDown("Jump") && isGrounded)
        {
            // 物理公式 v=sqrt(v*-2*g)
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        velocity.y += gravity * Time.deltaTime;

        // 再乘一个Time.deltaTime是由物理决定的1/2gt^2
        cc.Move(velocity * Time.deltaTime);

    }
}

6、拖尾(Trail Render组件)

新建拖尾(右键 -> 效果 -> 拖尾新增),也可以在其他物体上加Trail Render组件。

实现简单的拖尾修改配置如下:

效果:

7、游戏对象的Transform

Transform属性可以进行位置、旋转、大小的设置。

1)位置:position

2)旋转:rotate

3)大小:localScale

左右翻转怎么做?

position不行,rotate不行,所以可以考虑localScale属性。

localScale对应坐标的值*-1即可。

   x值从1变为-1后:   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

IDEA最新最全设置教程(包括常用的插件)

一、目的 统一安装一些必要的插件,方便大家开发。统一代码格式、注释格式、统一字符集编码。新加入的同事可以快速适应和熟悉,不需要在讲解IDEA配置问题。二、IDEA要修改的设置 新项目设置和设置 1. Java编译版本 这里请使用自己的JDK 2. 统一IDEA字符集 统一使用UTF-8 无…

日本IT工作好找吗?

在日本做IT是否好找工作&#xff0c;实际上取决于多个因素&#xff0c;包括个人的技术能力、日语水平、工作经验以及市场需求等。以下是对这一问题的详细分析&#xff1a; 技术能力与日语水平 技术能力&#xff1a;IT行业是一个技术密集型行业&#xff0c;技术能力自然是求职…

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…

用 Python 从零开始创建神经网络(六):优化(Optimization)介绍

优化&#xff08;Optimization&#xff09;介绍 引言 引言 在随机初始化的模型中&#xff0c;或者即使是采用更复杂方法初始化的模型中&#xff0c;我们的目标是随着时间的推移培训或教育一个模型。为了训练一个模型&#xff0c;我们调整权重和偏差以提高模型的准确性和置信度…

架构篇(04理解架构的演进)

目录 学习前言 一、架构演进 1. 初始阶段的网站架构 2. 应用服务和数据服务分离 3. 使用缓存改善网站性能 4. 使用应用服务器集群改善网站的并发处理能力 5. 数据库读写分离 6. 使用反向代理和CDN加上网站相应 7. 使用分布式文件系统和分布式数据库系统 8. 使用NoSQL和…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…

【网络安全】公钥基础设施

1. PKI 定义 1.1 公钥基础设施的概念 公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;是一种基于公钥密码学的系统&#xff0c;它提供了一套完整的解决方案&#xff0c;用于管理和保护通过互联网传输的信息。PKI的核心功能包括密钥管理、…

【计算机网络】UDP网络程序

一、服务端 1.udpServer.hpp 此文件负责实现一个udp服务器 #pragma once#include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <functional> #include <strings.h> #include <unistd.h> #incl…

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

Zabbix中文监控指标数据乱码

1&#xff09;点击主机&#xff0c;选择Zabbix server 中的 图形 一项&#xff0c;可以看到当前显示的为乱码 2&#xff09; 下载字体文件&#xff1a; https://gitcode.com/open-source-toolkit/4a3db/blob/main/SimHei.zip 解压unzip -x SimHei.zip 3&#xff09; 替换字体文…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js&#xff0c;需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…

ArkTs简单入门案例:简单的图片切换应用界面

在鸿蒙 OS 应用开发的过程中&#xff0c;我们常常需要通过组合各种组件和编写相应的逻辑来实现丰富多样的功能。今天&#xff0c;我就来和大家详细解析一段实现简单图片切换功能的代码&#xff0c;希望能帮助到那些刚接触鸿蒙 OS 应用开发的朋友们。 一、代码导入部分 Entry …

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …