‫สวัสดีและยินดีต้อนรับกลับ
‫ตอนนี้ เรามีการเคลื่อนไหวสำหรับ -- แต่เราไม่ได้หมุนส่วนบนของ -- ซึ่งเราเรียกว่าป้อมปืน
‫ดังนั้นเราจึงต้องการที่จะสามารถทำได้โดยใช้เมาส์ของเรา
‫ทีนี้มาดูว่าเกิดอะไรขึ้นที่นี่
‫ขณะที่ฉันเลื่อนเคอร์เซอร์ของเมาส์ไปทั่วโลก ฉันได้ทรงกลมสีแดงนี้
‫นี่คือ Debug Sphere ที่ฉันกำลังวาดในพื้นที่ 3 มิติ
‫สังเกตตอนที่ฉันเคลื่อนตัวขึ้นไปชิดกับกำแพง ทรงกลมนั้นเคลื่อนตัวไปกับพื้นผิวของผนัง
‫ดังนั้นไม่ว่าเคอร์เซอร์ของเมาส์จะเคลื่อนที่ไปที่ใด ฉันก็จะได้รับความกลัวที่สอดคล้องกับวัตถุใดๆ
‫ก็ตามที่ฉันตีตามตำแหน่งเคอร์เซอร์ของฉัน
‫และนี่จะเป็นประโยชน์สำหรับเรา เพื่อให้เราสามารถมีตำแหน่งในอวกาศที่เราสามารถหมุนป้อมปืนของเราไปทางนั้นได้
‫ในการดำเนินการนี้ มีฟังก์ชันบางอย่างที่เราต้องการบนคอนโทรลเลอร์ ดังนั้นเราจึงต้องเข้าถึงฟังก์ชันเหล่านั้นบนคอนโทรลเลอร์
‫และในวิดีโอนี้ เราจะดำเนินการตั้งค่านั้น และเราจะหารือกันว่าจะเกี่ยวข้องกับแนวคิดที่เรียกว่าการแคสต์อย่างไร
‫เหตุผลที่เราต้องการคอนโทรลเลอร์ก็เพราะมีฟังก์ชันบนคอนโทรลเลอร์ที่ช่วยให้เราได้รับผลการตีภายใต้เคอร์เซอร์
‫ตอนนี้เรากำลังพูดถึงเคอร์เซอร์ของเมาส์
‫สมมติว่านี่คือหน้าจอของเรา และนี่คือเคอร์เซอร์ของเมาส์
‫และจุดที่ปลายเคอร์เซอร์ตรงกับตำแหน่งบนหน้าจอ
‫ตอนนี้ถ้าเราเลื่อนเคอร์เซอร์ไปรอบๆ เป้าหมายของเราคือส่วนป้อมปืนของรถถัง
‫ส่วนบนของตาข่ายจะหมุนเพื่อให้มันหันไปทางเคอร์เซอร์นั้น
‫ตอนนี้ ถ้าเราย้ายเคอร์เซอร์ไปรอบๆ จะมีฟังก์ชันบนคอนโทรลเลอร์ที่เราสามารถใช้เพื่อรับตำแหน่งที่สอดคล้องกับเคอร์เซอร์นั้น
‫ถ้าเราลากเส้นตรงจากกล้องไปที่เคอร์เซอร์แล้วชนวัตถุบางอย่างในโลก
‫เราจะได้ตำแหน่งนั้นและใช้ตำแหน่งนั้นเพื่อกำหนดการหมุนของป้อมปืนรถถัง
‫ให้ฉันแสดงให้คุณเห็นว่าฉันหมายถึงอะไร
‫ตอนนี้ เพื่อให้ได้ตำแหน่งที่ตรงกับเคอร์เซอร์ของเรา เราจำเป็นต้องใช้คอนโทรลเลอร์
‫ตอนนี้ เรามาพูดถึงตัวควบคุมกันสักครู่
‫สมมติว่าเรามีเบี้ยของเราในโลก
‫จำนำจะมีตัวควบคุม
‫นี่คือวัตถุที่มองไม่เห็นที่เกี่ยวข้องกับการจำนำ
‫ตอนนี้ สำหรับผู้จำนำของเรา ผู้ควบคุมของเราจะมีตัวควบคุมผู้เล่นประเภท
‫A และในตอนต้นของเกม ผู้ควบคุมจะมีตัวจำนำ
‫นี่คือเหตุผลที่เราสามารถเห็นได้จากมุมมองของกล้องที่เป็นของถังรับจำนำของเรา
‫ตอนนี้เราสามารถเข้าถึงตัวควบคุมนี้ได้
‫คลาสรถถังของเราสืบทอดฟังก์ชันที่เรียกว่า Get Controller
‫มันสืบทอดมาจากคลาส --
‫สิ่งที่เราอยากทำคือจับคอนโทรลเลอร์นั้นไว้และเก็บไว้ในตัวแปร เพื่อที่เราจะสามารถใช้มันเพื่อเข้าถึงฟังก์ชันที่เราต้องการเพื่อให้ได้ผลลัพธ์ของ
‫Hit ใต้เคอร์เซอร์
‫เรามาตั้งค่าตัวกันเพื่อสิ่งนั้นกันเถอะ
‫ตอนนี้ฉันอยู่ในคลาสรถถัง และสถานที่ที่เราจำเป็นต้องเข้าถึงตัวควบคุมของเราคือการเริ่มเล่น
‫หากเราทำใน Constructor นั่นยังเร็วเกินไปและเราอาจยังไม่มีตัวควบคุมที่ถูกต้อง
‫ดังนั้น เราจำเป็นต้องมีฟังก์ชันเริ่มเล่นในคลาสรถถัง
‫ตอนนี้เรามีมันที่นี่ในคลาสเบสปิงปอง และจนถึงตอนนี้ เรายังไม่ได้ใช้ Begin play ในคลาสเบสปิงปองจริงๆ
‫สิ่งที่ฉันอยากจะทำคือย้ายมันไปที่ระดับรถถัง
‫ดังนั้นฉันจะเน้นที่เริ่มเล่น รวมถึงความคิดเห็นและส่วนที่ได้รับการคุ้มครองที่นี่ และฉันจะตัดมันทิ้งไป
‫แล้วกลับมาที่แทงค์ ฉันจะแปะมัน
‫มาเพิ่มส่วนที่ได้รับการป้องกันไว้ที่นี่ที่ด้านบนส่วนส่วนตัวพร้อมเริ่มเล่นข้างในกัน
‫ตอนนี้เราได้นำ Begin Play ออกจากฐานจำนำแล้ว
‫เราไม่มีมันที่นี่แล้ว แต่เราต้องลบมันออกจากบ่อฐาน cpp ด้วย
‫นี่มัน.
‫เราสามารถดำเนินการต่อและลบมันได้ที่นี่ และตอนนี้เราได้ประกาศใน Tank H แล้ว แต่เราจำเป็นต้องกำหนดในถัง
‫CPP ด้วย
‫ดังนั้นฉันจะกำหนดฟังก์ชันภายใต้การตั้งค่าองค์ประกอบอินพุตของผู้เล่น
‫ดังนั้นมันจะเป็นโมฆะ เริ่มเล่นโดยไม่มีพารามิเตอร์ป้อนเข้า
‫มีตัวฟังก์ชั่นและเราจำเป็นต้องมีถังก่อนแก้ไขชื่อฟังก์ชั่น
‫ตอนนี้เรารู้แล้วว่าการเรียกตัวเองว่ายิ่งใหญ่เป็นเรื่องสำคัญ
‫ด้วยวิธีนี้ฟังก์ชันใด ๆ ในฟังก์ชันเริ่มเล่นและคลาสพาเรนต์ใด ๆ จะยังคงถูกเรียก
‫เรามาเริ่มเล่นกันเลยดีกว่า
‫นี่คือที่ที่เราสามารถรับคอนโทรลเลอร์ของเราและเก็บไว้ในตัวแปรได้
‫กลับไปที่ Tank H และสร้างตัวแปร
‫ตอนนี้นี่จะเป็นแบบส่วนตัวและฉันจะติดไว้ที่ด้านล่างของส่วนส่วนตัวและมันจะเป็นประเภทตัวชี้ตัวควบคุมผู้เล่นและเราสามารถเรียกผู้อ้างอิงตัวควบคุมเครื่องเล่นนี้
‫นี่จะเป็นข้อมูลอ้างอิงของเราไปยังตัวควบคุมผู้เล่น
‫ตอนนี้เราไม่ได้พูดถึงการอ้างอิง C++
‫นี่ยังเป็นเพียงตัวชี้เท่านั้น แต่เราจะใช้สิ่งนี้เพื่ออ้างถึงตัวควบคุมของผู้เล่น
‫ตอนนี้เรามีตัวแปรอ้างอิงตัวควบคุมผู้เล่นที่เป็นตัวควบคุมผู้เล่นประเภท A และเราพร้อมที่จะเก็บตัวควบคุมไว้ในตัวชี้นี้
‫กลับไปที่ Tank Dot CP ที่นี่และเริ่มเล่นและลองทำสิ่งนี้
‫ดังนั้น.
‫สิ่งที่ฉันจะทำคือบอกว่าผู้เล่น ผู้ควบคุม ผู้อ้างอิงเท่ากับ และฉันจะพยายามเรียก get controller
‫ตอนนี้รับคอนโทรลเลอร์ตามที่ฉันพูดถึงว่าอยู่ในคลาส --
‫ให้คลิกขวาและไปที่คำจำกัดความและสังเกตว่าฟังก์ชันนี้ส่งคืนคอนโทรลเลอร์ A
‫ตอนนี้ตัวแปรของเราเป็นตัวควบคุมผู้เล่นประเภท A ไม่ใช่ตัวควบคุม
‫สิ่งที่เราพยายามจะทำในที่นี้คือ นำค่าที่ส่งคืนมาจาก get controller ซึ่งเป็นประเภทพอยน์เตอร์ของคอนโทรลเลอร์
‫และเรากำลังพยายามเก็บไว้ในตัวชี้คอนโทรลเลอร์ของเครื่องเล่น A
‫สังเกตว่าเราเห็นสีแดงขมุกขมัวที่นี่
‫มันบอกค่าของประเภท
‫ไม่สามารถกำหนดตัวชี้คอนโทรลเลอร์ให้กับเอนทิตีประเภทได้
‫ตัวควบคุมผู้เล่น
‫เราได้รับข้อผิดพลาด
‫มาดูเอกสารประกอบสำหรับคอนโทรลเลอร์กัน
‫ลองดูสิ.
‫นี่คือตัวควบคุม
‫และมันบอกว่ามรดก ลำดับชั้น
‫และด้านล่างตัวควบคุม เราจะเห็นตัวควบคุมและตัวควบคุมของผู้เล่น
‫ซึ่งหมายความว่าตัวควบคุมผู้เล่นเป็นคลาสย่อยของตัวควบคุม
‫ตอนนี้ใน C ++ เราไม่สามารถมีตัวชี้ประเภทได้
‫ตัวควบคุมผู้เล่นเก็บค่าที่อยู่ของตัวควบคุม A
‫คอนโทรลเลอร์เป็นประเภทพาเรนต์
‫ตัวควบคุมผู้เล่นเป็นประเภทย่อย
‫คุณไม่สามารถใช้วัตถุประเภทหลักและเก็บไว้ในตัวชี้ประเภทลูก
‫แล้วเราจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร?
‫นี่คือปัญหาของเรา
‫ฟังก์ชัน get controller ส่งคืนที่อยู่ของคอนโทรลเลอร์ A
‫นี่คือสิ่งที่เราสามารถเก็บไว้ในตัวชี้ตัวควบคุม A แต่เราไม่สามารถเก็บไว้ในตัวชี้ตัวควบคุมเครื่องเล่น
‫A
‫ที่ตลกก็คือ แม้ว่า วัตถุที่ส่งคืนโดย get controller นั้นอันที่จริงแล้วเป็นตัวควบคุมของผู้เล่น
‫ดังนั้นเราจึงมีที่อยู่นี้ในรูปแบบของตัวชี้ตัวควบคุม A และเรารู้ว่ามันเก็บตัวควบคุมของผู้เล่น แต่ถ้าเรามีมันในรูปแบบของตัวควบคุม
‫A เราไม่สามารถเข้าถึงฟังก์ชั่นที่เราต้องการได้เพราะมันมีอยู่ในตัวควบคุมของเครื่องเล่น
‫.
‫ฟังก์ชันนี้เรียกว่า get hit result ภายใต้เคอร์เซอร์
‫ตอนนี้ ถ้าเรามีค่าพอยน์เตอร์คอนโทรลเลอร์ชนิด A และเราพยายามรับฟังก์ชันนั้นที่มีอยู่ในคอนโทรลเลอร์ของผู้เล่น
‫เราจะล้มเหลวในการทำเช่นนั้น
‫เราจะได้รับข้อผิดพลาดในการรวบรวม
‫เนื่องจากเรารู้ว่าวัตถุนั้นเป็นตัวควบคุมของผู้เล่น มันจึงถูกเก็บไว้ในตัวชี้ตัวควบคุม A
‫เราจะแก้ไขปัญหานี้ได้อย่างไร
‫คำตอบคือเราต้องแคสต์
‫เรารู้ว่าคอนโทรลเลอร์คือคลาสหลักและคอนโทรลเลอร์ของผู้เล่นคือคลาสย่อย
‫และเรารู้ว่าเราไม่สามารถเก็บคอนโทรลเลอร์ A ไว้ในตัวชี้คอนโทรลเลอร์ A ของผู้เล่นได้
‫เรารู้ว่าเราสามารถไปทางอื่นและมีที่เก็บตัวชี้ตัวควบคุมซึ่งเป็นวัตถุของตัวควบคุมของผู้เล่น
‫นั่นคือสิ่งที่เราเห็นเมื่อเราเรียก get controller มันจะส่งคืนตัวชี้ตัวควบคุม A ที่ชี้ไปที่ตัวควบคุมผู้เล่น
‫A
‫ดังนั้นหากเรามีค่าของตัวชี้ตัวควบคุมประเภท A เราสามารถใช้ฟังก์ชันพิเศษที่เรียกว่าการโยนเพื่อแปลงประเภทของตัวชี้เป็นตัวชี้ตัวควบคุมผู้เล่น
‫A
‫ดังนั้นการแคสต์จะเปลี่ยนประเภทของพอยน์เตอร์ตัวหนึ่งเป็นอีกประเภทหนึ่ง ตราบใดที่ตัวอ็อบเจ็กต์นั้นเป็นประเภทที่เราพยายามแคสต์
‫ตอนนี้ ถ้าเราพยายามที่จะส่งไปยังประเภทที่ไม่ถูกต้อง ตัวอย่างเช่น เรามีตัวชี้ตัวควบคุม A ที่ชี้ไปที่วัตถุตัวควบคุมของผู้เล่น
‫หากเราพยายามแคสต์เพื่อพูดว่า ตัวละคร ฟังก์ชัน cast จะคืนค่า null และเราบอกว่าเราล้มเหลวในการแคสต์
‫ดังนั้นฟังก์ชั่นการแคสต์จึงเป็นแบบนี้
‫เป็นเทมเพลตเหมือนกับสร้างออบเจ็กต์ย่อยเริ่มต้น
‫ฟังก์ชันเทมเพลตนี้จะปรับให้เข้ากับประเภทที่เลือก และในฟังก์ชันนี้ ประเภทที่เราส่งคือประเภทที่เรากำลังแคสต์ด้วย
‫ดังนั้นเราจึงผ่านประเภทนั้น
‫เราต้องการใส่วงเล็บสองอันในวงเล็บมุม และเราส่งตัวชี้ที่เราต้องการใส่ลงในวงเล็บ
‫นี่คือตัวอย่าง
‫สมมติว่าเราต้องการส่งไปยังตัวควบคุมของผู้เล่นและตัวชี้ประเภทตัวควบคุมประเภท A
‫เราส่งตัวชี้ไปที่วงเล็บและประเภทที่เรากำลังส่งไปในวงเล็บเหลี่ยม
‫และสิ่งที่ได้กลับมาคือค่าของตัวชี้ตัวควบคุมผู้เล่นประเภท A
‫ดังนั้นนี่คือการเรียกใช้ฟังก์ชันที่เราส่งประเภทในวงเล็บมุมและค่าตัวชี้ตัวควบคุมที่เราได้รับจากตัวควบคุม
‫get สามารถอยู่ในวงเล็บได้
‫ดังนั้นเราจึงต้องแปลงค่านี้ที่เราได้รับกลับมาจากตัวควบคุม
‫นั่นจะเป็นความท้าทายของคุณ
‫ดังนั้นใน Begin Play ให้ใช้ฟังก์ชัน get controller และส่งค่านั้นไปยังฟังก์ชัน cast และส่งไปยังคอนโทรลเลอร์ของผู้เล่น
‫จากนั้นคุณสามารถเก็บผลลัพธ์ไว้ในตัวชี้อ้างอิงตัวควบคุมเครื่องเล่นของเรา ซึ่งเป็นตัวชี้ตัวควบคุมเครื่องเล่นประเภท
‫A
‫หยุดวิดีโอชั่วคราวและดำเนินการแคสต์
‫ตกลง.
‫ดังนั้นเราจึงทำงานเกือบเสร็จแล้วที่นี่ เราแค่ต้องการแคสต์
‫สิ่งที่เราจะทำคือเรียกฟังก์ชัน cast ซึ่งมีวงเล็บมุมและวงเล็บด้วย
‫และสิ่งที่อยู่ในวงเล็บคือค่าที่เราอยากใส่
‫ตอนนี้รับคอนโทรลเลอร์ส่งคืนตัวชี้ของคอนโทรลเลอร์ Type A
‫ผมจะย้ายมันตรงนี้ไปไว้ในวงเล็บ
‫และประเภทที่เรากำลังแคสต์คือตัวควบคุมผู้เล่น
‫อีกครั้งที่เรากำลังรับค่าที่ส่งคืนโดย get comptroller
‫ส่งคืนตัวชี้ตัวควบคุมหรือที่อยู่
‫จากนั้นเราก็ใช้การแคสต์เพื่อส่งไปยังคอนโทรลเลอร์ของผู้เล่น A
‫เรารู้ว่าวัตถุที่ส่งคืนโดยตัวควบคุมเกตเป็นวัตถุตัวควบคุม A ของผู้เล่นที่เก็บไว้ในตัวชี้ตัวควบคุม
‫A
‫หลังจากที่เราแคสต์แล้ว สิ่งที่ได้กลับมาคือพอยน์เตอร์ของตัวควบคุมผู้เล่นประเภท A
‫ดังนั้นเราจึงเก็บไว้ในผู้อ้างอิงตัวควบคุมผู้เล่น
‫ตอนนี้เราสามารถเข้าถึงตัวควบคุมในรูปแบบของตัวชี้ตัวควบคุมผู้เล่น A เราสามารถเข้าถึงฟังก์ชันที่เราต้องการเพื่อรับผลการติดตามภายใต้เคอร์เซอร์
‫โดยสรุปแล้ว เราใช้ get controller เพื่อเข้าถึงคอนโทรลเลอร์
‫นอกจากนี้เรายังใช้ฟังก์ชัน cast เพื่อส่งจากตัวชี้ตัวควบคุมประเภท A ไปยังตัวชี้ตัวควบคุมของผู้เล่นประเภท
‫A
‫ตอนนี้เราสามารถเข้าถึงฟังก์ชันที่เราต้องการ ซึ่งได้รับผลลัพธ์ภายใต้เคอร์เซอร์ซึ่งมีอยู่ในคลาสตัวควบคุมผู้เล่น
‫A
‫เราจะเริ่มใช้ฟังก์ชันนี้ในวิดีโอหน้า
‫เจอกันเร็วๆนี้ครับ