cpp,git,unity学习
c#中的?
1. 空值类型(Nullable Types)
?
可以用于值类型(例如 int
、bool
等),使它们可以接受 null
。通常,值类型不能为 null
,但是通过 ?
可以表示它们是可空的。
int? number = null; // 可空类型,可以为 null
2. 空条件运算符(Null-conditional Operator)
这个 ?
用在对象或委托前面,用于在调用成员或方法时检查对象是否为 null
。如果对象为 null
,那么整个表达式返回 null
,而不是抛出异常。
MyClass obj = null;
int? length = obj?.Length; // 如果 obj 为 null,length 会是 null 而不是抛出异常
在委托上,也可以用来安全地调用委托,避免调用 null
委托时抛出异常:
Action action = null;
action?.Invoke(); // 如果 action 是 null,什么也不做,而不会抛出异常
3. 空合并运算符(Null-coalescing Operator)
??
是另一个与 ?
相关的运算符,它用于提供一个默认值,当左侧表达式为 null
时,返回右侧的值。
string name = null;
string displayName = name ?? "Unknown"; // 如果 name 是 null,displayName 为 "Unknown"
4. 空合并赋值运算符(Null-coalescing Assignment Operator)
从 C# 8.0 开始,??=
是空合并赋值运算符,它判断变量是否为空,如果为空就把后面的值给赋上(这里是把后面的“hello world 赋值给message”)。
string message = null;
message ??= "Hello, World!"; // 如果 message 是 null,赋值为 "Hello, World!"
5. 三元运算符(Ternary Conditional Operator)
最后就是最简单常见的用法,三元运算符? A:B 条件判断值。
int x = 5;
string result = (x > 3) ? "Greater" : "Less"; // 如果 x 大于 3,result 是 "Greater"
抽象类
变量和字段:抽象类可以定义实例变量(字段)和静态变量,它们可以赋值并存储数据,和普通类没有区别。
public abstract class Animal
{public string Name { get; set; } = "Unnamed Animal"; // 普通属性private int age = 5; // 私有字段public int GetAge(){return age; // 非抽象方法可以访问私有字段}
}
必须继承才能使用:因为抽象类不能直接实例化,任何抽象类中的方法、字段和属性都只能通过继承它的类来使用。
单例panel
GUI.Label
GUI.Label
的重载主要有以下几种:
GUI.Label(Rect position, string text)
:根据指定位置绘制文本标签。GUI.Label(Rect position, GUIContent content)
:使用GUIContent
对象绘制标签,可以包含文本和图像。GUI.Label(Rect position, string text, GUIStyle style)
:使用指定样式绘制标签。GUI.Label(Rect position, GUIContent content, GUIStyle style)
:使用指定样式和GUIContent
绘制标签。
GUI
核心五参
GUI里的东西都是在代码里写的,现在更多的是程序测试的作用,在lateupdate 和ondisable之间执行,只有继承mono才能在OnGUI里写ui
unity编译器版本不同(issue)
使用不同版本的 Unity 编译器时,可能会遇到以下问题:
-
API 不兼容:
- 新版本可能移除或更改某些 API,导致编译错误或警告。
-
脚本行为变化:
- 脚本的执行顺序、生命周期方法(如
Awake
,Start
)的行为可能会有所不同。
- 脚本的执行顺序、生命周期方法(如
-
资源导入设置:
- 材质、模型和其他资源在新版本中可能需要重新导入,可能导致外观变化。
-
新特性和弃用:
- 新版本中引入的新特性可能无法在旧版本中使用,而被弃用的特性可能在新版本中仍会触发警告。
-
编辑器界面变化:
- 编辑器的布局和功能可能会有所不同,影响工作流程。
git再触发
gitlab是帮用户协同开发的,然后,里面的概念为组,同一个组的就可以协同修改一个项目
组的概念
-
组:
- 组是一个集合,通常包含多个项目和用户。它可以用于组织和管理团队的工作。
- 同一个组的成员可以协同开发,共享项目和资源。
-
项目:
- 一个组可以有一个或多个项目。项目是具体的代码库和开发环境,团队成员可以在其中进行协作。
-
协同开发:
- 组内成员可以对项目进行代码修改、提交、合并请求等操作,进行协同开发。
- 组中的权限可以根据角色(如拥有者、维护者、开发者等)进行设置,以控制不同用户的访问和操作权限。
组员权限是怎么样的,有等级制度吗
权限等级
-
拥有者(Owner):
- 具有最高权限,可以管理组和所有项目,设置成员权限,删除项目等。
-
维护者(Maintainer):
- 可以进行大多数管理操作,包括合并请求、推送代码、管理项目设置等。
-
开发者(Developer):
- 可以推送代码、创建分支、提交合并请求,但不能删除项目或修改某些设置。
-
报告者(Reporter):
- 主要用于查看和评论代码,可以查看项目,但不能推送或更改代码。
-
访客(Guest):
- 权限最低,通常只能查看公开项目的信息,无法进行任何修改。
首先是进组,然后得到组长给的权限,这个组里的所有项目都可以看
项目成员:
- 项目可以从组中自动继承成员。如果您将一个项目添加到组中,组内的成员可以根据角色访问该项目。
- 也就是你开了新项目,默认就把你组里的人全拉进去了,但是在项目里,你也可以自己再调控成员的权限
只有你自己创建的组,你是组长,才可以往组里拉人,
可以只项目拉人,不让他进组是吗:是的,在 GitLab 中,您可以单独将用户添加到某个项目,而不将他们添加到整个组。
但在你组里的人会自动继承到你的项目里,要改他的权限就必须改组里他的权限
项目单独拉进的人可以改权限,组里的则是直接继承权限,只能改组的权限
组里可做多个项目,每个项目又可单独修改人员,而如果是组的人员,会继承组里的权限
组里的人在项目里,权限只能更高不能更低
组开项目,组员权限只能比组里高不能低,项目可以邀请非组员,任意设置权限大小
组可多个,组里的项目也可多个,除了组员的权限,各个项目相互独立
mono(生命周期函数)执行顺序
Awake()
:在对象创建时调用,用于初始化。
Start()
:在所有 Awake()
完成后首次激活时调用,适合依赖其他组件的初始化。
梯队一样
-
执行顺序:
- Unity 在每一帧中依次检查并调用不同的生命周期方法,按以下顺序:
Awake()
:首先检查所有对象的Awake()
方法并执行。OnEnable()
:接着检查所有对象的OnEnable()
方法并执行。Start()
:然后检查所有对象的Start()
方法并执行。FixedUpdate()
:按固定时间间隔调用,适用于物理更新。在每个物理帧中执行。Update()
:最后进入每帧调用的Update()
方法。LateUpdate()
:在所有Update()
方法之后,调用所有对象的LateUpdate()
方法。- OnGUI()
OnDisable()
:如果对象在这一帧中被失活,OnDisable()
会在所有更新方法之后被调用。
- Unity 在每一帧中依次检查并调用不同的生命周期方法,按以下顺序:
-
激活与失活的影响:
- 激活:如果一个对象被激活,它的
OnEnable()
会被调用。首次激活时,如果对象还没有调用过Awake()
和Start()
,则会按照顺序执行。 - 失活:当对象失活时,
OnDisable()
会被调用,之后的Update()
不会再执行。
- 激活:如果一个对象被激活,它的
FixedUpdate
和 LateUpdate
FixedUpdate
- 用途:
FixedUpdate
主要用于处理物理相关的逻辑,比如 Rigidbody 的移动和碰撞检测。 - 调用频率:它在固定时间间隔内被调用,不受帧率影响,通常每秒调用 50 次(可在项目设置中调整)。
- 使用示例:
void FixedUpdate() {// 处理物理运动Rigidbody rb = GetComponent<Rigidbody>();rb.MovePosition(rb.position + Vector3.forward * Time.fixedDeltaTime); }
LateUpdate
- 用途:
LateUpdate
在所有Update
方法执行后调用,适合处理相机跟随、动画等逻辑,这样可以确保在更新其他对象后再执行。 - 调用频率:与
Update
相同,每帧调用一次。 - 使用示例:
void LateUpdate() {// 确保在所有更新后执行,比如相机跟随Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y + 5, transform.position.z - 10); }
FixedUpdate
:用于物理计算,适合处理 Rigidbody。LateUpdate
:用于依赖于其他对象更新后的逻辑,比如相机跟随。
对象失活的注意事项
-
对象失活:
- 当一个
GameObject
被设为失活时,它及其所有子对象的组件(包括脚本、渲染器等)都不会运行。这意味着Update
、Awake
、Start
等生命周期方法都不会被调用。
- 当一个
-
脚本的执行顺序:
- Unity 在游戏运行时根据对象的激活状态来决定是否调用脚本的方法。例如,只有在对象激活时,
Awake
和Start
方法才会被执行。
- Unity 在游戏运行时根据对象的激活状态来决定是否调用脚本的方法。例如,只有在对象激活时,
-
对象状态的影响:
- 如果您希望在对象激活后执行某些逻辑,您需要确保在激活之前设置好所需的数据。可以使用其他方法(如事件、消息系统等)来在对象激活后通知它执行特定的操作。
-
检测对象状态:
- 在脚本中,可以使用
gameObject.activeSelf
和gameObject.activeInHierarchy
来检查对象的状态,以便在需要时做出适当的响应。
- 在脚本中,可以使用
被失活对象的 OnDisable
方法会在当前帧的末尾被调用,意味着在调用 SetActive(false)
之后,该对象的逻辑在这一帧内可以继续运行,直到该帧结束。
1. Controller.cs(控制器脚本)
这个脚本会在每帧中打印一条消息,并在第二次更新时将目标对象失活。
using UnityEngine;public class Controller : MonoBehaviour {public GameObject targetObject; // 目标对象private int frameCount = 0;void Update(){frameCount++;Debug.Log("Controller Update - Frame: " + frameCount);// 在第2帧将目标对象失活if (frameCount == 2){Debug.Log("Disabling targetObject");targetObject.SetActive(false);}} }
2. Target.cs(目标对象脚本)
这个脚本会在每帧中打印一条消息,并在被失活时打印另外一条消息。
using UnityEngine;public class Target : MonoBehaviour {void Update(){Debug.Log("Target Update - I'm still active!");}void OnDisable(){Debug.Log("Target has been disabled.");} }
使用说明
创建对象:
- 在 Unity 中,创建两个对象:一个名为
Controller
(挂载Controller.cs
),另一个名为Target
(挂载Target.cs
)。连接目标:
- 在
Controller
对象的 Inspector 中,将Target
对象拖放到targetObject
字段中。运行场景:
- 当您运行场景时,您将看到控制器每帧打印的信息。到达第二帧时,控制器会调用
SetActive(false)
使目标对象失活。输出示例
在控制台中,您可能会看到类似如下的输出:
关键点
- 在第二帧,
Target
的Update
方法仍然被调用,直到SetActive(false)
后,该对象的OnDisable
方法被调用。- 通过这个示例,您可以直观感受
SetActive(false)
的效果。
在 Unity 中,当您调用 SetActive(false)
使对象失活时,所有 MonoBehaviour 的生命周期方法(包括 Update
、FixedUpdate
、LateUpdate
和其他方法)会继续在当前帧执行,直到该帧结束。
数据保存的问题
对于一个panel脚本,挂载到对象身上,如果一开始对象就是失活的,里面的脚本也不会被执行
也就是里面的初始化数据什么的,对象赋值和引用什么的,都不成立,该对象甚至也为空
如果您需要在对象失活时更新数据(例如,分数、状态等),您可以通过其他脚本或类来管理这些数据。在失活状态下,您无法直接修改该对象的数据,但可以通过外部逻辑进行修改。
如何保持数据一致性
- 在激活时更新显示:
- 当您再次激活对象时,可以在
OnEnable
方法中读取这些字段,并在 UI 或其他地方显示最新的数据。
- 当您再次激活对象时,可以在
. 面板数据的保存
-
数据管理:可以通过脚本保存面板的数据,例如使用 ScriptableObject、PlayerPrefs 或自定义数据结构。
-
在失活时保持数据:如果一个对象失活,其数据不会被清除。您可以在脚本中定义一个变量来保存面板状态,然后在对象被激活时读取该数据并更新 UI。
大多数的信息显示同步问题,我们看到的,打开什么界面的信息显示,
其实都是对该显示信息的对象的数值的及时更改达成效果的,实际上,这个显示信息数据的对象,更应该看做是一个数据显示器,激活和失活都只是一个显示器的启动和关闭,每次如果是要加载新的对象则是一个新的显示器,已有显示器的激活和失活,则是保留了上一次数据赋值的显示器而已,
这个显示器同样存在自己的信息,比如transform和各种挂在自己身上的组件,因为和外部信息有时候的确是有灰色地带,所以确实,因为面向对象过头,反而让信息有些混乱
NGUI
层级的 depth
NGUI 中,层级的 depth
值决定了 UI 元素的渲染顺序,depth
值越大,元素就会越上面,越小的 depth
值则表示该元素位于更底层。
一个slider有三个sprite对象,挂谁身上
slider详解
最标准的slider创建为,一个空widget,(不一定要父子关系)
带上thumb,foreground,background三个sprite
fore是slider中变化的sprite,所以他attach了collider也没用的(foreground作为slider组件挂载对象时除外)
collider是作为fore变化的触发区域(更详细的说是,启动点击拖动的触发区域)必须要的,不然不能拖动
这个组件关键在于附上了的三个物体,仅得到这三个物体的单个组件信息,共同达成slider的功能
组件功能总结:将该组件下的,background的sprite范围,thumb的sprite范围 作为拖动触发区域,调整foreground的sprite
slider组件与挂载在哪个对象无关,仅需在组件内的三个对象信息,即可得到slider的完全效果
注:若slider脚本挂载对象为foreground,foreground自己的已有条也是可以点的(反而繁琐,不推荐)
概括:
最好,任一对象挂slider,三个sprite往上拖,collider加在back或者thumb作为拖动触发区
StreamingAssets
在 Unity 中,StreamingAssets
文件夹用于存储游戏在运行时需要直接访问的文件。这些文件可以是文本文件、图像、音频、视频或其他资源,Unity 不会对它们进行压缩或加密,因此可以在运行时直接读取。
主要特点
-
直接访问:
StreamingAssets
中的文件可以通过Application.streamingAssetsPath
轻松访问。这意味着你可以在游戏运行时直接读取这些文件,而不需要使用 Unity 的资源管理器。 -
平台独立:Unity 会根据不同的平台(如 Windows、macOS、Android、iOS 等)处理
StreamingAssets
中的文件。文件路径在不同平台上可能有所不同,但 Unity 会提供正确的路径。 -
未压缩:与资源文件不同,
StreamingAssets
中的文件不会被 Unity 的打包系统压缩或更改格式,因此你可以保存原始文件,适合需要读取外部数据的场景。
常见用途
- 配置文件:存储游戏的配置数据,如设置、关卡信息等。
- 外部数据:加载外部数据文件,如 JSON、XML 或文本文件。
- 音频和视频:存储大文件,如音频和视频,以便在游戏中直接播放。
忽略触发器
通过使用
QueryTriggerInteraction
,你可以在进行物理查询时选择不考虑变成触发器的 Collider。这允许你在射线检测或重叠检测时,灵活地决定是否要将触发器包含在内。RaycastHit hit; if (Physics.Raycast(ray, out hit, maxDistance, layerMask, QueryTriggerInteraction.Ignore)) {// 处理与非触发器碰撞的逻辑 }
具体用法
QueryTriggerInteraction
有三个选项:
UseGlobal:使用全局设置,通常取决于项目的物理设置(可以在unity设置里找到),默认情况下会考虑触发器。
Ignore:在进行物理查询时忽略所有触发器。这意味着只有非触发器的 Collider 会被考虑。
Collide:在进行物理查询时将触发器视为有效的碰撞体,这样触发器也会被包含在查询结果中
Collider 组件有一个选项可以勾选“Is Trigger”。当你勾选这个选项时,这个 Collider 将变成触发器。
触发器功能:触发器不会产生物理碰撞效果,物体可以穿过它。
意味着,当物体进入或离开触发器区域时,会触发相应的事件,比如 OnTriggerEnter
或 OnTriggerExit
。你可以在这些事件中编写代码,以处理进入或离开触发器时要执行的操作。
比如,你想制作一个区域,当玩家进入这个区域时触发某个事件(如打开门、播放动画等),这时就可以使用触发器。
忽略碰撞(Physics.IgnoreCollision)
定义:有时候你可能不希望某两个物体之间产生任何碰撞反应,不论它们是否为触发器。可以通过编程来实现。
用法:
- 你可以在代码中使用
Physics.IgnoreCollision(colliderA, colliderB)
来忽略两个 Collider 之间的碰撞。这样,colliderA
和colliderB
在物理计算中将不会相互影响。 -
void Start() {Collider colliderA = GameObject.Find("ObjectA").GetComponent<Collider>();Collider colliderB = GameObject.Find("ObjectB").GetComponent<Collider>();Physics.IgnoreCollision(colliderA, colliderB); }
默认不勾选,带了collider的就是真物理碰撞器,要是勾了is trigger, 就会变成空间感应器
Input.GetAxis
在 Unity 中,用于获取轴向输入的值,通常用于处理用户的输入,例如键盘、鼠标或游戏手柄的输入。这个函数返回一个 float
值,表示某个轴的输入值,范围通常在 -1
到 1
之间。
具体来说,它经常用于移动或旋转角色、物体等场景。比如:
"Horizontal"
轴对应键盘上的左右箭头键(或 A、D 键),返回值会在-1
(左)和1
(右)之间变化。"Vertical"
轴对应上下箭头键(或 W、S 键),返回值在-1
(下)和1
(上)之间变化。
了解所有的git之类的奇奇怪怪的东西
签出分支 (Checkout Branch) 是 Git 中一个常用的操作,主要用于以下几个目的:
-
切换分支:
- 当你执行签出操作时,Git 会将你的工作目录切换到指定的分支。这样,你就可以开始在该分支上进行开发或查看该分支的内容。
-
创建新分支:
- 使用
git checkout -b <new-branch-name>
命令时,可以创建一个新分支并立即切换到该分支。这允许你在新分支上开始新的开发工作,而不影响其他分支。
- 使用
-
恢复文件状态:
- 如果你想查看某个分支在某个特定提交时的状态,可以使用签出操作恢复到那个状态。这可以用来检查历史版本或调试。
推送分支是?从a推送到b什么意思,是把a里的修改合并到b里吗
没戳,你理解得很对。
推送分支:这是指你在本地所做更改的分支,比如你在开发一个新功能的分支
a
。从 a 推送到 b:这意味着你要将本地分支
a
的更改推送到远程的分支b
。如果b
是远程仓库中的一个分支,那么推送操作会将a
中的修改合并到b
中。关键点:
- 推送实际上是将本地的提交(更改记录)发送到远程仓库。
- 为
a
如果目标分支b
目前在远程仓库中存在,推送后b
会更新的状态。- 如果目标分支
b
在远程仓库中不存在,通常会创建一个新的分支。所以,推送是一种把你在本地开发的内容上传到远程的方式,而不只是简单的合并。
在 Git 中,“提交”和“提交并推送”有以下区别:
-
提交 (Commit):
- 本地操作:提交是把你当前的修改记录保存到本地的 Git 仓库中。提交之后,这些更改只会保存在你自己的计算机上,其他人无法看到这些修改。
- 提交的作用是创建一个“快照”,记录你当前的代码状态。
-
提交并推送 (Commit and Push):
- 本地+远程操作:提交并推送首先会在本地保存你的修改(和普通提交一样),然后把这些修改推送到远程仓库(比如 GitHub、GitLab 等)。
- 推送之后,其他人就能在远程仓库中看到你的更改,下载或合并你的代码。
总结:
- 如果只是提交 (Commit),修改只会保存到你本地,其他人看不到。
- 如果提交并推送 (Commit and Push),修改不仅会保存到本地,还会同步到远程仓库,其他人才能看到并获取你的修改。
所以,如果你想把修改上传给别人,需要选择“提交
git是什么软
-
CI/CD 是一种自动化流程,帮助你管理代码的更新和发布。
-
持续集成 (CI):每当你或其他人修改代码并提交时,系统会自动运行测试,确保这些修改没有引入错误。
-
持续交付 (CD):当代码通过测试后,系统会自动将代码部署到服务器上,使得新版本随时可以上线。
设置 CI/CD 意味着你为项目配置了这些自动化流程,可以减少手动操作,提高开发效率和软件质量。
SSH 密钥可以看作是一种密码,但它更安全,因为它由一对密钥(公钥和私钥)组成。使用 SSH 密钥的主要原因是:
-
安全性:SSH 密钥比传统密码更安全,避免了密码泄露的风险。
-
身份验证:当你尝试推送或拉取代码时,系统会使用你的密钥来验证你的身份。
如果你不设置 SSH 密钥,就无法通过 SSH 进行推送和拉取,因为系统无法确认你是否有权限访问该存储库。你可以选择使用 HTTPS 连接,这样就不需要 SSH 密钥,但每次操作时需要输入用户名和密码。
-
代码托管:允许开发者在云端存储和管理代码仓库。
-
协作工具:提供合并请求、问题追踪、代码审查等工具,支持团队协作。
-
CI/CD 集成:都支持持续集成和持续交付(CI/CD),自动化构建和测试流程。
-
项目管理:提供项目管理功能,如任务板和里程碑,以便团队更好地组织工作。
区别
- 平台和用户群:Gitee 更加关注中国用户,提供中文界面和本地化服务;而 GitLab 是国际化的,支持多种语言。
- 自托管选项:GitLab 提供自托管版本,允许用户在自己的服务器上运行 GitLab,而 Gitee 主要是一个云平台。
总的来说,GitLab 和 Gitee 的主要功能相似,但它们的定位和用户群体有所不同。
Git 和 Gitee 之间的关系如下:
-
Git:Git 是一个分布式版本控制系统,用于跟踪代码更改和管理项目的历史记录。它是一种工具,可以在本地和远程仓库中使用。
-
Gitee:Gitee 是一个基于 Git 的代码托管平台,类似于 GitHub。它提供了一个在线平台,用于存储、共享和协作开发项目。Gitee 允许开发者使用 Git 命令来管理代码,但它提供了图形界面、问题追踪、代码审查等附加功能。
# 进入项目目录
cd ~/MyUnityProject# 查看当前状态
git status# 拉取最新的更改
git pull origin main# 修改了脚本中的变量,添加了新物体# 查看修改内容
git diff# 添加所有修改的文件
git add .# 提交更改
git commit -m "更新了变量值,添加了新物体"# 推送更改到远程仓库
git push origin main# 创建一个新分支用于新功能开发
git checkout -b new-game-mechanic# 在新分支上进行一些修改# 查看当前状态
git status# 添加更改
git add .# 提交新功能的更改
git commit -m "添加新的游戏机制"# 切换回主分支
git checkout main# 合并新功能分支到主分支
git merge new-game-mechanic# 删除已合并的功能分支
git branch -d new-game-mechanic# 推送更新后的主分支
git push origin main
不用这些gui,git也可以用么
是的,Git 完全可以通过命令行使用。实际上,许多开发者更喜欢使用命令行,因为它提供了更大的灵活性和控制。你可以使用命令来执行所有 Git 操作,如提交、推送、拉取、分支管理等。命令行方式在处理复杂操作或自动化任务时特别有效。只要熟悉相关命令,就可以高效地使用 Git。
GitExtensions 是一个 Git 的图形用户界面(GUI)工具,它使得使用 Git 更加直观和方便。虽然 GitExtensions 本身不是 Git,但它提供了一个界面,帮助用户更轻松地执行 Git 的各种操作,比如提交、推送、拉取和合并等。因此,你可以把它看作是一个增强 Git 使用体验的工具。
离线?意思是不联网我也可以上传吗
不完全是。在 Git 中,"离线操作" 指的是你可以在本地进行修改和提交,而不需要时时联网。具体来说:
-
本地更改和提交:你可以在没有网络连接的情况下修改代码并使用
git commit
将更改记录到本地仓库。 -
上传:一旦你有了网络连接,就可以使用
git push
将本地的提交上传到远程仓库。这个过程需要联网。 -
同步:同样地,若想从远程获取其他人的更改(使用
git pull
),也需要联网。
Git 的离线操作指的是开发者可以在本地进行更改,而无需时刻连接到远程仓库。具体来说:
-
本地更改:你可以在自己的计算机上修改代码、提交更改,甚至创建分支,而不需要立即上传到远程仓库。
-
同步:当你完成本地的工作后,可以通过
git push
将你的更改上传到远程仓库,或使用git pull
从远程获取最新的更改。 -
冲突解决:如果其他人已经更新了远程仓库,而你在本地进行了更改,推送时可能会遇到冲突。这时,Git 会提示你先拉取(
pull
)远程的更改,解决冲突后再进行推送。
常来说,多个人一起写一个项目,不会在同一时间一起写是吗,因为如果有人已经改了,那就会比较麻烦,或者说两个人协商好写完全不耦合的东西,然后互相没拉取对方的情况下都提交,这时虽然提示冲突,但实际上,只要安排好两个人有正常的提交顺序就行,只不过依然提示为冲突
是的,你的理解是正确的。如果三个人同时对同一个项目进行修改,情况可能会这样:
- 版本1:项目的初始状态。
- 开发者A 上传了更改,使版本变为 版本2。
- 开发者B 和 开发者C 仍然在使用 版本1,并进行各自的修改,假设他们的修改将版本变为 版本3。
如果 开发者B 和 开发者C 试图上传他们的更改(基于 版本1)而不先拉取 版本2,就会出现冲突。Git 会提示有冲突,要求他们手动解决这些问题,决定如何合并他们的更改。因此,在多人协作时,及时拉取最新的更改非常重要,以避免冲突。
当多个人同时更改同一部分代码时,Git 提供工具来帮助解决这些冲突
协作:多个开发者可以同时在同一个项目上工作,通过推送(push)和拉取(pull)操作共享更改。
正是这样!分支允许你在不影响原项目的情况下进行实验和开发。如果分支上的功能经过测试并且可用,你可以将其合并到主分支中;如果功能不再需要,可以直接删除分支,原项目不会受到影响。这种灵活性使得团队开发更高效,减少了错误和冲突的风险。
Git 是一个分布式版本控制系统,它可以帮助多个开发者共同协作管理和修改同一个项目的代码。以下是一些 Git 的主要功能和特点:
-
版本控制:Git 记录每次代码更改的历史,可以轻松查看和恢复到之前的版本。
-
分支管理:开发者可以在不同的分支上独立工作,不会影响主代码库,分支可以随时合并。
-
项目代码的一个独立版本。在分支上,你可以进行实验性开发、修复 bug 或添加新功能,而不会影响主分支(通常是
main
或master
)的稳定性。 -
协作:多个开发者可以同时在同一个项目上工作,通过推送(push)和拉取(pull)操作共享更改。
-
离线操作:由于 Git 是分布式的,开发者可以在本地进行更改,之后再与远程仓库同步。
-
解决冲突:当多个人同时更改同一部分代码时,Git 提供工具来帮助解决这些冲突。
总之,Git 是一个强大的工具,特别适合团队协作和管理复杂的项目。如果你有兴趣,可以进一步了解它的命令和工作流程!
GameObject.Instantiate(GameObject.CreatePrimitive(PrimitiveType.Sphere),fa);
会在里面先生成一个初始,然后把这个初始又当预设体生成了一次,所以会生成双倍数
Vector3 a = new Vector3(Random.Range(-100, 100), Random.Range(-100, 100), Random.Range(-100, 100));
GameObject.Instantiate(GameObject.CreatePrimitive(PrimitiveType.Sphere), fa); // 只设置父物体 newObject.transform.localPosition = a; // 设置相对父物体的位移
直接调用该一般函数,一般函数里存对invoke的调用
延迟执行,如果不要repeat就在函数里面嵌套
延迟函数只声明一次,之后会记住自己执行
在运行时,会根据对象的实际类型调用其对应的方法,而不是根据变量的类型。Java 的多态主要体现在方法重写上,而不是变量。
一般情况下的 int
:
- 位数:32 位
- 范围:
- 有符号
int
:-2^31
到2^31 - 1
,即约-2.1 × 10^9
到2.1 × 10^9
- 有符号
longlong是2的64次方,9.2*10^18
v.push_back()
:
- 这个方法会将计算得到的结果追加到
vector v
的末尾。
在 C++ 中,数组的大小必须是一个常量表达式(在编译时已知的常量)
数组大小必须是编译时已知的常量:在 C++ 中,数组的大小必须是编译时常量,这意味着你不能使用运行时的变量来定义数组的大小。例如,const int maxn=1e3;
确保 maxn
是一个编译时常量,从而数组 c[maxn][maxn]
的大小在编译时就确定了。
const int maxn = 1000; // 编译时常量
int arr[maxn]; // 正确,数组大小是编译时已知的
const
表示不可修改的常量:const
修饰的变量在定义后不能修改。例如,const int maxn = 1e3;
表示 maxn
的值为 1000
,且在程序运行过程中它不能被更改。如果你尝试修改它,编译器会报错。
const int maxn = 1000;
maxn = 2000; // 错误!编译器会报错,因为 maxn 是 const
#include <bits/stdc++.h>
#include <bits/stdc++.h>
是一个非标准的头文件,通常只在某些编译器(如 GCC)的环境下提供,用于快速包含几乎所有的标准库头文件。它包含了几乎所有常见的 C++ 标准库,类似于 "一站式" 的解决方案
相关文章:
cpp,git,unity学习
c#中的? 1. 空值类型(Nullable Types) ? 可以用于值类型(例如 int、bool 等),使它们可以接受 null。通常,值类型不能为 null,但是通过 ? 可以表示它们是可空的。 int? number null; // …...
HTML增加文本复制模块(使用户快速复制内容到剪贴板)
增加复制模块主要是为了方便用户快速复制内容到剪贴板,通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤: HTML结构: 在文本旁边添加一个复制按钮,例如 <butto…...
Spring Cloud面试题收集
Spring Cloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。…...
观测云对接 SkyWalking 最佳实践
简介 SkyWalking 是一个开源的 APM(应用性能监控)和可观测性分析平台,专为微服务、云原生架构和基于容器的架构设计。它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化的解决方案。如果您的应用中正在使用SkyWalking …...
AI少女/HS2甜心选择2 仿天刀人物卡全合集打包
内含AI少女/甜心选择2 仿天刀角色卡全合集打包共21张 下载地址:https://www.51888w.com/408.html 部分演示图:...
MISC - 第11天(练习)
前言 各位师傅大家好,我是qmx_07,今天继续讲解MISC的相关知识 john-in-the-middle 导出http数据文件里面logo.png 是旗帜图案,放到stegsolve查看 通过转换颜色,发现flag信息 flag{J0hn_th3_Sn1ff3r} [UTCTF2020]docx 附件信息…...
[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算
PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56...
centos常用知识和命令
linux目录及结构 /etc #存配置文件 /var #存日志文件 /home #用户家目录 /root #root用户家目录 /bin #命令文件目录 /sbin #超级管理员命令目录 /dev #设备文件目录 /boot #系统启动核心目录 /lib #库文件目录 /mnt #挂载目录 /tmp #临时文件目录 /usr #用户程序存…...
基于yolov8调用本地摄像头并将读取的信息传入jsonl中
最近在做水面垃圾识别的智能船 用到了yolov8进行目标检测 修改并添加了SEAttention注意力机制 详情见其他大神 【保姆级教程|YOLOv8添加注意力机制】【1】添加SEAttention注意力机制步骤详解、训练及推理使用_yolov8添加se-CSDN博客 并且修改传统的iou方法改为添加了wise-io…...
Linux中的进程间通信之管道
管道 管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 匿名管道 #include <unistd.h> 功能:创建一无名管道 原型 int pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 …...
【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题
Vue Router mode,为 history 无效,建议使用默认值 hash;...
【PyTorch】生成对抗网络
生成对抗网络是什么 概念 Generative Adversarial Nets,简称GAN GAN:生成对抗网络 —— 一种可以生成特定分布数据的模型 《Generative Adversarial Nets》 Ian J Goodfellow-2014 GAN网络结构 Recent Progress on Generative Adversarial Networks …...
Vue3轻松实现前端打印功能
文章目录 1.前言2.安装配置2.1 下载安装2.2 main.js 全局配置3.综合案例3.1 设置打印区域3.2 绑定打印事件3.3 完整代码4.避坑4.1 打印表格无边框4.2 单选框复选框打印不选中4.3 去除页脚页眉4.4 打印內容不自动换行1.前言 vue3 前端打印功能主要通过插件来实现。 市面上常用的…...
SHA-1 是一种不可逆的、固定长度的哈希函数,在 Git 等场景用于生成唯一的标识符来管理对象和数据完整性
SHA-1 (Secure Hash Algorithm 1) 是一种加密哈希函数,它能将任意大小的数据(如文件、消息)转换为一个固定长度的 160 位(20 字节)哈希值。这种哈希值通常以 40 个十六进制字符的形式表示,是数据的“指纹”…...
Activiti7 工作流引擎学习
目录 一. 什么是 Activiti 工作流引擎 二. Activiti 流程创建步骤 三. Activiti 数据库表含义 四. BPMN 建模语言 五. Activiti 使用步骤 六. 流程定义与流程实例 一. 什么是 Activiti 工作流引擎 Activiti 是一个开源的工作流引擎,用于业务流程管理…...
pytorch使用LSTM模型进行股票预测
文章目录 tushare获取股票数据数据预处理构建模型训练模型测试模型tushare获取股票数据 提取上证指数代码为603912的股票:佳力图,时间跨度为2014-01-01到今天十年的数据。 import tushare as ts pro = ts.pro_api()#准备训练集数据df = ts.pro_bar(ts_code=603912.SH, star…...
掌握 C# 异常处理机制
在任何编程语言中,处理错误和异常都是不可避免的。C# 提供了强大的异常处理机制,可以帮助开发者优雅地捕获和处理程序中的异常,确保程序的健壮性和可靠性。本文将带你了解 C# 中的异常类、try-catch 语句、自定义异常以及 finally 块的使用。…...
【Redis】Redis Cluster 简单介绍
Redis Cluster 是 Redis 3.0 提供的一种分布式解决方案, 允许数据在多个节点之间分散存储, 从而实现高可用性和可扩展性。 特点: 分片: Redis Cluster 将数据分散到多个节点, 通过哈希槽 (hash slots) 机制将键映射到不同的节点上。总共有 16384 个哈希槽, 每个节点负责一部分…...
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…...
golang grpc进阶
protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…...
Java JUC(三) AQS与同步工具详解
Java JUC(三) AQS与同步工具详解 一. ReentrantLock 概述 ReentrantLock 是 java.util.concurrent.locks 包下的一个同步工具类,它实现了 Lock 接口,提供了一种相比synchronized关键字更灵活的锁机制。ReentrantLock 是一种独占…...
使用rust写一个Web服务器——async-std版本
文章目录 实现异步代码并发地处理连接使用多线程提升性能 使用rust实现一个异步运行时是async-std的单线程Web服务器。 仓库地址: 1037827920/web-server: 使用rust编写的简单web服务器 (github.com) 在之前的单线程版本的Web服务器代码上进行修改,具体…...
C语言复习概要(一)
本文 C语言入门详解:从基础概念到分支与循环1. C语言常见概念1.1 程序的基本结构1.2 变量作用域和存储类1.3 输入输出1.4 编译与运行 2. C语言中的数据类型和变量2.1 基本数据类型2.2 变量的声明与初始化2.3 常量与枚举 3. C语言的分支结构3.1 if语句3.2 if-else语句…...
二、kafka生产与消费全流程
一、使用java代码生产、消费消息 1、生产者 package com.allwe.client.simple;import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.pr…...
本地搭建OnlyOffice在线文档编辑器结合内网穿透实现远程协作
文章目录 前言1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 前言 本篇文章讲解如何使用Docker在本地Linux服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问本地部署的文档编辑器与远程协作。 Community Editi…...
ScrapeGraphAI 大模型增强的网络爬虫
在数据驱动的动态领域,从在线资源中提取有价值的见解至关重要。从市场分析到学术研究,对特定数据的需求推动了对强大的网络抓取工具的需求。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线…...
PDF转换为TIF,JPG的一个简易工具(含下载链接)
目录 0.前言: 1.工具目录 2.工具功能(效果),如何运行 效果 PDF转换为JPG(带颜色) PDF转换为TIF(LZW形式压缩,可以显示子的深浅) PDF转换为TIF(CCITT形…...
Wireshark 解析QQ、微信的通信协议|TCP|UDP
写在前面 QQ,微信这样的聊天软件。我们一般称为im,Instant Messaging,即时通讯系统。那大家会不会有疑问,自己聊天内容会不会被黑客或者不法分子知道?这种体量的im是基于tcp还是udp呢?这篇文章我们就来探索…...
网络编程(5)——模拟伪闭包实现连接的安全回收
六、day6 今天学习如何利用C11模拟伪闭包实现连接的安全回收,之前的异步服务器为echo模式,但存在安全隐患,在极端情况下客户端关闭可能会导致触发写和读回调函数,二者都进入错误处理逻辑,进而造成二次析构。今天学习如…...
C#绘制动态曲线
前言 用于实时显示数据动态曲线,比如:SOC。 //用于绘制动态曲线,可置于定时函数中,定时更新数据曲线 void DrawSocGraph() {double f (double)MainForm.readData[12]; //display datachart1.Series[0].Points.Add(f);if (ch…...
找人做网站怎么知道归属人/站长统计在线观看
近些天,在开发的时候,需要接入微信授权登陆,并且需求是登陆后需要将微信的昵称,此时如果微信昵称中有emoji表情,可能会导致数据库存储失败...因为mysql的utf8字符集不能存储emoji表情...主要解决办法有一下几种方式 存取微信昵称时候进行加解密操作# 存 base64_encode($wechatN…...
网站建设 拖欠尾款/外链工具
酷夏过后,迎来了凉爽的金秋。2010年10月9日,伴着徐徐秋风,延展咨询组织公司员工来到了美丽的杭州,开始了为期2天的休闲假期。 西湖湖畔微风习习,西溪湿地丛林鸟语,美丽的杭州从古至今都是享誉盛名的旅游佳地…...
网站建设后的效果评估/个人怎么做互联网推广平台
参考视频教程: **Android热修复与插件化实践之路 ** Android热修复 正常项目开发流程: 版本1.0上线-》 用户安装-》 发现bug-》 紧急修复-》 重新发布版本1.1上线 热修复开发流程: 版本1.0上线–》用户安装-》发现bug -》紧急修复 -》打出补丁-》…...
怎么建设自己网站(儿童)步骤/网络推广软件有哪些
利用angularjs开发项目中,控制器之间的通信,比如参数的传递,数据的传递,都是比较常见的。控制器之间的通信,显得尤为重要。常见的方式有如下两种:一、angular服务的方式;二、基于事件广播的方式…...
金华网站建设/seo案例
图 图论被广泛应用在计算机科学、运筹学、信息论、控制论、网络理论、博弈论、化学、生物学、物理学、社会科学、语言学等领域; 图论的应用方向1:以理论计算机科学和信息科学为研究背景,探索图论在计算机科学和信息科学上应用研究。当前主要…...
wordpress 文章 碎片/公司网站建设推广
301重定向是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。301重定向主要是将需要转移的网址重定向另一个新的网址上,并且是永久性转移。当网站的…...