Chat Room

บทที่ 5.2 ControlBot

วันนี้ผมจะมาสอนส่วนต่างๆ ใน UDKBot นะครับ ผมก็จะสอนให้ Bot วิ่งตาม
เมื่อ Bot เห็นเราแล้วจะทำการวิ่งตาม หรือการทำให้บอทวิ่งนะครับ

ก่อนอื่นเข้า BotController เลยครับ

การให้ Bot ทำการมองเห็น ผู้เล่น
ก่อนอื่นผมก็สร้าง


Event SeePlayer(Pawn Player){
`log(Player);
}

แล้วทำการลองรันดู โดยที่ผมจะไปยืนตรงหน้า bot นะครับ


มันบอกแล้ว MyPawn_0 หมายถึง Class ผู้เล่น คนที่ 0 นะครับ

อ่ะเราลอง ให้ Bot ทำการ หันหน้ามาหาเราดีกว่าลองดู ครับ
ลบ `log(Player); ออกใส่ Focus = Player; ลงไปแทน แล้วลองรันดูครับ อ่าว มันหันหน้าตาาามม เราด้วยย

ทีนี้จะเป็นการสั่งบอทให้เดิมตามนะครับ

มีอยู่ สองคำสั่ง

MoveTo : การสิ่งบอทวิ่งไปตามที่เรากำหนดไว้
MoveToWard : การสั่งบอทให้วิ่งตามเร็ว หรือตาม Location ของ Pawn ที่เรากำหนด

มะเรามาลองกัน

เรายังอยู่ที่ BotController

ให้เราสร้าง Variable มาตัวนึงเอาไว้ ตรงหัวเลยครับ

Var Pawn MoveFollow;
และสร้าง
State Follow{
}


คราวนี้เรามาเพิ่ม การทำงาน ใน Event SeePlayer นะครับ
MoveFollow = Player;
เพิ่มตัวนี้เข้าไป แล้ว กระทำการ วิ่งไปหา state ที่ผมตั้งไว้
ก็พิมพ์เข้าไปอีก
Gotostate('Follow');

หลังจากนั้น ให้คุณไปเพิ่มคำสั่งข้างใน state Follow


begin:
MoveToWard(MoveFollow,MoveFollow,20);
goto('begin');


//----------------------------------------------------------------------------

var Pawn MoveFollow;

event Possess(Pawn iP,bool bV){
super.Possess(iP,bV);
Pawn.setMovementPhysics();
}



Event SeePlayer(Pawn Player){
Focus = Player;
MoveFollow = Player;
Gotostate('Follow');
}

state Follow{
begin:
MoveToWard(MoveFollow,MoveFollow,20);
goto('begin');
}




//-------------------------------------------------------------------------

เรามาทำความเข้าใจนะครับว่า
ทำไมผมจึงต้องสร้าง Variable MoveFollow มาสาเหตุเลยก็เป็นเพราะว่า variable Player มันข้ามไม่ได้
นั่นเอง แต่มีวิธีลัด ที่จะไม่ต้องสร้าง MoveFollow นั่นก็คือ

MoveToWard(Pawn(Focus), Pawn(Focus) ,20);
ก็จะทำให้ ไม่จำเป็นต้องสร้าง MoveFollow นั่นเอง

เรามาดูการทำงานและหน้าที่ Parameter กันดีกว่า

MoveToward(Actor NewTarget, optional Actor ViewFocus, optional float DestinationOffset, optional bool bUseStrafing, optional bool bShouldWalk = (Pawn != None) ? Pawn.bIsWalking : false);

1: Actor เป็นเป้าหมายที่กำหนดให้วิ่งตาม
2: การ Focus หรือการหันของ Bot เนื่องจากถ้า Focus ข้างบนอย่างเดียวมันจะต้องรอให้วิ่งเสร็จ จึงจะหัน จึงต้องใช้ Unit ที่เราจะให้วิ่งตามด้วย นั่นเอง
3: ระยะทางปายทาง ตัวนี้หมายถึงว่า ระยะห่างในการตามนั่นเอง

เรามาต่อ MoveTo

MoveTo ก็จะคล้ายๆ

คราวนี้ให้เอา คำสั่ง ทั้งหมดของ MoveToWard ข้างต้นออกไปก่อนเพื่อจะได้รู้การทำงาน

เอาล่ะ คราวนี้ ตั้ง state ชื่อว่า Move_To

auto state Move_TO{

begin:
MoveTo(vect(25,90,0),,0);
MoveTo(vect(25,0,0),,0);
goto('begin');
}

แล้วลองรันดู

จะเห็นได้ว่ามันวิ่งไปวิ่งมา Parameter ที่เปลี่ยนไป จาก MoveToWard จะมีแค่ Parameter ตัวที่ 1
เท่านั้น เปลี่ยนจาก Actor เป็น Vector ซึ่งตัวนี้จะคอยกำหนดระยะทาง เป็น Vector เราสามารถ กำหนดเองได้


ไม่มีความคิดเห็น: