กำลังมองหาข้อมูลเชิงลึกเกี่ยวกับการออกแบบการเขียนโปรแกรมสำหรับการโจมตีและการโจมตีประเภทในเกม


14

ดังนั้นฉันจึงเริ่มแนะนำการโจมตี RTS พื้นที่ 2 มิติของเรา (นี่คือ Unity ดังนั้นจึงเป็นองค์ประกอบขับเคลื่อน) ตอนแรกมันง่ายเหมือน "ศัตรูในระยะความเสียหายที่ใช้" อย่างไรก็ตามจะมี "ประเภท" อาวุธ / การโจมตีหลายอย่างที่เกี่ยวข้องกับเรือหรือโครงสร้างเฉพาะของพวกเขา เช่นเดียวกับปัจจัยอื่น ๆ ที่เกี่ยวข้องกับอดีตที่ผ่านมาเพียงแค่ความเสียหายดิบเช่นประเภทความเสียหายและอาจเป็นแรงเฉื่อยในอนาคต

พวกคุณมีแต่ละหน่วยและประเภทโครงสร้างหรือไม่มีประเภทการโจมตีของตัวเอง หมายความว่าคุณสร้างสคริปต์สำหรับแต่ละหน่วย / โครงสร้างที่กำหนดประเภทของการโจมตีความเสียหายเอฟเฟกต์ช่วงอนุภาคสไปรต์ ... ฯลฯ และแนบเป็นส่วนประกอบหรือไม่

หรือสร้างสคริปต์ที่กำหนดประเภทการโจมตีสคริปต์สำหรับโปรเจ็กต์โปรเจ็กต์ที่เชื่อมโยงกับที่ ... ฯลฯ จากนั้นขยายและแก้ไขสคริปต์สำหรับแต่ละยูนิตแนบแต่ละสคริปต์เข้ากับหน่วย / โครงสร้าง


ฉันหวังว่าฉันจะเข้าใจบ้างฉันได้ไตร่ตรองสิ่งนี้มานานแล้วฉันไม่แน่ใจว่าฉันจะแก้ปัญหาหรือทำปัญหาของตัวเองและขุดตัวเองเป็นหลุม

เมื่อคุณมีเกมที่สามารถโจมตีได้หลากหลายประเภทที่อาจหรือไม่ จำกัด เฉพาะหน่วย / โครงสร้างคุณออกแบบเฟรมเวิร์กที่เชื่อมโยงเข้าด้วยกันกับหน่วย / โครงสร้างเฉพาะในสภาพแวดล้อมการออกแบบที่ขับเคลื่อนด้วยส่วนประกอบได้อย่างไร ?

หากยังไม่ชัดเจนพอบอกให้ฉันรู้

แก้ไข: คำตอบที่ดีขอบคุณ

คำถามเพิ่มเติม:

คำตอบดูเหมือนจะแตกต่างจาก "แต่ละวัตถุสามารถมีสคริปต์โจมตีของตัวเอง" เป็น "มีประเภทการโจมตีเป็นสคริปต์ของตนเองและกำหนดให้กับแต่ละวัตถุสำหรับโซลูชันที่ใช้ซ้ำได้มากกว่า" ให้บอกว่าฉันมีการโจมตี "ประลัย" มันยิงกระสุนสีแดงด้วยความเร็วที่แน่นอน ความเสียหายอัตราการยิงและขนาดกระสุนปืนขึ้นอยู่กับหน่วยยิง มันจะดีกว่าเพียงแค่สร้างสคริปต์การโจมตีสำหรับหน่วยนั้นหรือลองและแก้ไข "การโจมตี Blaster" เพื่อให้เหมาะกับวัตถุประสงค์ของแต่ละหน่วยที่ต้องการใช้หรือไม่


1
สำหรับแนวคิดการเขียนโปรแกรมเกมทั่วไปฉันต้องการอ้างถึงข้อมูลจำเพาะเต็มรูปแบบของ RPG FFV - gamefaqs.com/snes/588331-final-fantasy-v/faqs/30040
Code Whisperer

คำตอบ:


12

ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้ แต่ฉันคิดว่ามันขึ้นอยู่กับความซับซ้อนและหลากหลายที่คุณคิดว่าการโจมตีจะเกิดขึ้น เนื่องจากมันเป็น RTS ฉันเดาว่าคุณอาจมี 10-50 หน่วยหรือโครงสร้างที่แตกต่างกันสำหรับประเภทการโจมตีของตัวเอง

ตัวเลือกที่ 1: หากมีจำนวนหน่วยที่ค่อนข้างต่ำที่จะมีการโจมตีที่ค่อนข้างคล้ายกันฉันจะใส่ทุกอย่างไว้ในสคริปต์ตัวใหญ่และกำหนดพารามิเตอร์ที่ใช้ในการตรวจสอบ

ตัวเลือกที่ 2: ในทางกลับกันหากคุณมองเห็นประเภทการโจมตีจำนวนมากที่มีพฤติกรรมที่แตกต่างกันคุณสามารถทำลายทุกอย่างเพื่อให้แต่ละหน่วยและสิ่งปลูกสร้างได้รับสคริปต์การโจมตีที่เป็นเอกลักษณ์ของตัวเอง ฉันคิดว่าถ้าคุณทำเช่นนี้คุณอาจต้องการสร้างสคริปต์ "ตัวช่วย" ที่กำหนดโค้ดที่ใช้กันทั่วไปซึ่งสคริปต์แต่ละตัวสามารถหยิบได้ วิธีนี้คุณจะไม่ต้องเขียนทุกอย่างใหม่และคุณจะรู้ว่ามันอยู่ที่ไหน

ตัวเลือกที่ 3: สิ่งที่คุณไม่ควรทำคือมีบางกลุ่มของหน่วยที่แชร์สคริปต์ซึ่งอาจทำให้คุณสับสนและจะสับสนหากรหัสที่คุณต้องการสำหรับการโจมตีนั้นอยู่ใน 10 สคริปต์ที่แตกต่างกัน

ที่นี่ฉันวาดรูปให้คุณ

ป้อนคำอธิบายรูปภาพที่นี่


2
ขอบคุณมากสำหรับคำตอบ ฉันมีเหตุผลบางอย่างที่เริ่มเอนตัวไปที่ตัวเลือกที่ 3 และฉันก็มีเวลายากที่จะหาวิธีที่จะพิสูจน์ได้ ฉันอาจจะไปเส้นทางที่ 2 แต่ละหน่วยจะได้รับสคริปต์โจมตีที่กำหนดเองโดยมีรหัสทั่วไปที่แชร์โดยให้รหัสทั่วไปถูกโจมตีเป็นส่วนประกอบของแต่ละหน่วย / สิ่งปลูกสร้าง ฉันไม่แน่ใจว่าจะไปไหนกับขบวนความคิดที่นำฉันไปสู่ทางเลือกที่ 3 ขอบคุณ ฉันจะออกจากที่เปิดนี้จนกว่าฉันจะได้รับใน AM ในกรณีที่มีโปสเตอร์อื่น ๆ ที่ต้องการพูดสอดใน
ดักลาส Gaskell

ไม่มีปัญหาไม่ใช่คำตอบที่ชัดเจน แต่หวังว่ามันจะช่วยได้
เมียร์

1
คุณสามารถผสม 1 และ 2 โดยใส่การโจมตีที่คล้ายกันในหนึ่งสคริปต์ใหญ่และแยกการโจมตีที่แตกต่างกัน
ratchet freak

4
ฉันประหลาดใจ # 3 แนะนำต่อ? จุดรวมของคลาสแบบแยกส่วน / ทั่วไปไม่หรือไม่เพื่อให้แต่ละหน่วยไม่จำเป็นต้องกำหนดประเภทของตนเอง หากเกมเป็น RTS และ Siege damage (โดยปกติคือ "long range") เป็นประเภทดาเมจคุณจะต้องกำหนดหนึ่งครั้งและมีหน่วยสไตล์ปืนใหญ่หลายแบบอ้างถึงเมื่อทำการ calcs ดาเมจของพวกเขาดังนั้นหาก Siege ดาเมจเสียหาย เคยจำเป็นต้องได้รับการปรับให้สมดุล (ปรับสมดุล) คุณจะต้องอัปเดตหนึ่งคลาสหรือไม่
HC_

1
"Here, I drew you a picture."ทำให้ฉันนึกถึงสิ่งนี้
FreeAsInBeer

4

ฉันไม่รู้อะไรมากมายเกี่ยวกับ Unity และฉันยังไม่ได้พัฒนาเกมซักพักดังนั้นให้ฉันตอบคำถามทั่วไปเกี่ยวกับการเขียนโปรแกรมให้คุณ ฉันใช้คำตอบตามความรู้ที่ฉันมีเกี่ยวกับระบบเอนทิตีส่วนประกอบโดยทั่วไปเอนทิตีคือตัวเลขที่เกี่ยวข้องกับ N หลายองค์ประกอบส่วนประกอบประกอบด้วยข้อมูลเท่านั้นและระบบทำงานบนชุดของส่วนประกอบที่เชื่อมโยงกับ นิติบุคคลเดียวกัน

พื้นที่ปัญหาของคุณคือ:

  • มีหลายวิธีในการโจมตีศัตรูในเกมโดยรวม
  • เรือแต่ละลำโครงสร้าง ฯลฯ อาจมีหลายวิธีในการโจมตี (แต่ละลำพิจารณาจากบางลักษณะ)
  • การโจมตีแต่ละครั้งอาจมีผลกระทบของอนุภาคของตัวเอง
  • การโจมตีจะต้องคำนึงถึงปัจจัยบางอย่าง (เช่นความเฉื่อยหรือเกราะเป็นต้น) ที่มีอยู่ในเป้าหมายและต่อผู้ใช้

ฉันจะจัดโครงสร้างโซลูชันดังต่อไปนี้:

  • การโจมตีมีตัวระบุซึ่งอาจเป็นสตริง
  • เอนทิตี 'รู้' ว่าสามารถใช้การโจมตีได้ (ขึ้นอยู่กับตัวระบุของการโจมตี)
  • เมื่อการโจมตีถูกใช้โดยเอนทิตีองค์ประกอบการแสดงผลที่สอดคล้องกันจะถูกเพิ่มเข้าไปในที่เกิดเหตุ
  • คุณมีตรรกะบางอย่างที่รู้เกี่ยวกับเป้าหมายของการโจมตีผู้โจมตีและการโจมตีที่ใช้ - ตรรกะนี้จะตัดสินความเสียหายที่คุณทำ (และสามารถเข้าถึงความเฉื่อยหรือสิ่งใด ๆ ของทั้งสองหน่วยงาน)

เป็นสิ่งสำคัญที่จุดติดต่อระหว่างการโจมตีและเอนทิตีจะบางที่สุดเท่าที่จะเป็นไปได้ - สิ่งนี้จะทำให้โค้ดของคุณสามารถนำมาใช้ซ้ำได้และป้องกันไม่ให้คุณต้องสร้างโค้ดซ้ำสำหรับเอนทิตีแต่ละประเภทที่ใช้การโจมตีประเภทเดียวกัน . กล่าวอีกนัยหนึ่งคือโค้ดหลอก JavaScript บางส่วนเพื่อให้แนวคิดแก่คุณ

// components
var bulletStrength = { strength: 50 };
var inertia = { inertia: 100 };
var target = { entityId: 0 };
var bullets = {};
var entity = entityManager.create([bulletStrength, inertia, target, bullets]);

var bulletSystem = function() {
  this.update = function(deltaTime, entityId) {
    var bulletStrength = this.getComponentForEntity('bulletStrength', entityId);
    var targetComponent = this.getComponentForEntity('target', entityId);
    // you may instead elect to have the target object contain properties for the target, rather than expose the entity id
    var target = this.getComponentForEntity('inertia', targetComponent.entityId);

    // do some calculations based on the target and the bullet strength to determine what damage to deal
    target.health -= ....;
  }
};

register(bulletSystem).for(entities.with(['bullets']));

ขออภัยคำตอบนี้ค่อนข้าง 'น้ำ' ฉันพักทานอาหารกลางวันครึ่งชั่วโมงเท่านั้นและมันก็ยากที่จะคิดอะไรบางอย่างโดยไม่รู้เรื่อง Unity :(


3

เมื่อหน่วย / โครงสร้าง / อาวุธโจมตีฉันอาจจะสร้างการโจมตี (ซับคลาสด้วยรายละเอียดความสนุกทั้งหมดของคุณ) ที่นำผู้โจมตีและผู้พิทักษ์ (หรือผู้พิทักษ์) การโจมตีนั้นสามารถโต้ตอบกับเป้าหมาย / ผู้พิทักษ์ (ช้าพิษความเสียหายเปลี่ยนสถานะ) ดึงตัวเอง (ลำแสงรังสีกระสุน) และกำจัดตัวเองเมื่อเสร็จสิ้น ฉันสามารถคาดการณ์ปัญหาบางอย่างเช่นการโจมตีด้วยพิษหลายครั้งดังนั้นเป้าหมายของคุณอาจใช้อินเทอร์เฟซที่มีความเสียหายที่การโจมตีโต้ตอบด้วย แต่ฉันคิดว่ามันเป็นวิธีการที่ใช้การได้ซึ่งสามารถแยกได้และยืดหยุ่น

Expanded Answer
นี่คือวิธีที่ฉันจะเข้าโจมตี Blaster ด้วยวิธีนี้ ฉันจะให้คนอื่นตอบเอง

ฉันจะให้หน่วยของฉันใช้อินเทอร์เฟซ IAttacker หรือคลาสที่มีสถิติ / วิธีการโจมตีพื้นฐาน เมื่อ IAttacker โจมตี IDamageable มันจะสร้างการโจมตีเฉพาะผ่านตัวมันเองและเป้าหมาย (IAttacker และ IDamageable หรือบางทีอาจเป็นชุดของ IDamageables) การโจมตีคว้าสถิติที่ต้องการจาก IAttacker (เพื่อหลีกเลี่ยงการเปลี่ยนแปลงในระหว่างการอัพเกรดหรืออะไรทำนองนั้น - เราไม่ต้องการให้ Attack เปลี่ยนสถานะหลังจากที่เปิดตัวไปแล้ว) และถ้าต้องการสถิติพิเศษปลด IAttacker ไป ประเภทที่ต้องการ (เช่น IBlasterAttacker) และได้รับสถิติพิเศษในแบบนั้น

ด้วยวิธีการนี้ BlasterAttacker เพียงต้องการสร้าง BlasterAttack และ BlasterAttack ดูแลส่วนที่เหลือ คุณสามารถ subclass BlasterAttack หรือสร้าง FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker แยกต่างหาก ฯลฯ และรหัสโจมตีสำหรับแต่ละตัวจะเหมือนกัน .


โดยพื้นฐานแล้วหน่วยสืบทอดมาจากอินเตอร์เฟส IAttacker (ฉันมีสิ่งนี้อยู่แล้ว) และมีอินเทอร์เฟซ IDamageable สำหรับ "ศัตรู" (มีสิ่งนี้เช่นกัน) เมื่อผู้โจมตีโจมตี BlasterAttack (หรือคลาสที่ได้รับ) จะถูกเรียก "การโจมตี" นี้จะดึงข้อมูลที่ต้องการจาก IAttacker และใช้กับ IDamageable เมื่อกระสุนปืนกระทบหรือไม่ กระสุนปืนนั้นมีคลาส BlasterAttack อยู่แล้วดังนั้นเมื่อมันถูกยิงมันจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงของ IAttacker อีกต่อไปและสามารถใช้มันเป็นความเสียหาย / เอฟเฟกต์บน IDamageable ต่อเมื่อกระสุนจริงกระทบ
Douglas Gaskell

เมื่อคุณพูดว่า "BlasterAttack (หรือคลาสที่ได้รับ)" ฉันจะบอกว่ามีการสร้าง BlasterAttack อินสแตนซ์ที่สร้างขึ้นใหม่ของ BlasterAttack นี้แทนลำแสง (หรือกระสุนหรือรังสีหรืออะไรก็ตาม) ดังนั้นจึงเป็นกระสุน BlasterAttack คัดลอกสถิติใด ๆ ก็ตามที่มันต้องการจากวัตถุ IAttacker และ IDamageable: ตำแหน่ง, สถิติของผู้โจมตี ฯลฯ BlasterAttack จะติดตามตำแหน่งของตัวเองและหากมีความเสียหายจะใช้กับ "การติดต่อ" คุณจะต้องคิดออกว่าจะทำอย่างไรหากพลาดหรือไปถึงปลายทาง (ตำแหน่งเดิมของเป้าหมาย) เผาพื้นหรือไม่ หายไป? การโทรของคุณ
ricksmt

สำหรับการโจมตีแบบพื้นที่ - เอฟเฟกต์คุณอาจต้องการเข้าถึงคอลเลกชันระดับโลกของ (ศัตรู) ตั้งแต่ใครอยู่ในระยะและผู้ที่อยู่นอกระยะสามารถเปลี่ยนระหว่างไฟและผลกระทบ แน่นอนว่าอาจมีการโต้แย้งที่คล้ายกันสำหรับ BlasterAttack: คุณพลาดเป้าหมายแรกของคุณ แต่ไปโจมตีผู้ชายข้างหลังเขา ข้อกังวลเดียวของฉันคือคุณสามารถมีการโจมตีจำนวนมากวนซ้ำผ่านศัตรูจำนวนมากที่พยายามคิดออกว่าพวกเขาตีอะไรหรือไม่ นั่นเป็นเรื่องของประสิทธิภาพ
ricksmt

อ่านั่นสมเหตุสมผลแล้ว สำหรับการโจมตีที่ไม่ได้รับกระสุนจะมีช่วง / อายุการใช้งานที่กำหนดไว้ล่วงหน้า ถ้ามันกระทบอย่างอื่นก่อนสิ้นอายุขัยมันจะได้รับการอ้างอิงถึงวัตถุใด ๆ ที่เป็นเจ้าของแท่นขุดเจาะที่มันชนกับและความเสียหายจะถูกนำไปใช้ในลักษณะนั้น ที่จริงแล้วมันเป็นวิธีที่ขีปนาวุธทั้งหมดจะทำงานพวกเขาไม่รู้ว่า "อะไร" พวกเขากำลังเดินทางไปทางเพียงแค่ว่าพวกเขากำลังเดินทาง เอฟเฟกต์ AEO สามารถเปิดใช้งานสเฟียร์ collider กับปลายทางและรับวัตถุทั้งหมดที่อยู่ภายใน ขอบคุณสำหรับความช่วยเหลือ
Douglas Gaskell

ไม่มีปัญหา. ดีใจที่ได้ ลืมว่า Unity ทำให้ทุกอย่างง่ายขึ้น
ricksmt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.