ใช้แผนที่แอคชั่นเพื่อกําหนดปุ่มให้กับพฤติกรรมของเกม

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2020.3.25f1
แพ็คเกจระบบอินพุต
  • 1.2.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้

เกี่ยวกับ Action Maps

โปรแกรมป้อนข้อมูลของผู้ใช้บนแป้นพิมพ์เมาส์และเกมแพดโดยทั่วไประบุว่ามีการดําเนินการบางอย่างเมื่อกดปุ่ม ตัวอย่างเช่นในแผนที่การกระทําคุณสามารถกําหนดการกระทําของ "กระโดด" และกําหนดปุ่มควบคุมและปุ่มแป้นพิมพ์ให้กับมัน เป็นผลให้โปรแกรมจําเป็นต้องอธิบายกระบวนการเมื่อมีการดําเนินการเฉพาะ แม้ว่าคุณจะกําหนดปุ่มบนคอนโทรลเลอร์อื่นเป็น afterthought คุณสามารถนําไปใช้ได้โดยไม่ต้องเปลี่ยนโปรแกรมปฏิบัติการ

การสร้างแผนที่การดําเนินการ

ที่นี่ฉันต้องการสร้างแผนที่การกระทําและแสดงข้อมูลอินพุตของผู้ใช้ในข้อความ มีหลายวิธีในการรับข้อมูลของผู้ใช้โดยใช้ Action Maps

คลิกขวาที่โฟลเดอร์ใดๆ ในโครงการเพื่อสร้าง การดําเนินการป้อนข้อมูล ตําแหน่งของโฟลเดอร์ที่จะสร้างนั้นเป็นไปตามอําเภอใจ แต่โปรดจัดการตามโครงการของคุณ ชื่อไฟล์ก็เป็นไปตามอําเภอใจ แต่นี่คือ InputActionSample .

เมื่อคุณดับเบิลคลิกที่ไฟล์ที่สร้างขึ้นหน้าต่างต่อไปนี้จะปรากฏขึ้น

ขั้นแรก ให้คลิกปุ่ม + ใน Action Maps เพื่อสร้างแผนที่การทํางาน ในฐานะที่เป็นหน่วยสร้างหากเนื้อหาของการดําเนินการเปลี่ยนแปลงขึ้นอยู่กับฉากมันจะถูกกําหนดในหน่วยนั้น ตัวอย่างเช่นในกรณีของเกมแอคชั่นแบบเลื่อนด้านข้างเนื้อหาของการดําเนินการจะเปลี่ยนไประหว่างการกระทําและในเมนูดังนั้นคุณจะสร้างแผนที่การกระทําสําหรับแต่ละเกม

ตัวอย่างเช่นเรากําหนดการดําเนินการเลื่อนด้านข้างและตั้งชื่อว่า "SideScrollActionMap"

จากนั้นสร้างการดําเนินการ เนื่องจากเป็นตัวอย่างฉันจะไม่สร้างจํานวนมาก แต่ที่นี่เราจะสร้างการกระทํา "ย้าย" สําหรับการเคลื่อนไหวและ "โจมตี" สําหรับการโจมตี เนื่องจากได้สร้างมาแล้วโปรดเปลี่ยนชื่อหรือสร้างใหม่คลิกปุ่ม + ที่มุมขวาบนแล้วป้อน

ขั้นแรก ให้กําหนดค่าการกําหนดค่า Move ตัวควบคุมจะถือว่าคุณใช้ปุ่มสติ๊ก D-pad และเคอร์เซอร์ของแป้นพิมพ์ ในกรณีของการเลื่อนด้านข้างมีหลายกรณีที่ใช้เฉพาะซ้ายและขวา แต่ในที่นี้เราถือว่าคุณใช้สี่ทิศทางในการกระโดดด้วยปุ่มบนและหมอบลงด้วยปุ่มลง

เมื่อคุณเลือกย้ายจะมีการเลือกประเภทการกระทําทางด้านขวาดังนั้นให้ตั้งค่าเป็น "ค่า"

คุณจะเห็นประเภทการควบคุมด้านล่างดังนั้นเลือก Vector2 นี่เป็นเพราะด้านบนและด้านล่างถูกกําหนดให้กับ Y และซ้ายและขวาถูกกําหนดให้กับ X

จากนั้นเลือกคีย์ที่คุณต้องการกําหนดให้กับเหตุการณ์นี้ เลือก ไม่มีการผูก ตรงกลาง และเลือก เส้นทาง ทางด้านขวา ที่นี่เราเลือก GamePad LeftStick

สิ่งนี้จะผูก LeftStick ของ GamePad เข้ากับการเคลื่อนไหว

หากต้องการผูกคอนโทรลเลอร์อื่นๆ ด้วย ให้เลือก "เพิ่มการผูก" จากปุ่ม + ทางด้านขวาของ ย้าย.

เมื่อเพิ่ม No Binding แล้วเราจะกําหนด Dpad สําหรับ GamePad

ด้วยวิธีนี้คุณสามารถเพิ่มประเภทของคอนโทรลเลอร์ที่คุณต้องการรองรับรวมถึงปุ่มและสติ๊ก นอกจากนี้ยังสามารถตั้งค่าเฉพาะสําหรับคอนโซลเกมเฉพาะ

Sticks และ Dpads เป็นปุ่มที่ถือว่าขึ้นลงซ้ายและขวาดังนั้นจึงสามารถเพิ่มได้ด้วยสิ่งนี้ แต่ในกรณีของแป้นพิมพ์ปุ่มเหล่านี้เป็นปุ่มเดียวทั้งหมดดังนั้นจึงไม่มีคําจํากัดความสําหรับขึ้นลงซ้ายและขวา หากต้องการตั้งค่าแป้นพิมพ์ขึ้น ลง ซ้าย หรือขวา ให้เลือก เพิ่มคอมโพสิตขึ้นลงซ้ายขวา จากปุ่ม +

จากนั้นเวกเตอร์ 2 มิติจะถูกเพิ่มและคุณสามารถกําหนดให้กับแต่ละขึ้นลงซ้ายขวาดังที่แสดงในรูปด้านล่าง

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

ขณะนี้ ขึ้น ถูกตั้งค่าเป็น ลูกศรขึ้น

ในทํานองเดียวกันตั้งค่าลงซ้ายและขวาและคุณทําเสร็จแล้ว

แน่นอนว่าไม่เพียง แต่ปุ่มเคอร์เซอร์เท่านั้น แต่ยังสามารถตั้งค่า WASD ได้อีกด้วย

จากนั้นกําหนดค่า Attack การโจมตีนั้นง่ายต่อการกําหนดเพราะเป็นปุ่มเดียว ขั้นแรกให้เลือกโจมตีและตรวจสอบให้แน่ใจว่าประเภทการกระทําเป็นปุ่ม

จากนั้นเลือก ไม่มีการผูก และเลือกปุ่มที่คุณต้องการกําหนดจากเส้นทาง

หากคุณต้องการเพิ่มให้เลือก "เพิ่มการผูก" จากปุ่ม +

เพิ่มได้มากเท่าที่คุณต้องการ เนื่องจากถือว่าเป็นปุ่มแป้นพิมพ์จึงสามารถตั้งค่าได้ในลักษณะเดียวกับตัวควบคุมเกม

เมื่อการตั้งค่าทั้งหมดเสร็จสมบูรณ์ให้คลิก "บันทึกสินทรัพย์" เพื่อบันทึก คุณสามารถปิดหน้าต่างนี้ได้

สุดท้ายด้วยไฟล์ inputactions ของโครงการ (ในกรณีนี้คือไฟล์ InputActionSample ที่คุณสร้างไว้ก่อนหน้านี้) ให้เลือก "สร้างคลาส C#" ในตัวตรวจสอบ พารามิเตอร์จะถูกเพิ่ม แต่คลิกปุ่ม "ใช้" ตามที่เป็นอยู่

สิ่งนี้จะสร้างไฟล์สคริปต์ที่มีชื่อเดียวกัน มันมีคลาสที่มีประโยชน์สําหรับการใช้แผนที่การกระทําจากโปรแกรม

วิธีการรับข้อมูลป้อนเข้า

มีหลายวิธีในการรับอินพุตตามแผนที่การดําเนินการ เคล็ดลับนี้อธิบายรูปแบบสามแบบ แต่ควรมุ่งเน้นไปที่รูปแบบใดรูปแบบหนึ่งเมื่อสร้างเกมจริง หากคุณใช้แยกกันมันจะลําบากในการจัดการ

นอกจากนี้ หากคุณใช้วิธีการรับอินพุตหลายวิธีในฉากเดียว การประมวลผลอาจขัดแย้งกันภายในและทํางานไม่ถูกต้อง

รับข้อมูลป้อนเข้าใน ส่งข้อความ

วิธีแรกที่นี่คือวิธีรับข้อมูลอินพุตใน "ส่งข้อความ"

คราวนี้ฉันต้องการแสดงข้อมูลที่ป้อนในข้อความดังนั้นฉันจะวางวัตถุข้อความ

นอกจากนี้เนื่องจากเคล็ดลับนี้จะพยายามรับข้อมูลอินพุตหลายรายการเราจะสร้างวัตถุว่างเพื่อตั้งค่าส่วนประกอบแยกต่างหาก ชื่อสามารถเป็นอะไรก็ได้

จากนั้นเพิ่มส่วนประกอบการป้อนข้อมูลของผู้เล่นลงในวัตถุว่าง Player Input เป็นองค์ประกอบที่สําคัญสําหรับการเชื่อมต่อแผนที่การกระทําและสคริปต์

ใน "เพิ่มส่วนประกอบ" มี "อินพุตผู้เล่น" ในหมวดหมู่ "อินพุต" ดังนั้นให้เพิ่มเข้าไป

เมื่อเพิ่มคอมโพเนนต์การป้อนข้อมูลของผู้เล่นแล้ว ให้ตั้งค่าแผนที่การดําเนินการที่คุณสร้างใน "การดําเนินการ" วางจากโปรเจ็กต์หรือเลือกจากไอคอน + ทางด้านขวา

ตรวจสอบว่าแผนที่เริ่มต้นเป็นแผนที่ที่คุณสร้างขึ้นใน Action Map

ตรวจสอบว่า ลักษณะการทํางานเป็น "ส่งข้อความ"

จากนั้นสร้างสคริปต์ ชื่อไฟล์สามารถเป็นอะไรก็ได้ แต่นี่คือ InputSendMessage .

สคริปต์มีลักษณะดังนี้:

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class InputSendMessage : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>
  /// Move アクションが実行されたときに呼ばれる。
  /// </summary>
  /// <param name="inputValue">入力量。</param>
  public void OnMove(InputValue inputValue)
  {
    var vec = inputValue.Get<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack アクションが実行されたときに呼ばれる。
  /// </summary>
  public void OnAttack(InputValue inputValue)
  {
    TextObject.text = $"Attack:{inputValue.isPressed}\n{TextObject.text}";
  }
}
  • วัตถุมีการใส่โปรแกรมเล่นที่แนบมาซึ่งตั้งค่าส่งข้อความ
  • สืบทอดมาจาก MonoBehaviour

หากตรงตามเงื่อนไขแล้วถ้าคุณกําหนดวิธีการที่เรียกว่า"OnXXXXXXXX" วิธีการเป้าหมายจะถูกเรียกเมื่อดําเนินการดําเนินการที่ระบุ "XXXXXXXX" คือชื่อของการดําเนินการที่สร้างขึ้นในแผนที่การดําเนินการ ที่นี่เราได้สร้างการกระทํา "Move" และ "Attack" ดังนั้นชื่อวิธีการคือ "OnMove" และ "OnAttack" ตามลําดับ

OnMove คุณสามารถรับจํานวนเงินที่ป้อนได้จากอาร์กิวเมนต์ InputValue ของ . เนื่องจากประเภทการควบคุมถูกตั้งค่าเป็น "เวกเตอร์ 2" ค่า InputValue.Get<Vector2> อินพุตจะได้รับใน .

OnAttackInputValue.isPressedคุณสามารถรับได้ว่าคุณกําลังกดเข้ามาหรือไม่

หลังจากที่คุณบันทึกสคริปต์แล้ว ให้แนบสคริปต์นั้นกับวัตถุที่มีคอมโพเนนต์การป้อนข้อมูลของผู้เล่น ตั้งค่าวัตถุข้อความสําหรับการแสดงผลเช่นกัน

เรียกใช้เกมและดู คราวนี้ฉันได้รวมคําจํากัดความของเกมแพดและแป้นพิมพ์ไว้ด้วยดังนั้นจึงควรใช้งานได้ไม่ว่าคุณจะใช้งานอันไหน

อย่างที่คุณเห็นเมื่อคุณย้ายคุณจะเห็นว่าวิธีการนี้เรียกว่าเฉพาะเมื่อมีการเปลี่ยนแปลงค่าจากสถานะก่อนหน้า ตัวอย่างเช่นในขณะที่ย้ายไม้ไปทางซ้ายจะเรียกว่าใจเดียว แต่ไม่ใช่ไปทางซ้าย (- OnMove 1,0) OnMove ปุ่มโจมตียังตอบสนองเฉพาะช่วงเวลาที่กดและหากกดค้างไว้วิธีการจะไม่เรียกว่า

ดังนั้นฉันคิดว่าการใช้งานในอุดมคติไม่ใช่การประมวลผลเกมเมื่อเรียก OnXXXXXXXX แต่เพื่อเก็บเฉพาะเนื้อหาที่ป้อนและใช้ค่าเหล่านั้นในการประมวลผลการอัปเดตของเกม

โดยวิธีการในสถานะปัจจุบันจะไม่เรียกว่าเมื่อปล่อยปุ่มดังนั้นจึงเป็นไปไม่ได้ที่จะกําหนดเมื่อ OnAttack ปล่อยปุ่ม ในการตอบสนองต่อสิ่งนี้ให้เลือกการดําเนินการโจมตีที่กําหนดปุ่มในการตั้งค่าแผนที่การกระทําและเพิ่ม "กด" จาก "การโต้ตอบ" หลังจากนั้นให้ตั้งค่าลักษณะทริกเกอร์ของการกดที่เพิ่มเป็น "กดและปล่อย" และบันทึก

เมื่อดําเนินการคุณจะเห็นว่าเรียกว่าแม้ OnAttack ในขณะที่ปล่อยปุ่ม isPressed false มันเป็นไปได้ที่จะกําหนดว่าเป็นช่วงเวลาของการเปิดตัวหรือไม่

อย่างไรก็ตามโปรดลบการโต้ตอบนี้เพราะจะไม่ถูกนํามาใช้ในอนาคต

รับข้อมูลด้วย Invoke Unity Events

วิธีที่สองในการรับข้อมูลคือ Invoke Unity Events ดังนั้นเรามาลองทําสิ่งนี้กัน ดังที่ได้กล่าวไว้ข้างต้นการใช้วิธีการป้อนข้อมูลหลายวิธีอาจทําให้เกิดการประมวลผลที่ขัดแย้งกันดังนั้นหากเปิดใช้งานการประมวลผลอื่นให้ปิดใช้งาน

ขั้นแรกให้วางวัตถุข้อความเพื่อให้สามารถแสดงข้อมูลป้อนเข้าได้

เรียกใช้เหตุการณ์ความสามัคคีสร้างวัตถุว่างที่ดําเนินการที่เกี่ยวข้อง

เพิ่มอินพุต>อินพุตของผู้เล่นลงในวัตถุว่าง

ตั้งค่าไฟล์ Action Map ที่คุณสร้างสําหรับการดําเนินการ (ในกรณีนี้คือ InputActionSample) และตั้งค่า Action Map ที่คุณสร้าง (ในกรณีนี้คือ SideScrollActionMap) เป็น Default Map ตั้งค่าพฤติกรรมเพื่อเรียกใช้เหตุการณ์ความสามัคคี

สร้างสคริปต์ ชื่อเป็นโดยพลการ แต่ในกรณีนี้ InputInvokeUnityEvents คือ .

สคริปต์มีลักษณะดังนี้:

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class InputInvokeUnityEvents : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>
  /// Move 操作を行ったときに呼ばれる。
  /// </summary>
  /// <param name="context">コールバック内容。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Move 操作を行ったときに呼ばれる。
  /// </summary>
  /// <param name="context">コールバック内容。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

ชื่อOnMoveOnAttackวิธีการที่เรียกเมื่อผู้ใช้โต้ตอบกับมันคือ เช่นในกรณีของส่งข้อความ ใน Invoke Unity Events คุณสามารถตั้งชื่อวิธีนี้ได้ตามที่คุณต้องการ

เมื่อแต่ละรายการถูกเรียกมันจะถูกส่งผ่านเป็น InputAction.CallbackContext อาร์กิวเมนต์เพื่อให้คุณสามารถรับสถานะอินพุตได้จากที่นั่น หากคุณตั้งค่า "ค่า" ในการดําเนินการคุณสามารถรับได้ในวิธีการและหากคุณ ReadValue ตั้งค่า ReadValueAsButton "ปุ่ม" คุณสามารถรับได้ในวิธีการ

หลังจากบันทึกสคริปต์แล้ว ให้แนบ Player Input เข้ากับวัตถุที่คุณกําลังตั้งค่าและตั้งค่าวัตถุข้อความที่แสดง

จากนั้นขยาย "เหตุการณ์" และ "ชื่อแผนที่การกระทํา (SideScrollActionMap)" ในการป้อนข้อมูลของผู้เล่นและคุณจะเห็นการกระทํา" ย้าย" และ" โจมตี" ที่คุณสร้างขึ้น

ขั้นแรกให้คลิกปุ่ม + บน ย้าย เพื่อเพิ่ม

วัตถุที่มุมล่างซ้ายเป็นวัตถุของคุณเองและฟังก์ชันถูกตั้งค่าเป็นวิธีการที่คุณเพิ่งสร้างขึ้นOnMove

กําหนดค่าเหตุการณ์การโจมตีด้วย

เรียกใช้เกมเพื่อดูว่ามันทํางานอย่างไร

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

ใช้สคริปต์ที่สร้างขึ้นโดยอัตโนมัติเพื่อรับข้อมูลป้อนเข้า

ส่วนที่สามอธิบายวิธีการรับข้อมูลป้อนเข้าโดยใช้สคริปต์ที่สร้างขึ้นจากไฟล์แผนผังการดําเนินการ

เนื่องจากมีความเป็นไปได้ที่จะขัดแย้งกับกระบวนการได้มาอื่น ๆ โปรดปิดการใช้งานกระบวนการได้มาอื่น ๆ

วางวัตถุข้อความเพื่อแสดงข้อมูลป้อนเข้า

นอกจากนี้ให้สร้างวัตถุว่างสําหรับการดึงข้อมูลอินพุต บทความนี้ใช้สคริปต์ที่สร้างขึ้นโดยอัตโนมัติ คุณจึงไม่จําเป็นต้องเพิ่มการป้อนข้อมูลของผู้เล่น

สคริปต์ที่สร้างขึ้นโดยอัตโนมัติจากแผนที่การกระทําเป็นเพียงไลบรารีดังนั้นสร้างสคริปต์ควบคุมแยกต่างหาก ชื่อเป็นโดยพลการ แต่ในกรณีนี้ InputScript คือ .

สคริปต์มีลักษณะดังนี้:

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class InputScript : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>アクションマップから自動生成されたクラス。</summary>
  private InputActionSample _actionMap;

  private void Awake()
  {
    // 各操作を行ったときに呼ばれるイベントを設定する
    _actionMap = new InputActionSample();
    _actionMap.SideScrollActionMap.Move.performed += context => OnMove(context);
    _actionMap.SideScrollActionMap.Attack.performed += context => OnAttack(context);
  }

  private void OnEnable()
  {
    // このオブジェクトが有効になったときにアクションマップを有効にする
    _actionMap.Enable();
  }

  private void OnDisable()
  {
    // このオブジェクトが無効になったときにアクションマップが余計な動作を起こさないように無効にする
    _actionMap.Disable();
  }

  /// <summary>
  /// Move 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    // Move の入力量を取得
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    // Attack ボタンの状態を取得
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

กําหนดคลาส InputActionSample ที่สร้างขึ้นโดยอัตโนมัติจากแผนที่การดําเนินการในฟิลด์ คลาสนี้กําหนดแต่ละชุดการดําเนินการในแผนผังการดําเนินการ และคุณสามารถตั้งค่าเหตุการณ์ที่เรียกเมื่อดําเนินการเหล่านั้น

Awake ในวิธีการ InputActionSample อินสแตนซ์ของถูกสร้างขึ้นและเหตุการณ์ที่เรียกว่าในเวลาของการกระทําถูกตั้งค่า เมื่อคุณ OnMoveดําเนินการเหล่านี้, วิธีการจะ OnAttack ถูกเรียกในขณะนี้.

อย่างไรก็ตามเนื่องจากเราตั้งค่าเหตุการณ์ที่นี่เท่านั้นเราจึง OnEnable จําเป็นต้องเรียกวิธีการเมื่อ Enable ถูกเรียกเพื่อเปิดใช้งานแผนที่การกระทํา

นอกจากนี้ เนื่องจากพฤติกรรมการป้อนข้อมูลของผู้ใช้ถือเป็นการดําเนินการส่วนกลาง เพื่อป้องกันไม่ให้ OnDisable action map ทําเพิ่มเติมหลังจากที่วัตถุนี้เป็นโมฆะเราเรียกวิธีการใน Disable วิธีการปิดการใช้งาน

หลังจากบันทึกสคริปต์แล้วให้แนบไปกับวัตถุว่างที่คุณสร้างและตั้งค่าวัตถุข้อความสําหรับการแสดงผล

เรียกใช้เกมเพื่อดูว่ามันทํางานอย่างไร

อย่างที่คุณเห็นวิธีการนี้ไม่ได้เรียกว่าเมื่อ OnMove การดําเนินการย้ายกลายเป็น (0, 0) ฉันไม่แน่ใจว่าทําไม แต่ดูเหมือนว่าเหตุการณ์ที่ดําเนินการจริงเท่านั้นที่ใช้เวลาหนึ่งที่มีการกดแป้นพิมพ์ที่เปิดใช้งาน

อย่างไรก็ตามหากคุณไม่ได้ตั้งค่าการโต้ตอบในแผนที่การกระทําสําหรับการโจมตีมันจะไม่ถูกเรียกเมื่อคุณ OnAttack ปล่อยปุ่ม

ในการจัดการ canceled สิ่งนี้คุณต้องตั้งค่าเหตุการณ์ หากคุณไม่ต้องการทําการประมวลผลพิเศษที่ (0, 0) คุณสามารถเรียกวิธีการตามที่เป็น OnMove อยู่ เช่นเดียวกับการโจมตี

private void Awake()
{
  // 各操作を行ったときに呼ばれるイベントを設定する
  _actionMap = new InputActionSample();
  _actionMap.SideScrollActionMap.Move.performed += context => OnMove(context);
  _actionMap.SideScrollActionMap.Attack.performed += context => OnAttack(context);
  _actionMap.SideScrollActionMap.Move.canceled += context => OnMove(context);       // 追加
  _actionMap.SideScrollActionMap.Attack.canceled += context => OnAttack(context);   // 追加
}

เรียกใช้และตรวจสอบว่า Move:(0, 0) หรือ Attack:False ปรากฏขึ้น