- Home /
Activate SPELLS when button is pressed
Hello! My task is now to make certain spells activate having clicked appropriate button. So, i have several scripts:
SpellInterface - contains spell buttons. Every button should keep its id, yet there is it in a simplified view:
using UnityEngine;
using System.Collections;
public class SpellInterface : MonoBehaviour
{
int buttonKeepId = 1;
void OnGUI()
{
//if (transform.parent.GetComponent<Player>()._target != null)
//{
if (GUI.Button(new Rect(Screen.width / 6, Screen.height / 1.1f, 120, 40), "FIREBALL"))
{
SpellGenerator sG = new SpellGenerator();
sG.CreateSpellBolt(1, transform.parent.gameObject, transform.parent.GetComponent<Player>()._target);
}
if (GUI.Button(new Rect(Screen.width / 3.5f, Screen.height / 1.1f, 120, 40), "Lighting"))
{
SpellGenerator sG = new SpellGenerator();
sG.CreateSpellBolt(2, transform.parent.gameObject, transform.parent.GetComponent<Player>()._target);
}
//}
}
}
The second script is SpellGenerator, which should define our caster and victim, which are recieved from SpellInterface.
public class SpellGenerator : MonoBehaviour
{
// Use this for initialization
private bool casted = false;
public void Update()
{
/*if (casted)
{
CreateSpellBolt(_id, caster, victim);
casted = false;
}*/
}
public void CreateSpellBolt(int id, GameObject _caster, GameObject _victim)
{
string wholeStr = "s" + id.ToString();
GameObject[] castParams = new GameObject[]{_caster, _victim};
object s = System.Activator.CreateInstance(Type.GetType(wholeStr));
MethodInfo methodCast = s.GetType().GetMethod("RecieveCombatData");
methodCast.Invoke(s, castParams);
Debug.Log(castParams[0] + castParams );
GameObject go = GameObject.Instantiate(Resources.Load("Spells/s" + id) as GameObject, _caster.transform.position, _caster.transform.rotation) as GameObject;
casted = true;
}
}
And the last one is the main script which treats for base spell behaviour.
using UnityEngine;
using System;
using System.Collections;
public class s1 : MonoBehaviour
{
int id = 1; public string data; bool gotData, refreshed;
public GameObject caster, victim; private bool recieved, isCastingNow;
Spell s;
Spell spellComp;
/*WARNING!
* SPELL DATA AREA!
*/
string[] splitedData;
int damage, requireHP, requireMP, requireSP;
string name, description;
float castTime, cooldownTime;
/*
/SPELL DATA END AREA!*/
/*public s1(GameObject _caster, GameObject _victim)
{
Debug.Log(_caster + " haahaha " + _victim);
caster = _caster;
victim = _victim;
}*/
void Awake()
{
spellComp = GameObject.Find("baseScripts").GetComponent<Spell>();
data = spellComp.RecieveData();
splitedData = data.Split(new string[] { "->" }, StringSplitOptions.RemoveEmptyEntries);
if(splitedData.Length > 1)
AdjustRecievedData();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.U))
{
Debug.Log(data);
}
if (victim)
{
Action();
}
}
void Action()
{
if (victim.transform.FindChild("SpellDestination") != null)
{
this.gameObject.transform.LookAt(victim.transform.FindChild("SpellDestination").position);
}
else
{
this.gameObject.transform.LookAt(victim.transform.position);
}
StartCoroutine(CooldownHandler(cooldownTime));
}
public IEnumerator CooldownHandler(float val)
{
yield return new WaitForSeconds(val);
refreshed = true;
}
public void RecieveCombatData(GameObject _caster, GameObject _victim)
{
caster = _caster;
victim = _victim;
}
}
But this way of implementation doesent work, because of wrond transposition data... It works if SpellGenerator will have this form: go.GetComponent().RecieveCombatData(c, v); Help me please to carry out this task. Sorry for my English...
Thanks in advance!
Your answer
Follow this Question
Related Questions
Cooldown on a spell, and make full animation. 1 Answer
best way to cast fireball 2 Answers
Spell system using oop and inheritance 2 Answers
How to cast spells by mouse click 2 Answers
Recreating word of power in unity 3d. 3 Answers