# Özel Varlık Oluşturma

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/Entity_Creating_Custom_Entities
- **Çeviri tarihi:** 2025-09-08

## Garry's Mod'da Özel Bir Varlık (Entity) Oluşturma

### Giriş

#### Varlıklar (Entity) Nedir?

Garry's Mod'da görüp dokunabildiğiniz neredeyse her şey bir [Varlık](https://gmod.tr/wiki/Entity)'tır (Entity). Oyun dünyasında bir konumu olan herhangi bir nesne bir Varlıktır. [Oyuncu](https://gmod.tr/wiki/Player) bir Varlıktır, proplar Varlıktır, hatta [Oyun Dünyası](https://gmod.tr/wiki/game.GetWorld)'nın kendisi bile özel ve benzersiz bir Varlıktır.

Varlıklar, nasıl göründükleri ve onlarla nasıl etkileşime girilebileceği gibi şeyleri kontrol edebilen, geliştirici tarafından tanımlanmış özel davranışlara sahip olabilirler. Varlıklar genellikle [Oyun Modlarının (Gamemode)](https://gmod.tr/wiki/Gamemode_Creation) ve [Eklentilerin (Addon)](https://gmod.tr/wiki/Addons) temel parçalarıdır.

#### Bir Varlığın Bileşenleri Nelerdir?

Varlıkların 3 [Alan](https://gmod.tr/wiki/States)'ın (Realm) hepsinde de özellikleri vardır:

- **Client (İstemci)** - Varlığın çizilmesi/görüntülenmesi.
- **Server (Sunucu)** - Varlığın davranışını ve etkileşimlerini kontrol etme.
- **Shared (Paylaşılan)** - Hem Sunucu hem de İstemci Alanları tarafından kullanılabilen yapılandırma ve özellikler.

Shared aslında bir Alan (Realm) değildir. Sadece hem İstemci'nin hem de Sunucu'nun Paylaşılan bir dosyada bulunan aynı kodu çalıştıracağı anlamına gelir.

### Kurulum

#### Dosya Konumu

Bir Varlığı oluşturan dosya(lar) ya bir Eklenti (Addon) ya da bir Oyun Modu (Gamemode) içine yerleştirilmelidir.

##### Eklenti Varlık Konumu

```lua
addons/
	├── my-addon-name/
    │	├── lua/
    │	│   ├── entities/
	│	│   │   └── ...
```

##### Oyun Modu Varlık Konumu

```lua
gamemodes/
	├── my-gamemode-name/
    │	├── entities/
    │	│   ├── entities/
	│	│   │   └── ...
```

#### Dosya Yapısı

Varlıklar şu yöntemlerden biri kullanılarak oluşturulabilir:

- Her biri bir Alan'ın (Realm) kodunu ve yapılandırmasını içeren 3 ayrı dosya.

  - Bu yaklaşım kod organizasyonuna yardımcı olur.
  - Bu dosyaları içeren klasörün adı (aşağıdaki örnekte `my-entity-name`), Varlığın [Sınıf Adı (Class Name)](https://gmod.tr/wiki/Entity:GetClass) olarak kullanılacaktır.
- Dosyalar şunlardır:

  - `cl_init.lua`

    - İstemci Alanı (Client Realm)
  - `init.lua`

    - Sunucu Alanı (Server Realm)
  - `shared.lua`

    - Paylaşılan Alan (Shared Realm)

```lua
entities/
   ├── my-entity-name/
   │   ├── cl_init.lua
   │   ├── init.lua
   │   └── shared.lua
```

- Her 3 Alan (Realm) için tüm kodu ve yapılandırmayı içeren 1 dosya.

  - Bu yaklaşım öncelikle basit varlıklar oluştururken kullanışlıdır.
- Dosyanın adı (aşağıdaki örnekte `my-entity-name`), Varlığın Sınıf Adı (Class Name) olarak kullanılacaktır.

```lua
entities/
   ├── my-entity-name.lua
```

### Bir Varlık Oluşturma

#### Ayrı Dosyalarla Bir Varlık Oluşturma

##### shared.lua örneği:

```lua
-- Varlığın türünü, temelini, yazdırılabilir adını ve yazarını paylaşılan erişim (hem sunucu hem de istemci) için tanımlar
ENT.Type = "anim" -- Varlık türünü 'anim' olarak ayarlar, bu da onun animasyonlu bir Varlık olduğunu gösterir.
ENT.Base = "base_gmodentity" -- Bu Varlığın 'base_gmodentity' tabanlı olduğunu ve onun işlevselliğini miras aldığını belirtir.
ENT.PrintName = "Test Varlığı" -- Oluşturma (spawn) menüsünde görünecek olan isim.
ENT.Author = "Adınız" -- Bu Varlığın yazarının adı.
ENT.Category = "Test Varlıkları" -- Bu Varlığın oluşturma menüsündeki kategorisi.
ENT.Contact = "STEAM_0:1:12345678" -- Bu Varlığın yazarının iletişim bilgileri.
ENT.Purpose = "Varlık oluşturmayı test etmek." -- Bu Varlığın amacı.
ENT.Spawnable = true -- Bu Varlığın oyuncular tarafından oluşturma menüsünde oluşturulup oluşturulamayacağını belirtir.
```

##### init.lua örneği:

```lua
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include("shared.lua")

-- Varlık için sunucu tarafı başlatma fonksiyonu
function ENT:Initialize()
    self:SetModel( "models/hunter/blocks/cube025x025x025.mdl" ) -- Varlık için modeli ayarlar.
    self:PhysicsInit( SOLID_VPHYSICS ) -- Varlık için fiziği başlatır, onu katı ve etkileşime girilebilir hale getirir.
    self:SetMoveType( MOVETYPE_VPHYSICS ) -- Varlığın nasıl hareket edeceğini fizik kullanarak ayarlar.
    self:SetSolid( SOLID_VPHYSICS ) -- Varlığı katı yaparak çarpışmalara izin verir.
    local phys = self:GetPhysicsObject() -- Varlığın fizik nesnesini alır.
    if phys:IsValid() then -- Fizik nesnesinin geçerli olup olmadığını kontrol eder.
        phys:Wake() -- Fizik nesnesini etkinleştirir, Varlığı fiziğe (yerçekimi, çarpışmalar, vb.) tabi kılar.
    end
end
```

##### cl_init.lua örneği:

```lua
include("shared.lua")

-- Varlık için istemci tarafı çizim fonksiyonu
function ENT:Draw()
    self:DrawModel() -- Varlığın modelini çizer. Bu fonksiyon her karede çağrılır.
end
```

#### Tek Bir Dosya ile Varlık Oluşturma

```lua
AddCSLuaFile()

-- Varlığın türünü, temelini, yazdırılabilir adını ve yazarını paylaşılan erişim (hem sunucu hem de istemci) için tanımlar
ENT.Type = "anim" -- Varlık türünü 'anim' olarak ayarlar, bu da onun animasyonlu bir Varlık olduğunu gösterir.
ENT.Base = "base_gmodentity" -- Bu Varlığın 'base_gmodentity' tabanlı olduğunu ve onun işlevselliğini miras aldığını belirtir.
ENT.PrintName = "Test Varlığı" -- Oluşturma (spawn) menüsünde görünecek olan isim.
ENT.Author = "Adınız" -- Bu Varlığın yazarının adı.
ENT.Category = "Test Varlıkları" -- Bu Varlığın oluşturma menüsündeki kategorisi.
ENT.Contact = "STEAM_0:1:12345678" -- Bu Varlığın yazarının iletişim bilgileri.
ENT.Purpose = "Varlık oluşturmayı test etmek." -- Bu Varlığın amacı.
ENT.Spawnable = true -- Bu Varlığın oyuncular tarafından oluşturma menüsünde oluşturulup oluşturulamayacağını belirtir.

-- Bu, hem İstemci hem de Sunucu alanlarında çağrılacaktır
function ENT:Initialize()
	-- Sunucu alanı için olan kodun yanlışlıkla İstemci üzerinde çalışmadığından emin olun
	if SERVER then
	    self:SetModel( "models/hunter/blocks/cube025x025x025.mdl" ) -- Varlık için modeli ayarlar.
	    self:PhysicsInit( SOLID_VPHYSICS ) -- Varlık için fiziği başlatır, onu katı ve etkileşime girilebilir hale getirir.
	    self:SetMoveType( MOVETYPE_VPHYSICS ) -- Varlığın nasıl hareket edeceğini fizik kullanarak ayarlar.
	    self:SetSolid( SOLID_VPHYSICS ) -- Varlığı katı yaparak çarpışmalara izin verir.
	    local phys = self:GetPhysicsObject() -- Varlığın fizik nesnesini alır.
	    if phys:IsValid() then -- Fizik nesnesinin geçerli olup olmadığını kontrol eder.
	        phys:Wake() -- Fizik nesnesini etkinleştirir, Varlığı fiziğe (yerçekimi, çarpışmalar, vb.) tabi kılar.
	    end
	end
end

-- Bu, bu satırın altındaki hiçbir şeyin Sunucu'da çalıştırılmamasını sağlamak için yaygın bir tekniktir
if not CLIENT then return end

-- Varlık için istemci tarafı çizim fonksiyonu
function ENT:Draw()
    self:DrawModel() -- Varlığın modelini çizer. Bu fonksiyon her karede çağrılır.
end
```

Bunlardan herhangi birinin ne işe yaradığından emin değil misiniz? Öğrenmek için mavi renkli [fonksiyonlara](https://gmod.tr/wiki/Global.AddCSLuaFile)() tıklamaktan çekinmeyin.

[ENTITY:Initialize](https://gmod.tr/wiki/ENTITY:Initialize)() ve [ENTITY:Draw](https://gmod.tr/wiki/ENTITY:Draw)(), [Hook](https://gmod.tr/wiki/ENTITY_Hooks) olarak kabul edilir. Yukarıdaki örneklerde bunlar tıklanabilir değildir, ancak bu sayfanın sol üst köşesine `is:event` (iki boşluk) yazarak hook'ları arayabilirsiniz.

Bu Hook'lar oyun tarafından her çağrıldığında, Varlığınız onlar için tanımladığınız kodu çalıştırır. Varlığınızın nesne sınıfını kaydetmek için burada [ENT](https://gmod.tr/wiki/Structures/ENT) olarak yazılırlar.

### Sonuçlar

Varlığı ister tek bir dosyayla ister birkaç dosyayla oluşturmuş olun, nihai sonuç aynı olmalıdır.

##### Oluşturma menüsündeki Varlık

![](https://gmod.tr/api/uploads/wiki/7af705596e082c9f08dd.png)

##### Varlığın kendisi

![](https://gmod.tr/api/uploads/wiki/4e0c5fbd1e473d786e4e.png)

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/Entity_Creating_Custom_Entities
