рдпреВрдирд┐рдЯреА 3 рдбреА рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рднрд╛рдЧ рджреЛ

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреА рддреИрдпрд╛рд░реА (рдЬреАрд╡рди рдиреЗ рдЧрдзреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд┐рдХ рджрд┐рдП), рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛ рдФрд░ рдЖрдкрдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред

рдПрдХ рднрд╛рдЧ


рдлрд┐рдЬрд┐рдХреНрд╕ рдХрд╛ рдЯреЗрд╕реНрдЯ рдлреЗрд▓ рд╣реЛ рдЧрдпрд╛

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо:
- рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ;
- рдПрдХ рд╡рд╕реНрддреБ "рдЖрдзрд╛рд░" рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╕рдордп-рд╕рдордп рдкрд░ рдорд░рдореНрдордд рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдПрдВ;
- рдмрдВрджреВрдХреЗрдВ рдФрд░ рдкреБрдирдГ рд▓реЛрдбрд┐рдВрдЧ рдмрдВрджреВрдХреЗрдВ рдЬреЛрдбрд╝реЗрдВ;
- "рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ" рдЪрд░ рдЬреАрд╡реА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ;

рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмреЛрдирд╕ рдЖрдкрдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ :)

рдХрд┐рд╕реА рдХреЛ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ - рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!


рдЕрдиреБрдХреВрд▓рди, рдмрдЧ рдлрд┐рдХреНрд╕, рдордВрдЪ рдкрд░ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛ рдФрд░ рд╡рд╣ рд╕рдм



рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╢рд┐рдЯ рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдПрдХ рдорд╛рд░реНрдЬрд┐рди рджреЗрдЧрд╛ред

рд╣рдо рдмрдВрджреВрдХ рдХреА рдПрдЖрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рд░рддреВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░рддреВрд╕ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреБрдирдГ рд▓реЛрдб:

PlasmaTurretAI.cs
using UnityEngine; public class PlasmaTurretAI : MonoBehaviour { public GameObject curTarget; public float towerPrice = 100.0f; public float attackMaximumDistance = 50.0f; //  public float attackMinimumDistance = 5.0f; public float attackDamage = 10.0f; // public float reloadTimer = 2.5f; //  ,   public float reloadCooldown = 2.5f; //  ,  public float rotationSpeed = 1.5f; //    public int FiringOrder = 1; //    (    2) public int upgradeLevel = 0; public int ammoAmount = 64; public int ammoAmountConst = 64; public float ammoReloadTimer = 5.0f; public float ammoReloadConst = 5.0f; public LayerMask turretLayerMask; //  Unity3D             .    Monster.       . public Transform turretHead; //     private void Start() { turretHead = transform.Find("pushka"); //      } //      private void Update() { if (curTarget != null) //      { float squaredDistance = (turretHead.position - curTarget.transform.position).sqrMagnitude; //    if (Mathf.Pow(attackMinimumDistance, 2) < squaredDistance && squaredDistance < Mathf.Pow(attackMaximumDistance, 2)) //          { turretHead.rotation = Quaternion.Lerp(turretHead.rotation, Quaternion.LookRotation(curTarget.transform.position - turretHead.position), rotationSpeed * Time.deltaTime); //     if (reloadTimer > 0) reloadTimer -= Time.deltaTime; //     -   if (reloadTimer <= 0) { if (ammoAmount > 0) //     { MobHP mhp = curTarget.GetComponent<MobHP>(); switch (FiringOrder) //,     { case 1: if (mhp != null) mhp.ChangeHP(-attackDamage); //   FiringOrder++; //  ammoAmount--; //  break; case 2: if (mhp != null) mhp.ChangeHP(-attackDamage); FiringOrder = 1; ammoAmount--; break; } reloadTimer = reloadCooldown; //        "" } else { if (ammoReloadTimer > 0) ammoReloadTimer -= Time.deltaTime; if (ammoReloadTimer <= 0) { ammoAmount = ammoAmountConst; ammoReloadTimer = ammoReloadConst; } } } if (squaredDistance < Mathf.Pow(attackMinimumDistance, 2)) curTarget = null;//    ,      } } else { curTarget = SortTargets(); //     } } //     private GameObject SortTargets() { float closestMobSquaredDistance = 0; //       GameObject nearestmob = null; //    Collider[] mobColliders = Physics.OverlapSphere(transform.position, attackMaximumDistance, turretLayerMask.value); //              foreach (var mobCollider in mobColliders) //     { float distance = (mobCollider.transform.position - turretHead.position).sqrMagnitude; //    ,  closestMobDistance    if (distance < closestMobSquaredDistance && (distance > Mathf.Pow(attackMinimumDistance, 2)) || closestMobSquaredDistance == 0) { closestMobSquaredDistance = distance; //    nearestmob = mobCollider.gameObject;//    } } return nearestmob; //    } private void OnGUI() { Vector3 screenPosition = Camera.main.WorldToScreenPoint(gameObject.transform.position); //       Vector3 cameraRelative = Camera.main.transform.InverseTransformPoint(transform.position); //     if (cameraRelative.z > 0) //     { string ammoString; if (ammoAmount > 0) { ammoString = ammoAmount + "/" + ammoAmountConst; } else { ammoString = "Reloading: " + (int)ammoReloadTimer + " s left"; } GUI.Label(new Rect(screenPosition.x, Screen.height - screenPosition.y, 250f, 20f), ammoString); } } } 


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣рд╛рдВ рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд░реА рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдмрдВрджреВрдХ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рджреВрд░реА рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Sqrt рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред Leopotam рдХреЛ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :)

рдЕрдЧрд▓рд╛ рдХрджрдо рджреГрд╢реНрдп рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рд▓рд╛рдирд╛ рд╣реИ:



рдореИрдВрдиреЗ рд▓рд╛рд▓ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рд▓ рдзрдмреНрдмреЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдП, рдХреЗрдВрджреНрд░ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рдирдХ рдореИрдХреНрд╕ рдЪрд╛рдпрджрд╛рдиреА рдХреЗ рд░реВрдк рдореЗрдВ "рдЖрдзрд╛рд░" рд╣реИ :)



рдореИрдВрдиреЗ рдмреЗрд╕ рдЯреИрдЧ рдХреЛ рдЖрдзрд╛рд░ рдкрд░ рд░рдЦрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╣рдореЗрдВ рдмрдВрджреВрдХреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддреЗ рд╣реБрдП рдореЙрдм рдХреЛ рд╕реАрдзреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдВрддрд░рд╛рд▓реЛрдВ рдкрд░ рдХреНрд╖рддрд┐ рдФрд░ рдорд░рдореНрдордд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЛ рд╕рд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

BaseHP.cs
 using UnityEngine; public class BaseHP : MonoBehaviour { public float maxHP = 1000; public float curHP = 1000; public float regenerationDelayConstant = 2.5f; //      public float regenarationDelayVariable = 2.5f; //    public float regenerationAmount = 10.0f; //       private GlobalVars gv; private void Awake() { gv = GameObject.Find("GlobalVars").GetComponent<GlobalVars>(); if (maxHP < 1) maxHP = 1; } public void ChangeHP(float adjust) { if ((curHP + adjust) > maxHP) curHP = maxHP; else curHP += adjust; if (curHP > maxHP) curHP = maxHP; //just in case } private void Update() { if (curHP <= 0) { Destroy(gameObject); } else { if (regenarationDelayVariable > 0) regenarationDelayVariable -= Time.deltaTime; //     -       if (regenarationDelayVariable <= 0) //       { ChangeHP(regenerationAmount); //     regenarationDelayVariable = regenerationDelayConstant; //        } } } } 


рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред рд╡рд╣ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдореБрдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рдПрдЖрдИ рдореЙрдмреНрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХреЗрд╡рд▓ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрдзреАрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрд╛рдХреА рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛:

MobAI.cs
 private void Update() { if (Target != null) { mob.rotation = Quaternion.Lerp(mob.rotation, Quaternion.LookRotation(new Vector3(Target.transform.position.x, 0.0f, Target.transform.position.z) - new Vector3(mob.position.x, 0.0f, mob.position.z)), mobRotationSpeed); mob.position += mob.forward * MobCurrentSpeed * Time.deltaTime; float squaredDistance = (Target.transform.position - mob.position).sqrMagnitude; //    Vector3 structDirection = (Target.transform.position - mob.position).normalized; float attackDirection = Vector3.Dot(structDirection, mob.forward); if (squaredDistance < attackDistance * attackDistance && attackDirection > 0) { if (attackTimer > 0) attackTimer -= Time.deltaTime; if (attackTimer <= 0) { BaseHP bhp = Target.GetComponent<BaseHP>(); //   HP  if (bhp != null) bhp.ChangeHP(-damage); //    HP   attackTimer = coolDown; } } } else { GameObject baseGO = GameObject.FindGameObjectWithTag("Base"); //    ,    if (baseGO != null) Target = baseGO; //   -     . } } 


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЖрдзрд╛рд░ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдмреНрд╕ рдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдмрдВрджреВрдХреЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдорд╛рд░реНрдЯреАрдЬрд╝ рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреИрдорд░рд╛ рд╕реНрдерд┐рд░ рд╣реИ! рд╡рд┐рдХрд╛рд░, рддрдп:

CameraControl.cs
 using UnityEngine; public class CameraControl : MonoBehaviour { public float CameraSpeed = 100.0f; //   public float CameraSpeedBoostMultiplier = 2.0f; //      Shift //     ,    -    public float DefaultCameraPosX = 888.0f; public float DefaultCameraPosY = 50.0f; public float DefaultCameraPosZ = 1414.0f; private void Awake() { //     ,     transform.position = new Vector3(DefaultCameraPosX, DefaultCameraPosY, DefaultCameraPosZ); } private void Update() { float smoothCamSpeed = CameraSpeed * Time.smoothDeltaTime; //       Time.deltaTime //  -    WASD     ,       (WA      ),  Shift    . if (Input.GetKey(KeyCode.W)) transform.position += Input.GetKey(KeyCode.LeftShift) ? new Vector3(0.0f, 0.0f, smoothCamSpeed * CameraSpeedBoostMultiplier) : new Vector3(0.0f, 0.0f, smoothCamSpeed); // if (Input.GetKey(KeyCode.A)) transform.position += Input.GetKey(KeyCode.LeftShift) ? new Vector3(-smoothCamSpeed * CameraSpeedBoostMultiplier, 0.0f, 0.0f) : new Vector3(-smoothCamSpeed, 0.0f, 0.0f); // if (Input.GetKey(KeyCode.S)) transform.position += Input.GetKey(KeyCode.LeftShift) ? new Vector3(0.0f, 0.0f, -smoothCamSpeed * CameraSpeedBoostMultiplier) : new Vector3(0.0f, 0.0f, -smoothCamSpeed); // if (Input.GetKey(KeyCode.D)) transform.position += Input.GetKey(KeyCode.LeftShift) ? new Vector3(smoothCamSpeed * CameraSpeedBoostMultiplier, 0.0f, 0.0f) : new Vector3(smoothCamSpeed, 0.0f, 0.0f); // } } 


рдмреЗрд╢рдХ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреИрдорд░реЗ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╕рдм рдХреБрдЫ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЖрдзрд╛рд░ рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдореЛрдмреНрд╕ рдкрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдмрдВрджреВрдХреЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛ рдмрдЧрдлрд┐рдХреНрд╕ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо "рдХреНрд░реЗрдбрд┐рдЯ" рдкрд░ рдмрдВрджреВрдХреЗрдВ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдЖрдкрдХреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкреИрд╕реЗ рдФрд░ рдмрдВрджреВрдХ рдХреА рд▓рд╛рдЧрдд рдХреА рдПрдХ рд╕рд░рд▓ рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ:
Graphic.cs
 private void OnGUI() { GUI.Box(buyMenu, "Buying menu"); //     buyMenu  ,   "" if (GUI.Button(firstTower, "Plasma Tower\n" + (int)TowerPrices.Plasma + "$")) //      { if (gv.PlayerMoney >= (int)TowerPrices.Plasma) //     gv.mau5tate = GlobalVars.ClickState.Placing; //     " " } if (GUI.Button(secondTower, "Pulse Tower\n" + (int)TowerPrices.Pulse + "$")) //   { //same action here } if (GUI.Button(thirdTower, "Beam Tower\n" + (int)TowerPrices.Beam + "$")) { //same action here } if (GUI.Button(fourthTower, "Tesla Tower\n" + (int)TowerPrices.Tesla + "$")) { //same action here } if (GUI.Button(fifthTower, "Artillery Tower\n" + (int)TowerPrices.Artillery + "$")) { //same action here } GUI.Box(playerStats, "Player Stats"); GUI.Label(playerStatsPlayerMoney, "Money: " + gv.PlayerMoney + "$"); GUI.Box(towerMenu, "Tower menu"); if (GUI.Button(towerMenuSellTower, "Sell")) { //action here } if (GUI.Button(towerMenuUpgradeTower, "Upgrade")) { //same action here } } //   private enum TowerPrices { Plasma = 100, Pulse = 150, Beam = 250, Tesla = 300, Artillery = 350 } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ GlobalVars рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рд╕реНрдЯреИрдЯрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрди рдЧрдПред

GlobalVars.cs
 using System.Collections.Generic; using UnityEngine; public static class GlobalVars { public static List<GameObject> MobList = new List<GameObject>(); //    public static int MobCount = 0; //    public static List<GameObject> TurretList = new List<GameObject>(); //    public static int TurretCount = 0; //    public static float PlayerMoney = 200.0f; //  ,        -   200$,     public static ClickState mau5tate = ClickState.Default; //   public enum ClickState //    { Default, // Placing, //  Selling, //  Upgrading //  } } 


рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ GlobalVars рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рдо рдЬреАрд╡реА рдЪрд░ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд╛рдЧ рдореЗрдВ рдЙрдирдХреА рд╢реБрд░реБрдЖрдд ()ред рд╕рднреА gv рдХреЛ GlobalVars рд╕реЗ рдмрджрд▓реЗрдВред рд╣рдо рдЕрд╢рдХреНрдд GlobalVars рдЪреЗрдХ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджреЗрддреЗ рд╣реИрдВред рд╣рдо GlobalVars рдШрдЯрдХ рдХреЛ рдЙрд╕реА рдирд╛рдо рдХреЗ GO рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ (рдЖрдк GO рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, cfb)ред
рдореИрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛред

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреА, рдмрд┐рдЧрд╛рдбрд╝! :)

bitbucket.org/andyion/habratd-tutorial/commits/db7c1bc0c10c89f45be187e59e0608a2fbb3083d

рдпрд╣ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓реЗ рд╣реА рдкрд▓ рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмреЛрдирд╕ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ рдЬреЛ рдмрдВрджреВрдХ рдФрд░ рдореЙрдм рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд▓реЗ рдХреА рд╕реАрдорд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдПрдЧрд╛: bitbucket.org/andyion/habratd-tutorial/commits/18ec053f5f5b7bbd3598890aa40306e038d4722

рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рд▓реЗрдВ рдФрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рд╕реАрдорд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВред рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддреЗ рд╕рдордп, GO рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдкреАрд▓рд╛ рд╕рд░реНрдХрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрдХреЗрддрд┐рдд рд╕реАрдорд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдореЗрдВ рдЕрднреА рднреА рдореМрдЬреВрдж рд╢реЛрд▓реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рдЗрд╕ рдЧреЗрдо рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡рдореЗрд╢ рдХреЗ рд╕рд╛рде рдлреАрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ - рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдерд╛ред

Source: https://habr.com/ru/post/In182672/


All Articles