рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдПрдХ рдПрдХрддрд╛ рдЦреЗрд▓ рдмрдирд╛рдирд╛ - рднрд╛рдЧ 2

рдЫрд╡рд┐

рдпрд╣ "рдПрдХрддрд╛ рдореЗрдВ рдПрдХ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдмрдирд╛рдирд╛" рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╣рдо рдПрдХрддрд╛ рдореЗрдВ рдПрдХ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рд╢реИрд▓реА рдЦреЗрд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдЕрдВрдд рддрдХ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП рдФрд░ рдХреИрд╕реЗ рдЙрдиреНрдирдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджреБрд╢реНрдорди рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреБрдХреАрдЬрд╝ рднреА рд╣реИрдВред

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

рдХрд╛рдо рдкрд░ рд▓рдЧрдирд╛


рдПрдХрддрд╛ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреЛрд▓реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЕрднреА рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реБрдП рд╣реИрдВ, рддреЛ рдбреНрд░рд╛рдлреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЯреЙрд╡рд░рдбрд┐рдлреЗрдВрд╕-рдкрд╛рд░реНрдЯ 2-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдЦреЛрд▓реЗрдВред

рджреГрд╢реНрдпреЛрдВ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ GameScene рдЦреЛрд▓реЗрдВред

рджреБрд╢реНрдордиреЛрдВ рдХреА рдмрд╛рд░реА


рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ, рджреБрд╢реНрдорди рдиреЗ рд╕рдбрд╝рдХ рдкрд░ рдЪрд▓рдирд╛ рд╕реАрдЦрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред

IDE рдореЗрдВ MoveEnemy.cs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред

private void RotateIntoMoveDirection() { //1 Vector3 newStartPosition = waypoints [currentWaypoint].transform.position; Vector3 newEndPosition = waypoints [currentWaypoint + 1].transform.position; Vector3 newDirection = (newEndPosition - newStartPosition); //2 float x = newDirection.x; float y = newDirection.y; float rotationAngle = Mathf.Atan2 (y, x) * 180 / Mathf.PI; //3 GameObject sprite = gameObject.transform.Find("Sprite").gameObject; sprite.transform.rotation = Quaternion.AngleAxis(rotationAngle, Vector3.forward); } 

RotateIntoMoveDirection рджреБрд╢реНрдорди рдХреЛ рдШреБрдорд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдЖрдЧреЗ RotateIntoMoveDirection ред рд╡рд╣ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

  1. рдмрдЧ рдХреА рд╡рд░реНрддрдорд╛рди рджрд┐рд╢рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдЧрд▓реЗ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реИред
  2. рд░реЗрдбрд┐рдпрди рдореЗрдВ рдХреЛрдг рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Mathf.Atan2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ newDirection рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИ (рд╢реВрдиреНрдп рдмрд┐рдВрджреБ рджрд╛рдИрдВ рдУрд░ рд╣реИ)ред рдкрд░рд┐рдгрд╛рдо рдХреЛ 180 / Mathf.PI рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдг рдХреЛ рдбрд┐рдЧреНрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдЪреНрдЪрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдХреНрд╖ рдХреЛ рдШреБрдорд╛рддрд╛ рд╣реИред rotationAngle рдбрд┐рдЧреНрд░реАред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдмрдЪреНрдЪреЗ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдирд╣реАрдВ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЬреЛ рдКрд░реНрдЬрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рд╡рд╣ рдХреНрд╖реИрддрд┐рдЬ рдмрдиреА рд░рд╣реЗред

Update() , рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдмрджрд▓реЗрдВ // TODO: рдЕрдЧрд▓реЗ рдХреЙрд▓ рдХреЗ // TODO: RotateIntoMoveDirection :

 RotateIntoMoveDirection(); 

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред рджреГрд╢реНрдп рдХреЛ рдЪрд▓рд╛рдПрдВ; рдЕрдм рджреБрд╢реНрдорди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣рд╛ рд╣реИред


рдЕрдм рдмрдЧ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд╣рд╛рдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдФрд░ рдХреЗрд╡рд▓ рджреБрд╢реНрдорди рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдореЗрдВ рднреАрдбрд╝ рдЪрд╛рд╣рд┐рдП! рдФрд░ рдХрд┐рд╕реА рднреА рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдХреА рддрд░рд╣, рд▓рд╣рд░реЛрдВ рдореЗрдВ рднреАрдбрд╝ рдЪрд▓рддреА рд╣реИ!

рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рднреАрдбрд╝ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЖрд╕рдиреНрди рд▓рдбрд╝рд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реНрдХреНрд░реАрди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╡рд░реНрддрдорд╛рди рд▓рд╣рд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдХрдИ GameObjects рджреНрд╡рд╛рд░рд╛ рд╡реЗрд╡ рдЬрд╛рдирдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ GameManagerBehavior рдШрдЯрдХ рдХреЗ GameManager рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ ред

IDE рдореЗрдВ GameManagerBehavior.cs рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public Text waveLabel; public GameObject[] nextWaveLabels; 

waveLabel рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рддрд░рдВрдЧ рд╕рдВрдЦреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред nextWaveLabels рджреЛ nextWaveLabels рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдирдИ рд▓рд╣рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗ:


рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ GameManager рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рд╡реЗрд╡ рд▓реЗрдмрд▓ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рдд рд╕рд░реНрдХрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкрд╛рда рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ, рджреГрд╢реНрдп рдЯреИрдм рд╕реЗ WaveLabel рдЪреБрдиреЗрдВред

рдЕрдм рдиреЗрдХреНрд╕реНрдЯ рд╡реЗрд╡ рд▓реЗрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЬ 2 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдм Element 0 рдХреЛ NextWaveBottomLabel рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рддрддреНрд╡ 1 NextWaveTopLabel рдХреЗ рд▓рд┐рдП рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рдордиреЗ рд╡реЗрд╡ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред


рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЧреЗрдо рдореИрдиреЗрдЬрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдм рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЕрдЧрд▓реА рд▓рд╣рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, GameManagerBehavior.cs рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ рдФрд░ рдПрдХ рдЕрдиреНрдп рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public bool gameOver = false; 

gameOver рд╣рдо рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд╛рд░ рдЧрдпрд╛ред

рдпрд╣рд╛рдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рддрд░рдВрдЧ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред GameManagerBehavior рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 private int wave; public int Wave { get { return wave; } set { wave = value; if (!gameOver) { for (int i = 0; i < nextWaveLabels.Length; i++) { nextWaveLabels[i].GetComponent<Animator>().SetTrigger("nextWave"); } } waveLabel.text = "WAVE: " + (wave + 1); } } 

рдПрдХ рдирд┐рдЬреА рдЪрд░, рд╕рдВрдкрддреНрддрд┐, рдФрд░ рдЧреЗрдЯрдЯрд░ рдмрдирд╛рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЪреАрдЬ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╕реЗрдЯрд░ рдХреЗ рд╕рд╛рде, рдлрд┐рд░ рд╕реЗ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рд╣рдо wave рдирдпрд╛ value ред

рдлрд┐рд░ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЦреЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рднреА рдЕрдЧрд▓реЗ рд╡реЙрд▓реНрд╡ рд▓реЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░реЗрдВ - рдЗрди рд▓реЗрдмрд▓ рдореЗрдВ рдПрдХ рдПрдирд┐рдореЗрдЯрд░ рдШрдЯрдХ рд╣реИред рдРрдирд┐рдореЗрдЯрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдиреЗрдХреНрд╕реНрдЯ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред

рдЕрдВрдд рдореЗрдВ, рд╣рдо wave + 1 waveLabel рдХрд╛ text рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ +1 ? рд╕рд╛рдзрд╛рд░рдг рд▓реЛрдЧ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЧрд┐рдирддреА рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рдБ, рдпрд╣ рдЕрдЬреАрдм рд╣реИ)ред

Start() рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 Wave = 0; 

рд╣рдо рд╕рдВрдЦреНрдпрд╛ 0 Wave рд╕рд╛рде рдЧрд┐рдирддреА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдореЗрдВ рджреГрд╢реНрдп рдЪрд▓рд╛рдПрдБред рд╡реЗрд╡ рд▓реЗрдмрд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ 1 рджрд┐рдЦрд╛рдПрдЧрд╛ред


рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рд▓рд╣рд░ 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рд▓рд╣рд░реЗрдВ: рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдвреЗрд░ рдмрдирд╛рдПрдБ


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

рдпрд╣реА рд╣реИ, рдЦреЗрд▓ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЯреИрдЧ рдпрд╣рд╛рдВ рдЦреЗрд▓ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рд╢рддреНрд░реБ рдЯреИрдЧрд┐рдВрдЧ


Project Browser рдореЗрдВ Enem prefab рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдЯреИрдЧ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдРрдб рдЯреИрдЧ рдЪреБрдиреЗрдВред


рд╢рддреНрд░реБ рдирд╛рдордХ рдПрдХ рдЯреИрдЧ рдмрдирд╛рдПрдВред


Prefab рд╢рддреНрд░реБ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢рддреНрд░реБ рдЯреИрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ ред

рджреБрд╢реНрдордиреЛрдВ рдХреА рд▓рд╣рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛


рдЕрдм рд╣рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреА рд▓рд╣рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред IDE рдореЗрдВ SpawnEnemy.cs рдЦреЛрд▓реЗрдВ рдФрд░ SpawnEnemy рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ:

 [System.Serializable] public class Wave { public GameObject enemyPrefab; public float spawnInterval = 2; public int maxEnemies = 20; } 

рд╡реЗрд╡ рдореЗрдВ enemyPrefab рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕ рд▓рд╣рд░ рдореЗрдВ рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдЖрдзрд╛рд░, spawnInterval - рд╕реЗрдХрдВрдб рдФрд░ maxEnemies рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдореЗрдВ рд▓рд╣рд░ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп - рдЗрд╕ рд▓рд╣рд░ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рджреБрд╢реНрдордиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рд╡рд░реНрдЧ Serializable рд╣реИ , рдЕрд░реНрдерд╛рддреН , рд╣рдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдХреЛ SpawnEnemy рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 public Wave[] waves; public int timeBetweenWaves = 5; private GameManagerBehavior gameManager; private float lastSpawnTime; private int enemiesSpawned = 0; 

рдпрд╣рд╛рдВ рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдорд╛рд░реНрдЧ рдкрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред

рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреБрд╢реНрдордиреЛрдВ рдХреА рд▓рд╣рд░реЛрдВ рдХреЛ рддрд░рдВрдЧреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреБрд╢реНрдордиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред

рдЗрди рд╕рднреА рдорд╛рд░ рдХреЗ рдмрд╛рдж, рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдВрд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП 5 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реЗрдЯ рдХрд░реЗрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ Start() рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВред

 lastSpawnTime = Time.time; gameManager = GameObject.Find("GameManager").GetComponent<GameManagerBehavior>(); 

рдпрд╣рд╛рдВ рд╣рдо lastSpawnTime рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, lastSpawnTime , рджреГрд╢реНрдп рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордпред рддреЛ рдлрд┐рд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд GameManagerBehavior рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

Update() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ Update() :

 // 1 int currentWave = gameManager.Wave; if (currentWave < waves.Length) { // 2 float timeInterval = Time.time - lastSpawnTime; float spawnInterval = waves[currentWave].spawnInterval; if (((enemiesSpawned == 0 && timeInterval > timeBetweenWaves) || timeInterval > spawnInterval) && enemiesSpawned < waves[currentWave].maxEnemies) { // 3 lastSpawnTime = Time.time; GameObject newEnemy = (GameObject) Instantiate(waves[currentWave].enemyPrefab); newEnemy.GetComponent<MoveEnemy>().waypoints = waypoints; enemiesSpawned++; } // 4 if (enemiesSpawned == waves[currentWave].maxEnemies && GameObject.FindGameObjectWithTag("Enemy") == null) { gameManager.Wave++; gameManager.Gold = Mathf.RoundToInt(gameManager.Gold * 1.1f); enemiesSpawned = 0; lastSpawnTime = Time.time; } // 5 } else { gameManager.gameOver = true; GameObject gameOverText = GameObject.FindGameObjectWithTag ("GameWon"); gameOverText.GetComponent<Animator>().SetBool("gameOver", true); } 

рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд░рдг рджрд░ рдЪрд░рдг рдХрд░реЗрдВ:

  1. рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрд░рдВрдЧ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рд╣реИред
  2. рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рджреБрд╢реНрдорди рд╕реНрдкреЙрди рдХреЗ рдмрд╛рдж рдмреАрддреЗ рд╣реБрдП рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рджреБрд╢реНрдорди рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд▓рд╣рд░ рдореЗрдВ рдкрд╣рд▓рд╛ рджреБрд╢реНрдорди рд╣реИ, рддреЛ рд╣рдо timeBetweenWaves рдХрд┐ рдХреНрдпрд╛ timeBetweenWaves рд╕реЗ timeInterval рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо spawnInterval рдХрд┐ рдХреНрдпрд╛ spawnInterval рддрд░рдВрдЧреЛрдВ рд╕реЗ timeInterval рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рд▓рд╣рд░ рдореЗрдВ рд╕рднреА рджреБрд╢реНрдорди рдирд╣реАрдВ рдмрдирд╛рдП рд╣реИрдВред
  3. рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рджреБрд╢реНрдорди рдХреЛ рд╕реНрдкреЙрди рдХрд░реЗрдВ, рджреБрд╢реНрдорди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реБрдП enemyPrefab ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ enemiesSpawned рдХреЗ рдореВрд▓реНрдп рдореЗрдВ enemiesSpawned ред
  4. рд╕реНрдХреНрд░реАрди рдкрд░ рджреБрд╢реНрдордиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдпрджрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд▓рд╣рд░ рдореЗрдВ рдпрд╣ рдЖрдЦрд┐рд░реА рджреБрд╢реНрдорди рдерд╛, рддреЛ рд╣рдо рдЕрдЧрд▓реА рд▓рд╣рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рд▓рд╣рд░ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╢реЗрд╖ рд╕рднреА рд╕реНрд╡рд░реНрдг рдХрд╛ 10 рдкреНрд░рддрд┐рд╢рдд рджреЗрддреЗ рд╣реИрдВред
  5. рдЖрдЦрд┐рд░реА рд▓рд╣рд░ рдХреЛ рд╣рд░рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЦреЗрд▓ рдореЗрдВ рдЬреАрдд рдХрд╛ рдПрдХ рдПрдиреАрдореЗрд╢рди рдпрд╣рд╛рдВ рдЦреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдкреЙрди рдЕрдВрддрд░рд╛рд▓ рд╕реЗрдЯ рдХрд░рдирд╛


рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд░реЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ, рд╡реЗрд╡реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ 4 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╢рддреНрд░реБ Prefab рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдЪрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рддреНрд░реБ рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдирд┐рдореНрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкреЙрди рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдЕрдзрд┐рдХрддрдо рд╢рддреНрд░реБ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

  • рддрддреНрд╡ 0 : рд╕реНрдкреЙрди рдЗрдВрдЯрд░рд╡рд▓: 2.5 , рдЕрдзрд┐рдХрддрдо рд╢рддреНрд░реБ: 5
  • рддрддреНрд╡ 1 : рд╕реНрдкреЙрди рдЗрдВрдЯрд░рд╡рд▓: 2 , рдореИрдХреНрд╕ рджреБрд╢реНрдорди: 10
  • рддрддреНрд╡ 2 : рд╕реНрдкреЙрди рдЗрдВрдЯрд░рд╡рд▓: 2 , рдореИрдХреНрд╕ рджреБрд╢реНрдорди: 15
  • рддрддреНрд╡ 3 : рд╕реНрдкреЙрди рдЕрдВрддрд░рд╛рд▓: 1 , рдЕрдзрд┐рдХрддрдо рд╢рддреНрд░реБ: 5

рд╕рдорд╛рдкреНрдд рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:


рдмреЗрд╢рдХ, рдЖрдк рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдЕрд╣рд╛! рдмреАрдЯрд▓ рдиреЗ рдЖрдкрдХреА рдХреБрдХреА рдХреА рдпрд╛рддреНрд░рд╛ рд╢реБрд░реВ рдХрд░ рджреА рд╣реИ!

рдХреАрдбрд╝реЗ

рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп: рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВ


рдХрд┐рд╕реА рднреА рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреБрд╢реНрдорди рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Prefabs рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ Enemy2 рднреА рд╣реИред

рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ, Prefabs \ Enemy2 рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ MoveEnemy рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВред рдЧрддрд┐ 3 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╢рддреНрд░реБ рдЯреИрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ ред рдЕрдм рдЖрдк рдЗрд╕ рддреНрд╡рд░рд┐рдд рджреБрд╢реНрдорди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдЖрд░рд╛рдо рди рдХрд░реЗ!

рдкреНрд▓реЗрдпрд░ рд▓рд╛рдЗрдл рдЕрдкрдбреЗрдЯ


рд╣рд╛рд▓рд╛рдВрдХрд┐ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдЧрд┐рд░реЛрд╣ рдХреБрдХреА рдкрд░ рд╣рдорд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд▓реНрдж рд╣реА рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдиреБрдХрд╕рд╛рди рдЙрдард╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЕрдЧрд░ рд╡рд╣ рджреБрд╢реНрдорди рдХреЛ рдЪреБрдкрдХреЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

IDE рдореЗрдВ GameManagerBehavior.cs рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public Text healthLabel; public GameObject[] healthIndicator; 

рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЬреАрд╡рди рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП healthLabel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдХреАрдЬрд╝ рдХреЛ рдЪрдмрд╛рддреЗ рд╣реБрдП рдкрд╛рдБрдЪ рдЫреЛрдЯреЗ рд╣рд░реЗ рд░рд╛рдХреНрд╖рд╕реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рд╕реНрдереНрдпрд╡рд░реНрдзрдХ - рд╡реЗ рдмрд╕ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИрдВ; рдпрд╣ рдПрдХ рдорд╛рдирдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕рдВрдХреЗрддрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдордЬреЗрджрд╛рд░ рд╣реИред

рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкреНрд░рдмрдВрдзрди


рдЕрдм GameManagerBehavior рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

 private int health; public int Health { get { return health; } set { // 1 if (value < health) { Camera.main.GetComponent<CameraShake>().Shake(); } // 2 health = value; healthLabel.text = "HEALTH: " + health; // 3 if (health <= 0 && !gameOver) { gameOver = true; GameObject gameOverText = GameObject.FindGameObjectWithTag("GameOver"); gameOverText.GetComponent<Animator>().SetBool("gameOver", true); } // 4 for (int i = 0; i < healthIndicator.Length; i++) { if (i < Health) { healthIndicator[i].SetActive(true); } else { healthIndicator[i].SetActive(false); } } } } 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░, рдХреЛрдб рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рд╕реЗрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ:

  1. рдпрджрд┐ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕реБрдВрджрд░ рдЭрдЯрдХреЛрдВ рдХреЛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CameraShake рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
  2. рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдирд┐рдЬреА рдЪрд░ рдФрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд▓реЗрдмрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
  3. рдпрджрд┐ рд╕реНрд╡рд╛рд╕реНрдереНрдп 0 рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЦреЗрд▓ рдХрд╛ рдЕрдВрдд рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ, рддреЛ gameOver рдХреЛ true gameOver рдФрд░ gameOver рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВред
  4. рд╣рдо рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рд░рд╛рдХреНрд╖рд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рднрд╛рдЧ рдЖрд╕рд╛рди рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рдо рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ Health рдХреЛ Start() :

 Health = 5; 

рд╣рдо Health рдХреЛ 5 рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рджреГрд╢реНрдп рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдмрдЧ рдХреБрдХреА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ IDE рдХреЛ MoveEnemy.cs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЬрд╛рдПрдВред

рд╕реНрд╡рд╛рд╕реНрдереНрдп рдореЗрдВ рдмрджрд▓рд╛рд╡


рдЕрдкрдиреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, Update() рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА Update() рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде // TODO: рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдХреЛрдб рд╕реЗ рдмрджрд▓реЗрдВ:

 GameManagerBehavior gameManager = GameObject.Find("GameManager").GetComponent<GameManagerBehavior>(); gameManager.Health -= 1; 

рдЗрд╕рд▓рд┐рдП рд╣рдо GameManagerBehavior рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпреВрдирд┐рдЯ рдХреЛ рдЙрд╕рдХреЗ Health рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред

рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ GameManager рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ Health рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП HealthLabel рдЪреБрдиреЗрдВред

рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреБрдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рдВрдЪ рдмрдЪреНрдЪреЗ HealthIndicators рдХреЛ GameManager рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕рдВрдХреЗрддрдХ рд╕рд░рдгреА рдореЗрдВ рдЦреАрдВрдЪреЗрдВ - рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕рдВрдХреЗрддрдХ рдХреБрдХреАрдЬрд╝ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЫреЛрдЯреЗ рд╣рд░реЗ рд░рд╛рдХреНрд╖рд╕ рд╣реЛрдВрдЧреЗред

рджреГрд╢реНрдп рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдХреАрдбрд╝реЗ рдХреБрдХреА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗред рд╣рд╛рд░рдиреЗ рддрдХ рдХреБрдЫ рди рдХрд░реЗрдВред

рдХреБрдХреАрдЬрд╝ рдкрд░ рд╣рдорд▓рд╛

рд░рд╛рдХреНрд╖рд╕ рдмрджрд▓рд╛


рдЬрдЧрд╣ рдореЗрдВ рд░рд╛рдХреНрд╖рд╕? рд╣рд╛рдВред рдХреНрдпрд╛ рджреБрд╢реНрдорди рд╣рдорд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ? рд╣рд╛рдБ, рдФрд░ рд╡реЗ menacing рджрд┐рдЦрддреЗ рд╣реИрдВ! рдЗрди рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ!

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рд▓реЗрди рддрд╛рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рджреБрд╢реНрдорди рдордЬрдмреВрдд рд╣реИрдВ рдФрд░ рдХреМрди рд╕реЗ рдХрдордЬреЛрд░ рд╣реИрдВ
  • рдПрдХ рд░рд╛рдХреНрд╖рд╕ рдХреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛
  • рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ - рдХрд┐рд╕ рджреБрд╢реНрдорди рдкрд░ рдЧреЛрд▓реА рдЪрд▓рд╛рдирд╛ рд╣реИ
  • рдЧреЛрд▓реЗ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛

рд╢рддреНрд░реБ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА


рд╕реНрд╡рд╛рд╕реНрдереНрдп рдмреИрдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдЕрдВрдзреЗрд░реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ (рд╣рд░реЗ рд░рдВрдЧ рдХреА рдкрдЯреНрдЯреА рдереЛрдбрд╝реА рдЫреЛрдЯреА рд╣реИ) рд╣рдо рджреБрд╢реНрдорди рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдХреЗрд▓ рдХрд░реЗрдВрдЧреЗред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ Prefabs \ Enemy рджреГрд╢реНрдп рдкрд░ рдЦреАрдВрдЪреЗрдВред

рддрдм рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ, рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд╢реНрдорди рдкрд░ Images \ Objects \ HealthBarBackground рдХреЛ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВред

рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ, HealthBarBackground (0, 1, -4) рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

рдлрд┐рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, Images \ Objects \ HealthBar рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рдХреА рдзреБрд░реА рдмрд╛рдПрдБ рд╣реИ ред рдлрд┐рд░ рдЗрд╕реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╢рддреНрд░реБ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдорд╛рди (-0.63, 1, -5) рд╕реЗрдЯ рдХрд░реЗрдВ ред X рд╕реНрдХреЗрд▓ рдХреЗ рд▓рд┐рдП, рдорд╛рди рдХреЛ 125 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

HealthBar рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ HealthBar рдирд╛рдордХ рдПрдХ рдирдпрд╛ C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдмрджрд▓ рджреЗред

рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╢рддреНрд░реБ рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ (20, 0, 0) рд╣реИ ред

рдкреНрд░реАрдлрд╝реИрдм рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рдЕрдВрдд рдореЗрдВ, рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╢рддреНрд░реБ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред


рдЕрдм Prefabs \ Enemy2 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред

рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА рдХреА рд▓рдВрдмрд╛рдИ рдмрджрд▓реЗрдВ


IDE HealthBar.cs рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public float maxHealth = 100; public float currentHealth = 100; private float originalScale; 

рдЕрдзрд┐рдХрддрдо рд╕реНрд╡рд╛рд╕реНрдереНрдп рдореЗрдВ рджреБрд╢реНрдорди рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ currentHealth рд╕реНрд╡рд╛рд╕реНрдереНрдп рдореЗрдВ - рд╢реЗрд╖ рд╕реНрд╡рд╛рд╕реНрдереНрдпред рдЕрдВрдд рдореЗрдВ, рдУрд░рд┐рдЬрд┐рдирд▓рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдХрд╛рд░ рд╣реИред

originalScale рд╡рд╕реНрддреБ рдХреЛ Start() рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ Start() :

 originalScale = gameObject.transform.localScale.x; 

рд╣рдо localScale рдЧреБрдг рдХрд╛ x рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред

Update() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝рдХрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрдЯреНрдЯреА рдХрд╛ рдкреИрдорд╛рдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ Update() :

 Vector3 tmpScale = gameObject.transform.localScale; tmpScale.x = currentHealth / maxHealth * originalScale; gameObject.transform.localScale = tmpScale; 

рд╣рдо localScale рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ x рдорд╛рди рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗред рдлрд┐рд░ рд╣рдо рдмреАрдЯрд▓ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдП рдПрдХреНрд╕- рд╕реНрдХреЗрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ localScale рдЪрд░ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдореЗрдВ рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рд╢рддреНрд░реБрдУрдВ рдкрд░ рдЖрдкрдХреЛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рд▓рдХреАрд░реЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред


рдЬрдмрдХрд┐ рдЦреЗрд▓ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╢рддреНрд░реБ (рдХреНрд▓реЛрди) рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЗ HealthBar рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд╛рд╕реНрдереНрдп рдореВрд▓реНрдп рдмрджрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдмрд╛рд░ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИред


рд░реЗрдВрдЬ рдХреЗ рднреАрддрд░ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ


рдЕрдм рд╣рдорд╛рд░реЗ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рди рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдореЙрдиреНрд╕реНрдЯрд░ рдФрд░ рджреБрд╢реНрдорди рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░реАрдлреИрдмреНрд╕ \ рдореЙрдиреНрд╕реНрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рд╕рд░реНрдХрд▓ рдХреЛрд▓рд╛рдЗрдбрд░ 2 рдбреА рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВред

рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЗ рд░реЗрдбрд┐рдпрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ 2.5 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ - рдпрд╣ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рд╣рдорд▓реЗ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред

рдЯреНрд░рд┐рдЧреЗрд░ рдЪреЗрдХ рдмреЙрдХреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡рд╕реНрддреБрдПрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕рд╕реЗ рдЯрдХрд░рд╛рдПрдВред

рдЕрдВрдд рдореЗрдВ, рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рд░реЗрдпрд╕реНрдЯрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдиреНрд╕реНрдЯрд░ рдХреА рдкрд░рдд рд╕реЗрдЯ рдХрд░реЗрдВ ред рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ, рд╣рд╛рдБ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ , рдмрдЪреНрдЪреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ ред рдпрджрд┐ рдЗрдЧреНрдиреЛрд░ рд░рд╛рдпрдХрд╛рд╕реНрдЯ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрд▓рд╛рдЗрдбрд░ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛ред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд░рд╛рдХреНрд╖рд╕ рдмреНрд▓реЙрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдиреАрдЪреЗ рдУрдкрдиреНрд╕рдкреЙрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдд рдХрд░рддреЗ рд╣реИрдВред


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

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, Prefabs \ Enemy рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред Rigidbody 2D рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдмреЙрдбреА рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрд╛рдЗрдиреЗрдореИрдЯрд┐рдХ рдЪреБрдиреЗрдВ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╢рд░реАрд░ рднреМрддрд┐рдХреА рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

1 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд▓ рдХреЛрд▓рд╛рдЗрдбрд░ 2 рдбреА рдЬреЛрдбрд╝реЗрдВред Prefabs \ Enemy 2 рдХреЗ рд▓рд┐рдП рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред

рдЯреНрд░рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░рд╛рдХреНрд╖рд╕ рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рджреБрд╢реНрдорди рдЙрдирдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВред

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

EnemyDestructionDelegate рдирд╛рдордХ рдПрдХ рдирдИ C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рджреБрд╢реНрдорди рдФрд░ Enemy2 рдкреНрд░реАрдлреИрдмреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ ред

рдЖрдИрдбреАрдИ рдореЗрдВ EnemyDestructionDelegate.cs рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдШреЛрд╖рдгрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 public delegate void EnemyDelegate (GameObject enemy); public EnemyDelegate enemyDelegate; 

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ delegate рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдиреЛрдЯ : рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдиреНрдп рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХрддрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 void OnDestroy() { if (enemyDelegate != null) { enemyDelegate(gameObject); } } 

рдЬрдм рдХреЛрдИ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХрддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ null рдЕрд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП null рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ gameObject рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╕рднреА рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рджреБрд╢реНрдорди рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред

рд╣рдо рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдорд╛рд░рдиреЗ рдХрд╛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рджреЗрддреЗ рд╣реИрдВ


рдФрд░ рдЕрдм рд░рд╛рдХреНрд╖рд╕ рдЕрдкрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореЙрдиреНрд╕реНрдЯрд░ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдПрдХ рдирдИ C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рд╢реВрдЯ рдХрд░реЗрдВ ред

OpenEnemy.cs рдХреЛ IDE рдореЗрдВ рдЦреЛрд▓реЗрдВ рдФрд░ Generics рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рдХрд╛ using рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВред

 using System.Collections.Generic; 

рд░реЗрдВрдЬ рдХреЗ рднреАрддрд░ рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public List<GameObject> enemiesInRange; 

рджреБрд╢реНрдордиреЛрдВ рдореЗрдВ рд╣рдо рд░реЗрдВрдЬ рдореЗрдВ рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред

рдкреНрд░рд╛рд░рдВрдн Start() рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ Start() ред

 enemiesInRange = new List<GameObject>(); 

рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдореЗрдВ рдХреЛрдИ рджреБрд╢реНрдорди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╣реИрдВред

enemiesInRange рдХреА рд╕реВрдЪреА рднрд░реЗрдВ enemiesInRange ! рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 // 1 void OnEnemyDestroy(GameObject enemy) { enemiesInRange.Remove (enemy); } void OnTriggerEnter2D (Collider2D other) { // 2 if (other.gameObject.tag.Equals("Enemy")) { enemiesInRange.Add(other.gameObject); EnemyDestructionDelegate del = other.gameObject.GetComponent<EnemyDestructionDelegate>(); del.enemyDelegate += OnEnemyDestroy; } } // 3 void OnTriggerExit2D (Collider2D other) { if (other.gameObject.tag.Equals("Enemy")) { enemiesInRange.Remove(other.gameObject); EnemyDestructionDelegate del = other.gameObject.GetComponent<EnemyDestructionDelegate>(); del.enemyDelegate -= OnEnemyDestroy; } } 

  1. OnEnemyDestroy рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреЛ рджреБрд╢реНрдордиреЛрдВ рд╕реЗ enemiesInRange ред рдЬрдм рдПрдХ рджреБрд╢реНрдорди рдПрдХ рд░рд╛рдХреНрд╖рд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдкрд░ рдХрджрдо OnTriggerEnter2D рд╣реИ, рддреЛ OnTriggerEnter2D ред
  2. рдлрд┐рд░ рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреЛ рджреБрд╢реНрдорди рдореЗрдВ enemiesInRange рд╕реВрдЪреА рд╕реВрдЪреА рдФрд░ EnemyDestructionDelegate рдШрдЯрдирд╛ OnEnemyDestroy рдЬреЛрдбрд╝реЗрдВред рддреЛ рд╣рдо рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рджреБрд╢реНрдорди рдХреЗ рд╡рд┐рдирд╛рд╢ рдкрд░ OnEnemyDestroy рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдореГрдд рджреБрд╢реНрдордиреЛрдВ рдкрд░ рдЧреЛрд▓рд╛ рдмрд╛рд░реВрдж рдЦрд░реНрдЪ рдХрд░рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
  3. OnTriggerExit2D рд╣рдо рджреБрд╢реНрдорди рдХреЛ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЕрдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рджреБрд╢реНрдорди рд╕реАрдорд╛ рдореЗрдВ рд╣реИрдВред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдореЗрдВ рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд░рд╛рдХреНрд╖рд╕ рдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗрдВ, рдЗрд╕реЗ рдЪреБрдиреЗрдВ рдФрд░ enemiesInRange рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред enemiesInRange рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред

рд▓рдХреНрд╖реНрдп рдЪрдпрди


рд░рд╛рдХреНрд╖рд╕ рдЕрдм рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рджреБрд╢реНрдорди рдХреА рд╕реАрдорд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╡реЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдХрдИ рджреБрд╢реНрдорди рд╣реЛрдВрдЧреЗ рддреЛ рд╡реЗ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ?

рдмреЗрд╢рдХ, рд╡реЗ рдЬрд┐рдЧрд░ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╕реЗ рд╣рдорд▓рд╛ рдХрд░реЗрдВрдЧреЗ!

MoveEnemy.cs IDE рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕ рд░рд╛рдХреНрд╖рд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 public float DistanceToGoal() { float distance = 0; distance += Vector2.Distance( gameObject.transform.position, waypoints [currentWaypoint + 1].transform.position); for (int i = currentWaypoint + 1; i < waypoints.Length - 1; i++) { Vector3 startPosition = waypoints [i].transform.position; Vector3 endPosition = waypoints [i + 1].transform.position; distance += Vector2.Distance(startPosition, endPosition); } return distance; } 

рдХреЛрдб рджреБрд╢реНрдорди рджреНрд╡рд╛рд░рд╛ рдпрд╛рддреНрд░рд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рдкрде рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ Distance рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Vector3 рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рд▓рдХреНрд╖реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рд░рд╛рдХреНрд╖рд╕ рд╕рд╢рд╕реНрддреНрд░ рдФрд░ рдЕрд╕рд╣рд╛рдп рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕реЗ рдХрд░реЗрдВрдЧреЗред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЧреЛрд▓реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред

рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдЧреЛрд▓реЗ рджреЗрддреЗ рд╣реИрдВред рдЦреЛрд▓ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ!


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдЪрд┐рддреНрд░ / рдСрдмреНрдЬреЗрдХреНрдЯ / рдмреБрд▓реЗрдЯ 1 рджреГрд╢реНрдп рдкрд░ рдЦреАрдВрдЪреЗрдВ ред Z рд╕реЗ -2 рдкрд░ рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ - x рдФрд░ y рдкрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред

BulletBehavior рдирд╛рдордХ рдПрдХ рдирдИ C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдлрд┐рд░ IDE рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 public float speed = 10; public int damage; public GameObject target; public Vector3 startPosition; public Vector3 targetPosition; private float distance; private float startTime; private GameManagerBehavior gameManager; 

speed рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХреА speed рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ; рдирд╛рдо рд╕реЗ damage рд╕реНрдкрд╖реНрдЯ рд╣реИред

target , startPosition рдФрд░ targetPosition рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХреА рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

distance рдФрд░ startTime рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╡рд╣ рджреБрд╢реНрдорди рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ рддреЛ gameManager рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдкреБрд░рд╕реНрдХреГрдд рдХрд░рддрд╛ рд╣реИред

Start() рдореЗрдВ рдЗрди рдЪрд░реЛрдВ рдХреЗ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:

 startTime = Time.time; distance = Vector2.Distance (startPosition, targetPosition); GameObject gm = GameObject.Find("GameManager"); gameManager = gm.GetComponent<GameManagerBehavior>(); 

startTimeрд╣рдо рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд▓рдХреНрд╖реНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ GameManagerBehaviorред

рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Update()рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ :

 // 1 float timeInterval = Time.time - startTime; gameObject.transform.position = Vector3.Lerp(startPosition, targetPosition, timeInterval * speed / distance); // 2 if (gameObject.transform.position.Equals(targetPosition)) { if (target != null) { // 3 Transform healthBarTransform = target.transform.Find("HealthBar"); HealthBar healthBar = healthBarTransform.gameObject.GetComponent<HealthBar>(); healthBar.currentHealth -= Mathf.Max(damage, 0); // 4 if (healthBar.currentHealth <= 0) { Destroy(target); AudioSource audioSource = target.GetComponent<AudioSource>(); AudioSource.PlayClipAtPoint(audioSource.clip, transform.position); gameManager.Gold += 50; } } Destroy(gameObject); } 

  1. рд╣рдо рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, Vector3.Lerpрд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдкрджреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  2. рдпрджрд┐ рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ targetPosition, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИ targetред
  3. рд╣рдо HealthBarрд▓рдХреНрд╖реНрдп рдХреЗ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ damageрдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЗрд╕рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред
  4. рдпрджрд┐ рджреБрд╢реНрдорди рдХрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдкреБрд░рд╕реНрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдкрд░ рд▓реМрдЯреЗрдВред

рд╣рдо рдмрдбрд╝реЗ рдЧреЛрд▓реЗ рдмрдирд╛рддреЗ рд╣реИрдВ


рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рд░рд╛рдХреНрд╖рд╕ рдЙрдЪреНрдЪ рд╕реНрддрд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдЧреЛрд▓реЗ рдорд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдкреНрд░реАрдлреИрдм рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреИрдм рдкрд░ Bullet1

рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреАрдВрдЪреЗрдВ ред рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ - рд╣рдореЗрдВ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рджреЛ рдмрд╛рд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдирдХрд▓ Bullet1 ред рдмреБрд▓реЗрдЯ 2 рдФрд░ рдмреБрд▓реЗрдЯ 3 рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдирд╛рдо рджреЗрдВ ред рдмреБрд▓реЗрдЯ 2 рдЪреБрдиреЗрдВ ред рдореЗрдВ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ , рдХреНрд╖реЗрддреНрд░ рд╕реЗрдЯ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдШрдЯрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░рддрд┐рдкрд╛рджрдХ рдореВрд▓реНрдп рдЫрд╡рд┐рдпрд╛рдБ / рд╡рд╕реНрддреБрдУрдВ / Bullet2



ред рддреЛ рд╣рдо Bullet2 рдХреЛ Bullet1 рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдмрдирд╛рдПрдВрдЧреЗред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрд╣рд░рд╛рдПрдБ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Bullet3 рдкрд░ рдЫрд╡рд┐рдпрд╛рдБ рд╕рдВрдмрдВрдзрд┐рдд / рд╡рд╕реНрддреБрдУрдВ / Bullet3 ред рдмреБрд▓реЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░

рдореЗрдВ рдЖрдЧреЗ рд╣рдо рдЧреЛрд▓реЗ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреНрд╖рддрд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреИрдм рдореЗрдВ Prefab Bullet1 рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ ред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдЖрдк рджреЗрдЦ рдЧреЛрд▓реА рд╡реНрдпрд╡рд╣рд╛рд░ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╣реИ, рдЬреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдиреБрдХрд╕рд╛рди рдореВрд▓реНрдп 10 рдХреЗ рд▓рд┐рдП Bullet1 , 15 рдХреЗ рд▓рд┐рдП Bullet2 рдФрд░ 20 рдХреЗ рд▓рд┐рдП Bullet3

- рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдорд╛рди рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реЛред

рдиреЛрдЯ : рдореИрдВрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХреНрд╖рддрд┐ рдХреЗ рд▓рд┐рдП рдХреАрдордд рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рдПред рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред


рдкреНрд░реАрдлреИрдм рдХреЗ рдЧреЛрд▓реЗ - рдЖрдХрд╛рд░ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ

рдЧреЛрд▓реЗ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрджрд▓рдирд╛


рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреЛрд▓реЗ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдордЬрдмреВрдд рд░рд╛рдХреНрд╖рд╕ рддреЗрдЬреА рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдВред

IDE рдореЗрдВ MonsterData.cs рдЦреЛрд▓реЗрдВ рдФрд░ MonsterLevelрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :

 public GameObject bullet; public float fireRate; 

рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреЗ рдкреНрд░реАрдлреИрдм рдФрд░ рдЖрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рд░рд╛рдХреНрд╖рд╕ рд╕реЗрдЯрдЕрдк рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореЙрдиреНрд╕реНрдЯрд░ рдкреНрд░реАрдлрд╝реИрдм рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ ред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реНрддрд░ рдШрдЯрдХ рдореЗрдВ рджрд╛рдирд╡ рдбреЗрдЯрд╛ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ) ред рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреА рдЖрдЧ рджрд░ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ ред рдлрд┐рд░ рддрддреНрд╡ 0, 1, рдФрд░ 2 рдХреЗ рдмреБрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ Bullet1 , Bullet2 рдФрд░ Bullet3 рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ ред

рд░рд╛рдХреНрд╖рд╕ рдХрд╛ рд╕реНрддрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЧреЛрд▓реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВ? рд╣рд╛рдБ! рдЪрд▓реЛ рдЖрдЧ рдЦреЛрд▓реЛ!

рдЦреБрд▓реА рдЖрдЧ


OpenEnemy.cs рдХреЛ IDE рдореЗрдВ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 private float lastShotTime; private MonsterData monsterData; 

рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпреЗ рдЪрд░ рдЕрдВрддрд┐рдо рд░рд╛рдХреНрд╖рд╕ рд╢реЙрдЯ рдХреЗ рд╕рдордп рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рдВрд░рдЪрдирд╛ MonsterDataрдЬрд┐рд╕рдореЗрдВ рд░рд╛рдХреНрд╖рд╕ рдХреЗ рдЧреЛрд▓реЗ рдХреЗ рдкреНрд░рдХрд╛рд░, рдЖрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред

рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ Start():

 lastShotTime = Time.time; monsterData = gameObject.GetComponentInChildren<MonsterData>(); 

рдпрд╣рд╛рдВ рд╣рдо lastShotTimeрд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ MonsterDataрдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдШрдЯрдХ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ ред

рд╢реВрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 void Shoot(Collider2D target) { GameObject bulletPrefab = monsterData.CurrentLevel.bullet; // 1 Vector3 startPosition = gameObject.transform.position; Vector3 targetPosition = target.transform.position; startPosition.z = bulletPrefab.transform.position.z; targetPosition.z = bulletPrefab.transform.position.z; // 2 GameObject newBullet = (GameObject)Instantiate (bulletPrefab); newBullet.transform.position = startPosition; BulletBehavior bulletComp = newBullet.GetComponent<BulletBehavior>(); bulletComp.target = target.gameObject; bulletComp.startPosition = startPosition; bulletComp.targetPosition = targetPosition; // 3 Animator animator = monsterData.CurrentLevel.visualization.GetComponent<Animator>(); animator.SetTrigger("fireShot"); AudioSource audioSource = gameObject.GetComponent<AudioSource>(); audioSource.PlayOneShot(audioSource.clip); } 

  1. рд╣рдореЗрдВ рдмреБрд▓реЗрдЯ рдХреЗ рд╢реБрд░реБрдЖрддреА рдФрд░ рд▓рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВред Z рдХреЗ рдмрд░рд╛рдмрд░ рд╕реНрдерд┐рддрд┐ z рд╕реЗрдЯ рдХрд░реЗрдВ bulletPrefabред рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреА рдкреВрд░реНрд╡ рд╕реНрдерд┐рддрд┐ рдХреЛ z рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рдХреНрд╖реЗрдкреНрдп рд╢реВрдЯрд┐рдВрдЧ рд░рд╛рдХреНрд╖рд╕ рдХреЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдИ рджреЗ, рд▓реЗрдХрд┐рди рджреБрд╢реНрдордиреЛрдВ рд╕реЗ рдКрдкрд░ред
  2. рд╣рдо bulletPrefabрдЙрдкрдпреБрдХреНрдд рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдП рд╢реЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ MonsterLevelред рдЕрд╕рд╛рдЗрди startPositionрдФрд░ targetPositionрдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ред
  3. рд╣рдо рдЦреЗрд▓ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддреЗ рд╣реИрдВ: рдЬрдм рд░рд╛рдХреНрд╖рд╕ рдЧреЛрд▓реА рдорд╛рд░рддрд╛ рд╣реИ, рддреЛ рд╢реВрдЯрд┐рдВрдЧ рдХрд╛ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд▓реЗрдЬрд░ рдХреА рдЖрд╡рд╛рдЬрд╝ рдмрдЬрд╛рдПрдВред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдпрд╣ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд▓рдХреНрд╖реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рд░рд╛рдХреНрд╖рд╕ рдХреЛ рджреЗрдЦреЛред


ShootEnemy.cs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ ,Update() рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ :

 GameObject target = null; // 1 float minimalEnemyDistance = float.MaxValue; foreach (GameObject enemy in enemiesInRange) { float distanceToGoal = enemy.GetComponent<MoveEnemy>().DistanceToGoal(); if (distanceToGoal < minimalEnemyDistance) { target = enemy; minimalEnemyDistance = distanceToGoal; } } // 2 if (target != null) { if (Time.time - lastShotTime > monsterData.CurrentLevel.fireRate) { Shoot(target.GetComponent<Collider2D>()); lastShotTime = Time.time; } // 3 Vector3 direction = gameObject.transform.position - target.transform.position; gameObject.transform.rotation = Quaternion.AngleAxis( Mathf.Atan2 (direction.y, direction.x) * 180 / Mathf.PI, new Vector3 (0, 0, 1)); } 

рдЗрд╕ рдХреЛрдб рдЪрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

  1. рд░рд╛рдХреНрд╖рд╕ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рд╣рдо рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рджреВрд░реА рдкрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ minimalEnemyDistanceред рд╣рдо рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдЪрдХреНрд░ рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ рдФрд░ рджреБрд╢реНрдорди рдХреЛ рдПрдХ рдирдпрд╛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдХреБрдХреА рд╕реЗ рдЙрд╕рдХреА рджреВрд░реА рд╡рд░реНрддрдорд╛рди рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕реЗ рдХрдо рд╣реЛред
  2. рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ ShootрдХрд┐ рдЕрдЧрд░ рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп рд░рд╛рдХреНрд╖рд╕ рдХреА рдлрд╛рдпрд░рд┐рдВрдЧ рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ lastShotTimeрд╡рд░реНрддрдорд╛рди рд╕рдордп рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рд╣рдо рд░рд╛рдХреНрд╖рд╕ рдФрд░ рдЙрд╕рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рдмреАрдЪ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд░рд╛рдХреНрд╖рд╕ рдХреЛ рдЗрд╕ рдХреЛрдг рдкрд░ рдШреБрдорд╛рддреЗ рд╣реИрдВред рдЕрдм рд╡рд╣ рд╣рдореЗрд╢рд╛ рд▓рдХреНрд╖реНрдп рдХреЛ рджреЗрдЦреЗрдЧрд╛ред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдПрдХрддрд╛ рдореЗрдВ рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рд░рд╛рдХреНрд╖рд╕ рдХреБрдХреАрдЬрд╝ рдХреА рд╕рдЦреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред рд╣рдо рдЖрдЦрд┐рд░рдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

рдЖрдЧреЗ рдХрд╣рд╛рдБ рдЬрд╛рдирд╛ рд╣реИ


рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдпрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╣рдордиреЗ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЦреЗрд▓ рд╣реИред

рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:

  • рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рддреНрд░реБ рдФрд░ рд░рд╛рдХреНрд╖рд╕
  • рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдорд╛рд░реНрдЧ
  • рд╡рд┐рднрд┐рдиреНрди рдЦреЗрд▓ рд╕реНрддрд░

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

рдПрдХ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рд╣рд┐рдЯ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

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


All Articles