【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(下)

2023-11-08

击球方阵

乒乓克隆

  • 使用立方体建造竞技场、球拍和球。
  • 移动球和球拍。
  • 击球并得分。
  • 让相机感受到冲击力。
  • 给游戏一个抽象的霓虹灯外观。

这是有关基础游戏的系列教程中的第一个教程。在其中,我们将创建一个简单的 Pong 克隆。

本教程是使用 Unity 2021.3.16f1 制作的。

沿上文内容

收缩桨

作为我们游戏的最后一个行为,让我们在每次得分时缩小。这根据玩家离获胜的接近程度创建让分盘。将其当前范围转换为私有字段,并使其最小值和最大值可配置,默认情况下均设置为 4。引入了一种替换当前范围的方法,该方法还可以调整游戏对象的局部比例以匹配。**Paddle**``SetExtents

[SerializeField, Min(0f)]
float

minExtents = 4f,
maxExtents = 4f,
speed = 10f,
maxTargetingBias = 0.75f;

…

float extents, targetingBias;

…

void SetExtents (float newExtents)
{
extents = newExtents;
Vector3 s = transform.localScale;
s.x = 2f * newExtents;
transform.localScale = s;
}

根据距离赢得划桨的接近程度,在 的末尾设置范围。这是通过根据新分数除以获胜所需的分数减去 1 从最大范围到最小范围插值来完成的。为此添加所需的参数,默认情况下,该参数可以是大于 1 的任何值,当它设置为零时。SetScore

public bool ScorePoint (int pointsToWin)
{
SetScore(score + 1, pointsToWin);
return score >= pointsToWin;
}

…

void SetScore (int newScore, float pointsToWin = 1000f)
{
score = newScore;
scoreText.SetText("{0}", newScore);
SetExtents(Mathf.Lerp(maxExtents, minExtents, newScore / (pointsToWin - 1f)));
}

我们还应该在球拍唤醒时重置分数,以便在游戏的准备阶段其初始大小是正确的。

void Awake ()
{
SetScore(0);
}

让我们对底部球拍至少使用 1,对顶部球拍至少使用 3.5,以使 AI 更容易击球。

活跃的相机

随着游戏玩法的完成,让我们看看我们是否可以使游戏的呈现更加有趣。当球击中某物时,给人一种沉重的冲击感的简单方法是摇晃相机。它模拟了球员如何感觉球击中竞技场的两侧。为了进一步增加沉浸感,我们从自上而下切换到透视视图。将相机的位置设置为 (0, 20, -19),将其 X 旋转设置为 50。

从玩家的角度显示竞技场

推挤和推搡

要控制相机的行为,请创建组件类型。该相机可以在给定的脉冲下在 XZ 平面上推来推去,或者在 Y 维度上被推挤。这是通过给相机一个 3D 速度来实现的,该速度在 中应用,因此在所有推挤和推动帧完成后。**LivelyCamera**``LateUpdate

推挤是通过公共方法完成的,该方法通过可配置的强度增加 Y 速度,默认情况下设置为 40。推动是通过公共方法完成的,该方法带有 2D 脉冲参数,该参数被添加到速度中,由可配置的推动强度因子缩放,默认情况下设置为 1。JostleY``PushXZ

using UnityEngine;

public class LivelyCamera : MonoBehaviour
{
[SerializeField, Min(0f)]
float
jostleStrength = 40f,
pushtrength = 1f;

Vector3 velocity;

public void JostleY () => velocity.y += jostleStrength;

public void PushXZ (Vector2 impulse)
{
velocity.x += pushStrength * impulse.x;
velocity.z += pushStrength * impulse.y;
}

void LateUpdate ()
{
transform.localPosition += velocity * Time.deltaTime;
}
}

将此组件添加到主摄像机,然后提供一个配置字段并将其连接到摄像机。**Game**

[SerializeField]
LivelyCamera livelyCamera;

当在 中检测到反弹时,在执行反弹之前,使用球的速度作为脉冲进行调用。BounceXIfNeeded``PushXZ

void BounceXIfNeeded (float x)
{
float xExtents = arenaExtents.x - ball.Extents;
if (x < -xExtents)
{
livelyCamera.PushXZ(ball.Velocity);
ball.BounceX(-xExtents);
}
else if (x > xExtents)
{
livelyCamera.PushXZ(ball.Velocity);
ball.BounceX(xExtents);
}
}

在执行 Y 退回之前,在 中执行相同的操作。此外,在得分时推挤相机。BounceY

void BounceY (float boundary, Paddle defender, Paddle attacker)
{
float durationAfterBounce = (ball.Position.y - boundary) / ball.Velocity.y;
float bounceX = ball.Position.x - ball.Velocity.x * durationAfterBounce;

BounceXIfNeeded(bounceX);
bounceX = ball.Position.x - ball.Velocity.x * durationAfterBounce;
livelyCamera.PushXZ(ball.Velocity);
ball.BounceY(boundary);

if (defender.HitBall(bounceX, ball.Extents, out float hitFactor))
{
ball.SetXPositionAndSpeed(bounceX, hitFactor, durationAfterBounce);
}
else
{
livelyCamera.JostleY();
if (attacker.ScorePoint(pointsToWin))
{
EndGame();
}
}
}

弹簧和阻尼

摄像机现在被推来推去,但它的速度仍然存在,所以竞技场很快就会消失在视野之外。为了回弹,我们使用简单的弹簧机制将其固定到初始位置。为其提供默认设置为 100 的可配置弹簧强度,默认将其阻尼强度设置为 10。还要给它一个锚点位置,并在它唤醒时将其设置为相机的位置。**LivelyCamera**

[SerializeField, Min(0f)]
float
springStrength = 100f,
dampingStrength = 10f,
jostleStrength = 40f,
pushStrength = 1f;

Vector3 anchorPosition, velocity;

void Awake () => anchorPosition = transform.localPosition;

我们通过使用由弹簧强度缩放的相机的当前位移作为加速度来实现弹簧。我们还通过等于阻尼强度成比例的当前速度的负加速度来减慢运动速度。

void LateUpdate ()
{
Vector3 displacement = anchorPosition - transform.localPosition;
Vector3 acceleration = springStrength * displacement - dampingStrength * velocity;
velocity += acceleration * Time.deltaTime;
transform.localPosition += velocity * Time.deltaTime;
}

生动的相机,具有高帧率。

增量时间最大值

我们简单的弹簧规则只有在帧速率足够高的情况下才能表现良好。它抗拒推搡,将相机拉回其锚点,但可能会导致一些超调,并且在静止之前可能会摆动一下。但是,如果帧速率太低,过冲最终可能会夸大其动量,并且可能会失控,加速而不是减慢。这个问题可以通过强制非常低的帧速率来证明,通过添加方法。稍后必须将其设置回零才能删除限制,因为此设置是永久性的。Application.targetFrameRate = 5;``Awake

当帧速率足够高时,不会出现此问题。因此,我们可以通过强制执行较小的时间增量来避免它。我们可以通过移动相机来做到这一点。但是,由于这强制执行精确的时间增量,这将导致微卡顿,因为相机可能无法在每帧更新相同的次数时更新,这非常明显,因为它会影响整个视图的运动。此外,它还限制了相机运动的有效帧速率。FixedUpdate

一个简单的解决方案是强制实施最大时间增量,但不是最小时间增量。为此添加一个可配置的最大值,默认情况下设置为 六十分之一秒。然后将代码从移动到具有时间增量作为参数的新方法。使用最大增量调用的次数与当前帧的增量相适应的次数一样多,然后再次调用剩余的增量。**LivelyCamera**``LateUpdate``TimeStep``LateUpdate``TimeStep

[SerializeField, Min(0f)]
float
springStrength = 100f,
dampingStrength = 10f,
jostleStrength = 40f,
pushStrength = 1f,
maxDeltaTime = 1f / 60f;

…

void LateUpdate ()
{
float dt = Time.deltaTime;
while (dt > maxDeltaTime)
{
TimeStep(maxDeltaTime);
dt -= maxDeltaTime;
}
TimeStep(dt);
}

void TimeStep (float dt)
{
Vector3 displacement = anchorPosition - transform.localPosition;
Vector3 acceleration = springStrength * displacement - dampingStrength * velocity;
velocity += acceleration * dt;
transform.localPosition += velocity * dt;
}

视觉

最后一步是稍微改善我们游戏的视觉效果。我们将选择一个简单的发光霓虹灯外观。

首先让一切都变暗,简单地关闭定向灯。同时将相机设置为纯色背景。然后启用摄像机的选项并将其设置为 FXAA。

保持环境照明完好无损,即使黑色背景没有意义,因此仍然有一些照明使竞技场可见。

为什么使用 FXAA 而不是 MSAA?
我们将使用高强度HDR颜色。URP的FXAA可以处理这些问题,但其MSAA不能。

发光球

球将是我们唯一的光源。为其提供子点光源,将其颜色设置为黄色,强度设置为 20,范围设置为 100。

以球为光源的黑暗视觉效果

球应该发光。使用 HDR 颜色属性为其创建无光照着色器图。使用它来创建具有高强度黄色的材质,并将其分配给球预制件。

为了使它看起来发光,我们需要应用一个泛光后期效果。通过以下方式创建全局卷。选择它并为其创建新的卷配置文件。为 添加覆盖,设置为 1 并启用。此外,将 set 的替代添加到 ACES。

调整 URP 资源,使其设置为 HDR。我们也可以设置为 .这样可以防止 Unity 不必要地每帧更新体积数据,因为我们从不更改它。

发光球

反弹粒子

球现在看起来像一个高能立方体。为了加强这个想法,让我们在它反弹时出现火花。创建一个使用顶点颜色乘以强度属性的无光照着色器图。将其表面类型设置为透明,将其混合模式设置为加法,以便始终变亮。为其创建强度设置为 10 的粒子材质。

 粒子的着色器图

                                   粒子的着色器图(上图)

在原点创建粒子系统游戏对象。禁用和 .设置为常量范围 0.5–1、 2–4 和 0.5。将其更改为 和 。

将模块的两个速率设置为零。

默认情况下,该模块设置为圆锥体,我们保留该圆锥体,但将其设置为 45,设置为 0.5。

启用模块,颜色渐变从黄色变为红色,其 alpha 在两端设置为零,在 255% 时设置为 10%。

启用模块,线性曲线从 1 下降到零。

仅使用立方体的约束也适用于粒子,因此将模块的 设置为 ,默认情况下使用立方体。让它使用我们的颗粒材料。

这个粒子系统不是球本身的一部分,但需要一个可配置的参考才能生成粒子,以及一个配置选项来控制每次弹跳生成多少粒子,默认情况下设置为 20。**Ball**

[SerializeField]
ParticleSystem bounceParticleSystem;

[SerializeField]
int bounceParticleEmission = 20;

通过调用反弹粒子系统,创建一种处理发射反弹粒子的方法。发射锥必须正确定位和旋转,因此请为方法提供 X 和 Z 位置以及 Y 旋转作为参数。使用这些来调整系统的形状模块。Emit

void EmitBounceParticles (float x, float z, float rotation)
{
ParticleSystem.ShapeModule shape = bounceParticleSystem.shape;
shape.position = new Vector3(x, 0f, z);
shape.rotation = new Vector3(0f, rotation, 0f);
bounceParticleSystem.Emit(bounceParticleEmission);
}

在适当的参数中调用该方法。边界是相应维度中的位置。第二个位置可以通过将球的位置倒回反弹的时刻来找到。旋转取决于反弹尺寸以及边界是负还是正。BounceX``BounceY

public void BounceX (float boundary)
{
float durationAfterBounce = (position.x - boundary) / velocity.x;
position.x = 2f * boundary - position.x;
velocity.x = -velocity.x;
EmitBounceParticles(
boundary,
position.y - velocity.y * durationAfterBounce,
boundary < 0f ? 90f : 270f
);
}

public void BounceY (float boundary)
{
float durationAfterBounce = (position.y - boundary) / velocity.y;
position.y = 2f * boundary - position.y;
velocity.y = -velocity.y;
EmitBounceParticles(
position.x - velocity.x * durationAfterBounce,
boundary,
boundary < 0f ? 0f : 180f
);
}

请添加图片描述

                                      反弹粒子

启动粒子

让我们在比赛开始时出现球时让火花飞溅。将现有粒子系统转换为预制件,并使用位于新起始粒子系统的原点的第二个实例。将其增加到 0.5–1.5,使其持续时间更长,并将其设置为球体。

为其添加一个配置字段,以及一个用于开始时生成的粒子数量的字段,默认情况下设置为 100。在开始新游戏时发射这些粒子。**Ball**

[SerializeField]
ParticleSystem bounceParticleSystem, startParticleSystem;

[SerializeField]
int
bounceParticleEmission = 20,
startParticleEmission = 100;

…

public void StartNewGame ()
{
…
startParticleSystem.Emit(startParticleEmission);
}

起始粒子。

尾迹粒子

第三个也是最后一个粒子效果将是球留下的痕迹。创建粒子系统预制件的另一个实例,这次使用 和 启用。将其设置为 1–1.25 并设置为零。将其更改为从其音量发出的框。要使其在移动时发射粒子,请设置为 2。

还要为此系统添加一个配置字段,以便在更新其可视化效果时将其位置与球的位置同步。我们不会让步道系统成为球的子项,以便在比赛结束时球被停用后它可以保持可见,否则尾迹会立即消失。**Ball**

[SerializeField]
ParticleSystem bounceParticleSystem, startParticleSystem, trailParticleSystem;

…

public void UpdateVisualization () => trailParticleSystem.transform.localPosition =
transform.localPosition = new Vector3(position.x, 0f, position.y);

请添加图片描述

                                           尾迹粒子

这是有效的,除了在每场比赛结束时和开始时,轨迹效果也会跟随球传送。我们可以通过做两件事来避免这种情况。首先,我们必须在游戏结束时关闭发射,并在新游戏开始时打开它。这是通过设置发射模块的属性来完成的,因此让我们为此添加一个方便的方法。

public void StartNewGame ()
{
…
SetTrailEmission(true);
}

public void EndGame ()
{
…
SetTrailEmission(false);
}

…

void SetTrailEmission (bool enabled)
{
ParticleSystem.EmissionModule emission = trailParticleSystem.emission;
emission.enabled = enabled;
}

其次,粒子系统记住了它的旧位置。为了清除它以避免在新游戏开始时显示传送的轨迹,我们必须调用它。Play

SetTrailEmission(true);
trailParticleSystem.Play();

这意味着我们可以恢复为禁用,因为我们现在明确播放它。

反应表面

球和它的粒子并不是唯一可以发光的东西。让我们让它的表面也可以通过暂时发光来对被击中做出反应。创建一个具有 、HDR 和 a 属性的光照着色器图,默认值为 −1000。

它的发射颜色取决于最后一次命中发生的时间。它将在命中时全力以赴,并在下一秒线性淡出。这可以通过从当前时间中减去上次命中的时间,从 1 中减去该时间,使其饱和并使用它来缩放发射颜色来完成。

反应表面的着色器图

                                   反应表面的着色器图

使用此着色器图创建材质并将其用于划色预制件。使用白色作为基色,使用高强度白色作为发射色。

唤醒时检索材质实例,并在成功时更新其上次命中时间。这将使球拍在设法击球时发光。**Paddle**``HitBall

static readonly int timeOfLastHitId = Shader.PropertyToID("_TimeOfLastHit");

…

Material paddleMaterial;

void Awake ()
{
paddleMaterial = GetComponent<MeshRenderer>().material;
SetScore(0);
}

…

public bool HitBall (float ballX, float ballExtents, out float hitFactor)
{
…

bool success = -1f <= hitFactor && hitFactor <= 1f;
if (success)
{
paddleMaterial.SetFloat(timeOfLastHitId, Time.time);
}
return success;
}

请添加图片描述

                                             反应桨

让我们更进一步,让作为对手进球的竞技场边界在得分时发光。创建另一种反应性曲面材质,其颜色设置为中灰色,并将其用于竞技场边界预制件。然后为其目标提供可配置的参考,以及可配置的 HDR 目标颜色。**Paddle**``MeshRenderer

当球拍唤醒并将材质的发射颜色设置为目标颜色时,检索其目标材质的实例。设置得分时的最后命中时间。

static readonly int
emissionColorId = Shader.PropertyToID("_EmissionColor"),
timeOfLastHitId = Shader.PropertyToID("_TimeOfLastHit");

[SerializeField]
TextMeshPro scoreText;

[SerializeField]
MeshRenderer goalRenderer;

[SerializeField, ColorUsage(true, true)]
Color goalColor = Color.white;

…

Material goalMaterial, paddleMaterial;

void Awake ()
{
goalMaterial = goalRenderer.material;
goalMaterial.SetColor(emissionColorId, goalColor);
paddleMaterial = GetComponent<MeshRenderer>().material;
SetScore(0);
}

…

public bool ScorePoint (int pointsToWin)
{
goalMaterial.SetFloat(timeOfLastHitId, Time.time);
SetScore(score + 1, pointsToWin);
return score >= pointsToWin;
}

将拨片连接到相应的渲染。使用高强度绿色作为底部玩家颜色,使用高强度红色作为顶部 AI 颜色。

反应性目标。

彩色文本

我们通过为文本着色并使其发光来结束。首先将文本预制件的默认字体材质颜色设置为高强度黄色。

发光的文本

                                        发光的文本

我们将使用进球颜色来显示比分,但有一个变化。我们将从零开始的黑色,因此分数最初在黑色背景上是不可见的。一旦分数颜色等于获胜的分数,它们将达到其全部强度。

在这种情况下,通过文本的属性检索材质实例,其表面颜色着色器属性名为 。fontMaterial

static readonly int
emissionColorId = Shader.PropertyToID("_EmissionColor"),
faceColorId = Shader.PropertyToID("_FaceColor"),
timeOfLastHitId = Shader.PropertyToID("_TimeOfLastHit");

…

Material goalMaterial, paddleMaterial, scoreMaterial;

void Awake ()
{
goalMaterial = goalRenderer.material;
goalMaterial.SetColor(emissionColorId, goalColor);
paddleMaterial = GetComponent<MeshRenderer>().material;
scoreMaterial = scoreText.fontMaterial;
SetScore(0);
}

…

void SetScore (int newScore, float pointsToWin = 1000f)
{
score = newScore;
scoreText.SetText("{0}", newScore);
scoreMaterial.SetColor(faceColorId, goalColor * (newScore / pointsToWin));
SetExtents(Mathf.Lerp(maxExtents, minExtents, newScore / (pointsToWin - 1f)));
}
                                       改变颜色的分数

请注意,默认配置使一旦您发现 AI 的弱点就很容易击败它。这便于开发,但应进行调整以提供所需的挑战级别。
(完结)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(下) 的相关文章

  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • 单个IMU实现精确的轨迹重构

    惯性传感器 IMU 被广泛用于导航 运动状态研究 人体运动和步态分析等领域 然而 由于IMU的固有误差和测量误差 尤其是漂移误差 很少有人尝试基于IMU实现精确的轨迹重建 尤其是使用单个IMU 尽管如此 与视觉 红外线和超声波定位技术相比
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 0基础学习VR全景平台篇第129篇:认识单反相机和鱼眼镜头

    上课 全体起立 大家好 欢迎观看蛙色官方系列全景摄影课程 一 相机 单反和微单 这里说的相机是指可更换镜头的单反 微单数码相机 那两者有何差异呢 1 取景结构差异 两者最直观的 区别 在于 微单相机
  • 讲解SurfaceTexture BufferQueue has been abandoned

    目录 讲解SurfaceTexture BufferQueue has been abandoned 背景知识 问题描述 问题原因和解决方法 1 检查相机状态 2 检查SurfaceTexture状态 3 处理图像数据源中断 4 销毁和重建
  • 讲解SurfaceTexture BufferQueue has been abandoned

    目录 讲解SurfaceTexture BufferQueue has been abandoned 背景知识 问题描述 问题原因和解决方法 1 检查相机状态 2 检查SurfaceTexture状态 3 处理图像数据源中断 4 销毁和重建
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • 挂钩(HOOK)

    5 5 挂钩 HOOK 5 5 1 为什么引入挂钩 在Apache1 3版本中 对HTTP 请求的处理包括若干个固定阶段 比如地址转换阶段 身份确认阶段 身份认证阶段 权限确认阶段 MIME类型识别阶段等等 这也意味着Apache1 3 中
  • Qt Creator静态成员变量、全局变量、静态成员函数。

    静态成员变量 是一个全局区域的变量 不同 cpp文件间可以相互访问 记得包含 cpp对应的头文件 1 在mainwindow h中定义 public MainWindow QWidget parent nullptr MainWindow
  • 解决docker nginx无法查看日志的问题

    我们知道 Nginx的日志默认存放在 var log nginx access log var log nginx error log 但在使用nginx镜像构建的容器时 出现无法查看日志的问题 用cat命令后无反应 通过如下命令可以看到
  • android面试题-ActivityRecord TaskRecord和ProcessRecord之间的关系

    转自 http blog csdn net mwq384807683 article details 72529285 源码分析相关面试题 Volley源码分析 注解框架实现原理 okhttp3 0源码分析 onSaveInstanceSt
  • 数据分析之训练数据集处理

    在训练dbnet的时候 需要进行数据分析的一些方法来分割数据集 这里刚好整理一下 coding utf 8 用于解决编码问题 x strip strip 方法删除前导空格和尾随空格 with open as 方法 with open 1 t
  • 外向交货单发货过账BAPI:BAPI_OUT…

    前面说过 可以使用 WS DELIVERY UPDATE 进行外向交货单的发货过账 当然 这个可实现的很多 过账 冲销 删除都可以 但是这个不是bapi 是个函数 则会缺少bapi自带的那些校验 为了更安全 其实建议是使用 BAPI OUT
  • 创建Gravatar头像

    Gravatar Globally Recognized Avatar的缩写 是一项用于提供在全球范围内使用的头像服务 只要你在Gravatar的服务器上上传了你自己的头像 你便可以在其他任何支持Gravatar的博客 论坛等地方使用它 它
  • shared-service.ts

    shared service ts import Observable from rxjs Observable import Injectable from angular core import Subject from rxjs Su
  • npm link

    正文 npm link的用法 假如我们想自己开发一个依赖包 以便在多个项目中使用 一种可行的方法 也是npm给我们提供的标准做法 那就是我们独立开发好这个 依赖包 然后将它直接发布到 npm镜像站 上去 等以后想在其他项目中使用的时候 直接
  • 为什么说测试岗位是巨坑?10年测试人告诉你千万别上当

    每次都有人问我软件测试的前景是什么样的 每年也会有人很多人纷纷涌入测试的岗位上 希望自己能够进入阿里 华为等大厂 但是测试岗位真的那么吃香吗 今天我结合从零基础小白到测试开发的成长经历 来说下这个行业的发展前景 以及要入行的同学应该从哪个地
  • MinIO安装配置访问以及SpringBoot整合MinIO

    MinIO 1 MinIO安装 Minio 是个基于 Golang 编写的开源对象存储服务 存储非结构化数据 如 图片 视频 音乐等 官网地址 https min io 中文地址 http minio org cn 官网文档 中文 地址 h
  • C高级 day4

    1 有m1 txt m2 txt m3 txt m4 txt 分别创建出对应的目录 m1 m2 m3 m4 并把文件移动到对应的目录下 1 sh bin bash touch m1 txt m2 txt m3 txt m4 txt for
  • 【Ant Design】<a-date-picker>只选择今天之前的日期

  • LeetCode-N数之和类问题总结(双指针法)

    两数之和 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那两个整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 1
  • jsp中编码问题(自认为这个最好)

    在JSP Servlet中主要有以下几个地方可以设置编码 pageEncoding UTF 8 contentType text html charset UTF 8 request setCharacterEncoding UTF 8 和
  • python pdf转word

    转自 https yq aliyun com articles 487610 spm a2c4e 11153940 blogcont493499 12 655a7962KsKW7M 1 安装pdfminer3k模块 安装anaconda后
  • java listnode 合并链表_剑指offer:合并两个排序的链表(Java)

    1 问题描述 输入两个单调递增的链表 输出两个链表合成后的链表 当然我们需要合成后的链表满足单调不减规则 2 思路 方法1 非递归方法 根据题目这个很类似排序中的外排过程 两个数组分别排好序 然后再把他们整体进行排序 所以这道题思想很简单
  • Nvidia Jetson 编解码开发(6)Jetpack 4.x版本Multimedia API 硬件编码开发--输入端对接Camera V4L2采集

    1 前言 Nvidia Jetson 编解码开发 2 Jetpack 4 x版本Multimedia API 硬件编码开发 集成encode模块 free xx的博客 CSDN博客 基于上篇继续开发 由于上篇只集成了encode模块 但是编
  • Redis作为消息队列的优劣

    Redis缓存问题 Redis作为消息队列的优劣 Redis集群模式下保证可迁移和高可用 一致性算法 Redis热Key问题解决方案汇总 Redis基于内存 高性能并且提供多种数据结构供使用 那么对于Redis能不能作为消息队列 以及与专业
  • 【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(下)

    击球方阵 乒乓克隆 使用立方体建造竞技场 球拍和球 移动球和球拍 击球并得分 让相机感受到冲击力 给游戏一个抽象的霓虹灯外观 这是有关基础游戏的系列教程中的第一个教程 在其中 我们将创建一个简单的 Pong 克隆 本教程是使用 Unity