// Use this for initialization private void Awake() { // 이 객체의 정보들을 담는다. UIMAudio = UIM.GetComponent <AudioSource>(); ThisAudio = GetComponent <AudioSource>(); HitMsg = HitMessage.GetComponent <SpriteRenderer>(); Health = UIM.enemyMaxHP; ThisBody = GetComponent <Rigidbody2D>(); ThisTransform = GetComponent <Transform>(); ThisName = ThisTransform.tag; targetTransform = target.GetComponent <Transform>(); Bullets = new B_DestroyInTime[bullet.Length]; LastBullets1 = new B_DestroyInTime[LastBullet1.Length]; bulletAnimator = new Animator[bulletObject.Length]; for (int i = 0; i < bullet.Length; i++) { bullet[i].gameObject.SetActive(false); Bullets[i] = bullet[i].GetComponent <B_DestroyInTime>(); } for (int i = 0; i < LastBullet1.Length; i++) { LastBullet1[i].gameObject.SetActive(false); LastBullets1[i] = LastBullet1[i].GetComponent <B_DestroyInTime>(); } for (int i = 0; i < bulletAnimator.Length; i++) { bulletAnimator[i] = bulletObject[i].GetComponent <Animator>(); } waterball.SetActive(false); ClearEnemy.SetActive(false); HitMessage.SetActive(false); }
protected override void OnNpcHit(NPC npc, HitMessage hitmessage) { if (!npc.IsHostile && hitmessage.IsPlayer) { EndStage(CurrentStage, StageEndReason.CivilianDied); } }
/// <summary> /// Event triggered on the death of an NPC /// </summary> /// <param name="npc">NPC that died</param> /// <param name="hitmessage">info about the hit that killed the NPC</param> private void OnNpcDeath(NPC npc, HitMessage hitmessage) { if (hitmessage.IsPlayer) { StartCoroutine("gameoverWait", false); } }
// 공격 당했을 시 private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag.Equals("waterbullet") && Health > 0) { Health--; headAnimator.SetTrigger("hit"); wingsAnimator.SetTrigger("hit"); bodyAnimator.SetTrigger("hit"); flag = false; if (ThisName.Equals("enemy1")) { UIM.HitEnemy1(); } else if (ThisName.Equals("enemy2")) { UIM.HitEnemy2(); } waterball.SetActive(true); HitMessage.SetActive(true); if (Health > 0) { Invoke("SetFlagAndBall", 2f); } else { Invoke("SetFlagAndBall", 1.5f); } } }
/// <summary> /// Detects limb that was hit and set the scale to 0 to create illusion arm is gone /// </summary> /// <param name="hitMessage"></param> private void LoseLimb(HitMessage hitMessage) { this.hitMessage = hitMessage; if (hitMessage.HitObject != null) { if (_armLeft.Any(obj => obj.name == hitMessage.HitObject.name)) { _armLeft [0].transform.localScale = Vector3.zero; leftArm = true; } else if (_armRight.Any(obj => obj.name == hitMessage.HitObject.name)) { _armRight [0].transform.localScale = Vector3.zero; rightArm = true; } else if (_legLeft.Any(obj => obj.name == hitMessage.HitObject.name)) { _legLeft [0].transform.localScale = Vector3.zero; leftLeg = true; } else if (_legRight.Any(obj => obj.name == hitMessage.HitObject.name)) { _legRight [0].transform.localScale = Vector3.zero; rightLeg = true; } else if (_head.Any(obj => obj.name == hitMessage.HitObject.name)) { _head [0].transform.localScale = Vector3.zero; head = true; } InstantiateObj(); // tijdelijk booleans moeten uitgezet worden na instantiate } }
/// <summary> /// Even triggerd when an npc gets hit /// </summary> /// <param name="npc"></param> /// <param name="hitmessage"></param> protected virtual void OnNpcHit(NPC npc, HitMessage hitmessage) { if (!npc.IsHostile && hitmessage.IsPlayer) { GameOver(); ShowGameOverReason(StageEndReason.CivilianDied); } }
/// <summary> /// Checks tags of hit object to play environment effects or to send hit message to a game object. /// </summary> /// <param name="hit"></param> private void HandleHit(RaycastHit hit) { HitMessage message = new HitMessage( hit.point, hit.transform.gameObject, RaycastObject.transform, RNG.NextFloat(_minDamage, _maxDamage), ImpactForce, true ); bool hitNPC = (hit.transform.gameObject.GetComponentInParent <NPC>() != null) ? true : false; if (hitNPC) { if (ScenarioBase.Instance != null) { if (ScenarioBase.Instance.Started) { Statistics.ShotsHit++; } } } // Check tags to see if it hit the environment or something else switch (hit.transform.tag) { case "Stone": Instantiate(BulletHitStone, hit.point, Quaternion.LookRotation(hit.normal)); AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitStone, AudioController.GunVolume); break; case "Metal": Instantiate(BulletHitMetal, hit.point, Quaternion.Euler(hit.normal)); AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitMetal, AudioController.GunVolume); break; case "Wood": Instantiate(BulletHitWood, hit.point, Quaternion.Euler(hit.normal)); AudioController.PlayAudioAtPoint(hit.point, AudioCategory.GunHitWood, AudioController.GunVolume); break; case "Civilian": break; case "Bird": hit.transform.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver); break; } // It is up to the receiver to implement a OnHit function. SendHitMessage(hit.transform.gameObject, message); }
/// <summary> /// Event triggered when a npc dies /// </summary> /// <param name="npc">the npc that died</param> /// <param name="hitmessage">the info about the hit</param> private void OnNPCDeath(NPC npc, HitMessage hitmessage) { timer = 0; // Check if the npc was killed by a player and was a neutral npc if (!npc.IsHostile && hitmessage.IsPlayer) { // End the current stage EndStage(CurrentStage, StageEndReason.CivilianDied); } }
public void EnergyLow(Asteroid asteroid) { Energy -= asteroid.Power; if (Energy < 0) { Energy = 0; } HitMessage?.Invoke(); }
private void HitPlayer(HitMessage message) { WriteLine($"{_playerName} received HitMessage"); WriteLine($"{_playerName} persisting HitMessage"); Persist(message, hitMessage => { WriteLine($"{_playerName} persisted HitMessage ok, updating actor state"); _health -= message.Damage; }); }
/// <summary> /// Drop the weapon NPC is holding /// </summary> /// <param name="hitmessage"></param> /// <returns></returns> IEnumerator DropWeapon(HitMessage hitmessage) { yield return(new WaitForSeconds(0.25f)); Item.Instance.transform.parent = null; Rigidbody rbody = Item.Instance.GetComponent <Rigidbody>(); rbody.isKinematic = false; Item.Instance.GetComponent <BoxCollider>().enabled = true; rbody.AddForceAtPosition(hitmessage.Source.TransformDirection(Vector3.up) * 300, hitmessage.PointOfImpact); }
/// <summary> /// Specifically shoot a target. Gun orientation does not matter. Shot always hits the specified target. /// Sends HitMessage to target. /// </summary> /// <param name="target"></param> public void Shoot(GameObject target) { PlayGunEffects(); if (target == null) { return; } Rigidbody rb = target.GetComponentsInChildren <Rigidbody>().ToList().First(x => x.name == "Spine1"); float damage = RNG.NextFloat(_minDamage, _maxDamage); HitMessage message = new HitMessage(transform.position, rb.gameObject, RaycastObject.transform, damage, ImpactForce); SendHitMessage(target, message); }
private void SetFlagAndBall() { waterball.SetActive(false); HitMessage.SetActive(false); if (Health > 0) { ThisAudio.clip = enemyHit; ThisAudio.Play(); flag = true; } else { Clear(); } }
public void RagOn(HitMessage hitmessage) { HitMessage = hitmessage; stateType = StateType.One; //set ragbones position _ragBones[0].transform.localPosition = _skinBones[0].transform.localPosition; for (int i = 0; i < _ragBones.Count; i++) { _ragBones[i].transform.localRotation = _skinBones[i].transform.localRotation; } if (!ragFull) { BlendBack(); //initiate blend //naam geraakte bone overeen komt met naam in deze lijst(object van ragbones).. //hoewel de collider op skinbones zit maar zelfde naam heeft werkt dit ook. Bug misschien maar het werkt! if (_upperBodyRag.Any(obj => obj.name == HitMessage.HitObject.name)) { SetKinimatic(_upperBodyRag); } else if (_legsRag.Any(obj => obj.name == HitMessage.HitObject.name)) { SetKinimatic(_legsRag); } } else { if (_ragBones.Any(obj => obj.name == HitMessage.HitObject.name)) { foreach (GameObject rb in _ragBones) { Rigidbody rbody = rb.GetComponent <Rigidbody>(); if (rbody != null) { rbody.isKinematic = false; rbody.detectCollisions = true; } } } stateType = StateType.One; } ApplyForce(); }
/// <summary> /// Handles damage from weapons. Is usually called by sending a message. /// </summary> /// <param name="hitMessage"></param> public void OnHit(HitMessage hitMessage) { if (!IsAlive) { return; } //only save hit if it comes from the player float damage = hitMessage.Damage; if (hitMessage.HitObject.name == "Head" || _oneHit) { damage *= 4; } _hp -= damage; if (_hp <= 0) { Die(hitMessage); } else if (Ragdoll._legsRag.Any(obj => obj.name == hitMessage.HitObject.name)) { // NPC hit in leg, also not dead Ragdoll.ragFull = true; NavMeshAgent.enabled = false; Ragdoll.RagOn(hitMessage); Ragdoll.IsGettingUp = true; StartCoroutine(WaitGetUp()); //wait until activating the oneHit kill boolean StartCoroutine(WaitSetBool()); } else { // NPC not hit in leg, also not dead if (!Ragdoll.IsGettingUp) //prevents unwanted blend Bug { Ragdoll.ragFull = false; Ragdoll.RagOn(hitMessage); } } OnNPCHitEvent(this, hitMessage); }
protected override void OnHit(Collider other, HitMessage msg) { // TODO: Destroy effect switch (msg) { case HitMessage.None: break; case HitMessage.Damage: Destroy(gameObject); break; case HitMessage.Destroy: Destroy(gameObject); break; } }
private void OnTriggerEnter(Collider other) { // damage other HitMessage hmsg = GenerateHitMessage(other, out object obj); switch (hmsg) { case HitMessage.None: break; case HitMessage.Damage: ((Stats)obj).Damage(UsedAction.dmg + atk + strIntScl * GetScalledStat()); OnHitDamage((Stats)obj); break; case HitMessage.Destroy: break; } OnHit(other, hmsg); }
/// <summary> /// Make the NPC fall down and die /// </summary> /// <param name="hitMessage"></param> private void Die(HitMessage hitMessage) { IsAlive = false; //Activate LoseLimb Function of DetachableLimb.cs if Script is on hitObjects root. for Dummies if (hitMessage.HitObject.transform.root.GetComponent <DetachableLimbs>() != null) { hitMessage.HitObject.transform.root.SendMessage("LoseLimb", hitMessage, SendMessageOptions.DontRequireReceiver); } //Ragdoll on Full Ragdoll.ragFull = true; Ragdoll.RagOn(hitMessage); Ragdoll.blend = false; //set item apart from owner if (Item != null && Item.Instance != null && Item.Instance.GetComponent <Rigidbody>() != null) { StartCoroutine(DropWeapon(hitMessage)); } NavMeshAgent.enabled = false; NavMeshObstacle.enabled = true; if (IsHostile) { Statistics.DeadHostilesByPlayer++; HostileNpcs.Remove(this); } else { Statistics.DeadFriendliesByPlayer++; } OnNPCDeathEvent(this, hitMessage); }
private static Message Convert(string exchangeCode, HitCommand hitCommand) { XmlNode ordersNode = hitCommand.Content; Order[] orders; CommandConvertor.Parse(ordersNode, out orders); HitMessage hitMessage = new HitMessage(exchangeCode, orders); return hitMessage; }
/// <summary> /// Even that triggers when the npc gets hit /// </summary> /// <param name="npc"></param> /// <param name="hitmessage"></param> private void OnHitEvent(NPC npc, HitMessage hitmessage) { }
private void SendHitMessage(GameObject receiver, HitMessage message) { // Send this message to both root and self to ensure gameobject can receive message receiver.transform.root.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver); receiver.transform.SendMessage("OnHit", message, SendMessageOptions.DontRequireReceiver); }
protected override void OnHit(Collider other, HitMessage msg) { // TODO: hit effects }
/// <summary> /// react to a hit /// </summary> /// <param name="hitMessage"></param> public void OnHit(HitMessage hitMessage) { Death(); }
protected abstract void OnHit(Collider other, HitMessage msg);
private void HitPlayer(HitMessage message) { WriteLine($"{this._playerName} received HitMessage"); this._health -= message.Damage; }
/// <summary> /// Even that is triggered when a NPC dies /// </summary> /// <param name="npc"></param> private void OnDeathEvent(NPC npc, HitMessage hitmessage) { }
private void Process(HitMessage hitMessage) { this._ExchangeDataManager.ProcessHitMessage(hitMessage); }