12/16/2013

Project RPG BÀI 6. KHỞI TẠO NHÂN VẬT


 
Ở bài viết trước mình đã cung cấp file code về các thông số vật lý của nhân vật để làm dữ liệu cho việc khởi tạo các tính chất vật lý của nhân vật. Bài viết này mình sẽ sử dụng các cơ sở dữ liệu ở bài viết trước để tạo nên menu khởi tạo các thông số cho nhân vật.



B1. Nhấp phải vào folder Character Classes và chọn Creat | C# Script và đặt tên là PlayerCharacter. Double click vào file vừa tạo và chèn đoạn code sau vào:

public class PlayerCharacter : BaseCharacter {

}

B2. Nhấp phải vào folder Character Classes và chọn Creat | C# Script và đặt tên là CharacterGenerator. Double click vào file vừa tạo và chèn đoạn code sau vào:

using UnityEngine;
using System.Collections;
using System;                 //used for Enum class

public class CharacterGenerator : MonoBehaviour {
    private PlayerCharacter _toon;
    private const int STARTING_POINTS = 350;
    private const int MIN_STARTING_ATTRIBUTE_VALUE = 10;
    private const int STARTING_VALUE = 50;
    private int pointsLeft;

    private const int OFFSET = 5;
    private const int LINE_HEIGHT = 20;

    private const int STAT_LABEL_WIDTH = 100;
    private const int BASEVALUE_LABEL_WIDTH = 30;
    private const int BUTTON_WIDTH = 20;
    private const int BUTTON_HEIGHT = 20;

    private int statStartingPos = 40;

    // Use this for initialization
    void Start () {
        _toon = new PlayerCharacter();
        _toon.Awake();

        pointsLeft = STARTING_POINTS;
        for(int cnt = 0; cnt < Enum.GetValues(typeof(AttributeName)).Length; cnt++){
            _toon.GetPrimaryAttribute(cnt).BaseValue = STARTING_VALUE;
            pointsLeft -= (STARTING_VALUE - MIN_STARTING_ATTRIBUTE_VALUE);
        }
        _toon.StatUpate();
    }
    
    // Update is called once per frame
    void Update () {

    }

    void OnGUI(){
        DisplayName();
        DisplayPointsLeft();
        DisplayAttributes();
        DisplayVitals();
        DisplaySkills();
    }

    private void DisplayName(){
        GUI.Label(new Rect(10, 10, 50, 25),"Name:");
        _toon.Name = GUI.TextField(new Rect(65, 10, 100, 25), _toon.Name );

    }

    private void DisplayAttributes(){
        for(int cnt = 0; cnt < Enum.GetValues(typeof(AttributeName)).Length; cnt++){
            GUI.Label(new Rect( OFFSET,                                    //x
                                statStartingPos + (cnt * LINE_HEIGHT),     //y
                                STAT_LABEL_WIDTH,                         //width
                                LINE_HEIGHT                                //height
                               ), ((AttributeName)cnt).ToString());
            GUI.Label(new Rect( STAT_LABEL_WIDTH + OFFSET,                 //x
                                statStartingPos + (cnt * LINE_HEIGHT),     //y
                                BASEVALUE_LABEL_WIDTH,                     //width
                                LINE_HEIGHT                                //height
                               ), _toon.GetPrimaryAttribute(cnt).AdjustedBaseValue.ToString());
            if(GUI.Button(new Rect( OFFSET + STAT_LABEL_WIDTH + BASEVALUE_LABEL_WIDTH,     //x
                                    statStartingPos + (cnt*BUTTON_HEIGHT),                 //y
                                   BUTTON_WIDTH,                                         //width
                                   BUTTON_HEIGHT                                        //height
                                   ),"-")){
                if(_toon.GetPrimaryAttribute(cnt).BaseValue > MIN_STARTING_ATTRIBUTE_VALUE){
                    _toon.GetPrimaryAttribute(cnt).BaseValue--;
                    pointsLeft++;
                    _toon.StatUpate();
                }
            }

            if(GUI.Button(new Rect( OFFSET + STAT_LABEL_WIDTH + BASEVALUE_LABEL_WIDTH + BUTTON_WIDTH,     //x
                                    statStartingPos + (cnt*BUTTON_HEIGHT),                                 //y
                                    BUTTON_WIDTH,                                                         //width
                                    BUTTON_HEIGHT                                                        //height
                                   ),"+")){
                if(pointsLeft > 0){
                    _toon.GetPrimaryAttribute(cnt).BaseValue++;
                    pointsLeft--;
                    _toon.StatUpate();
                }
            }
        }
    }

    private void DisplayVitals(){
        for(int cnt = 0; cnt < Enum.GetValues(typeof(VitalName)).Length; cnt++){
            GUI.Label(new Rect( OFFSET,                                             //x
                                statStartingPos + ((cnt + 7)* LINE_HEIGHT),         //y
                                STAT_LABEL_WIDTH,                                     //width
                                LINE_HEIGHT                                            //height
                               ), ((VitalName)cnt).ToString());
            GUI.Label(new Rect( OFFSET + STAT_LABEL_WIDTH,
                                statStartingPos + ((cnt + 7) * LINE_HEIGHT),
                                BASEVALUE_LABEL_WIDTH,
                                LINE_HEIGHT
                               ), _toon.GetVital(cnt).AdjustedBaseValue.ToString());
            
        }

    }

    private void DisplaySkills(){
        for(int cnt = 0; cnt < Enum.GetValues(typeof(SkillName)).Length; cnt++){
            GUI.Label(new Rect( OFFSET + STAT_LABEL_WIDTH + BASEVALUE_LABEL_WIDTH + BUTTON_WIDTH * 2 + OFFSET * 2,             //x
                                statStartingPos + (cnt * LINE_HEIGHT),                                                         //y
                                STAT_LABEL_WIDTH,                                                                             //width
                                LINE_HEIGHT                                                                                    //height
                               ), ((SkillName)cnt).ToString());
            GUI.Label(new Rect( OFFSET + STAT_LABEL_WIDTH + BASEVALUE_LABEL_WIDTH + BUTTON_WIDTH * 2 + OFFSET * 2 + STAT_LABEL_WIDTH,     //x
                                statStartingPos + (cnt * LINE_HEIGHT),                                                                     //y
                                BASEVALUE_LABEL_WIDTH,                                                                                     //width
                                LINE_HEIGHT                                                                                                //height
                               ), _toon.GetSkill(cnt).AdjustedBaseValue.ToString());
            
        }
        
    }

    private void DisplayPointsLeft(){
        GUI.Label(new Rect(250, 10, 100, 25), "Points Left: " + pointsLeft.ToString());

    }
}

B3. Tạo thẻ Project, nhấp chọn nút Creat và chọn Folder và đặt tên là Scenes. Ấn Ctrl + Shift + S để save scene hiện tại lại với tên là Targetting và kéo thả vào thư mục Scenes.


B4. Vào File | New Scene, sau đó ấn Ctrl + S để save scene này lại và đặt tên là Character Generator.


B5. Tại thẻ Project, kéo thả file C# Script CharacterGenerator vào MainCamera ở thẻ Hierarchy.

B6. Double click vào file BaseCharacter ở thẻ Project | Script | Character Classes và chèn thêm đoạn code được tô đỏ như sau:

    private void SetupVitals(){
        for(int cnt = 0; cnt < _vital.Length; cnt++){
            _vital[cnt] = new Vital();
        }
        SetupVitalModifiers();
       
    }
    private void SetupSkills(){
        for(int cnt = 0; cnt < _skill.Length; cnt++){
            _skill[cnt] = new Skill();
        }
        SetupSkillModifiers();
       
    }

B7. Bấm Ctrl + S để save scene Character Generator lại. Ấn nút Play để kiểm tra thành quả.

11 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Replies
    1. Bạn chụp màn hình Console rồi post qua đây xem

      Delete
  3. http://d.f18.photo.zdn.vn/upload/original/2014/08/07/10/01/3062454033_658482235_574_574.jpg

    ReplyDelete
    Replies
    1. Dòng 43 của bạn thiếu đóng ngoặt

      Delete
    2. Sửa lại dòng đó trong file ModifiedStat của b nhé

      Delete
    3. ok bạn , cảm ơn bạn :D

      Delete
  4. bạn ơi sao mình k add được file Script CharacterGenerator vào MainCamera.
    Nó thông báo là
    can't add script
    can't add component CharacterGenerator because it doesn't exist. check to see if the file name or class name match

    ReplyDelete