获取基于回合制RPG的当前目标数据

时间:2018-01-23 15:28:23

标签: c# unity3d

我正在创造一个基于回合制的战斗RPG,灵感来自Divinity:Original Sin,D& D等。目前,我有一个Game Object,其中包含当前场景中的所有角色,每个角色都只是一个GameObject,它具有模型(现在只是一个立方体......)和一个Charcter Stats组件,就是这个脚本:

 public class CharacterStats : MonoBehaviour {

    public string characterName;
    public int health;
    public int strength;
    public int dexterity;
    public int intelligence;

    // Use this for initialization
    void Start () {
        health = 100;
        strength = 10;
        dexterity = 10;
        intelligence = 10;
    }

    // Update is called once per frame
    void Update () {

    }
}

在角色的实际模型上(同样,现在只是一个立方体)我有这个用户交互脚本:

public class UserInteraction : MonoBehaviour {

    CharacterStats currentCharacterStats { get; set; }
    GameObject currentTargetCharatcerStats;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    void OnMouseDown()
    {
        currentCharacterStats = this.gameObject.GetComponentInParent<CharacterStats>();
        Debug.Log(this.gameObject.GetComponentInParent<CharacterStats>());
        Debug.Log(currentCharacterStats.characterName + " Clicked");

        //assing global taget stats
        var currentTarget = GameObject.Find("CurrentTarget");
        var currentTargetStats = currentTarget.GetComponent<CharacterStats>();
        currentCharacterStats = currentTargetStats;

    }    
}

这个脚本的目标是为我刚刚点击的任何字符获取Character Stats并将其分配给另一个名为CurrentTarget的GameObject,它只包含CharacterStats,这将是一种全局值对于游戏中的其他系统将使用。

这里的目标是允许用户点击目标并让他们的健康数据显示在我附加到我的主摄像头的画布上,并显示CurrentTarget的健康值但是,我不知道如何检查currentTarget是否已更改以更新HUD的运行状况值。我是否错误地存储了这些数据?

这是我目前在Canvas GameObject的Text Component上使用的脚本:

public class CurrentTarget : MonoBehaviour {

    public CharacterStats currentTarget;
    public Text healthText;

    // Use this for initialization
    void Start () {
        healthText = GetComponent<Text>();
    }

    // Update is called once per frame
    void Update () {
        var target = GameObject.Find("CurrentTarget");
        var currentTargetStats = target.GetComponent<CharacterStats>();
        if (currentTargetStats != null)
        {
            currentTarget = currentTargetStats;
            healthText.text = "Health: " + currentTarget.health;
        }
    }
}

我听说在Update上获取GameObject是一个非常昂贵的调用,所以我想在将更多系统添加到游戏之前尝试解决这个问题。谢谢!下面是我的场景的当前结构:

Current structure of my Scene

1 个答案:

答案 0 :(得分:1)

是的,用urn:oid:1.3.6.1.4.1.5923.1.1.1.7方法做你正在做的事情并不是一个好主意。 一种解决方案可能是让您的Update班级成为单身人士。

CurrentTarget

这样,在您致电public class CurrentTarget : MonoBehaviour { static public CurrentTarget instance; // ... void Awake() { instance = this; } 时,您可以执行以下操作:

OnMouseDown

然后,您只需要创建CurrentTarget.instance.updateTarget(currentTargetStats); 方法,该方法将updateTarget对象作为参数,并对用户界面进行必要的更改(例如CharacterStats等)。