News › Forums › RAIN › General Discussion and Troubleshooting › How can this AI shoot?
Tagged: AI, javascript, RAIN
This topic contains 1 reply, has 2 voices, and was last updated by prime 1 year, 11 months ago.
-
AuthorPosts
-
November 27, 2022 at 4:31 am #34426
I am trying to get the AI to shoot the player. I have set up the sensors so that the player can be detected. Then, the AI moves towards the player. When the player is in range of the AI, the AI should raycast the player and print that it has hit the player. However, I get a NULL REFERENCE EXCEPTION at line 47, where the code raycasts. Could someone please help me with this? Here is the code:
import RAIN.Core; import RAIN.Action; @RAINAction class aiShootPlayer extends RAIN.Action.RAINAction { private var woodenImpactParticle : GameObject; private var concreteImpactParticle : GameObject; private var dirtImpactParticle : GameObject; private var metalImpactParticle : GameObject; private var bodyImpactParticle : GameObject; private var shootPos : GameObject; private var dist : float = 50; private var showBlood : int = 0; function newclass() { actionName = "aiShootPlayer"; } function Start(ai:AI):void { super.Start(ai); } function Execute(ai:AI):ActionResult { showBlood = PlayerPrefs.GetInt("GraphicsShowBlood", 0); shootPos = ai.WorkingMemory.GetItem("ShootPos") as GameObject; woodenImpactParticle = ai.WorkingMemory.GetItem("WoodenImpactParticle") as GameObject; concreteImpactParticle = ai.WorkingMemory.GetItem("ConcreteImpactParticle") as GameObject; dirtImpactParticle = ai.WorkingMemory.GetItem("DirtImpactParticle") as GameObject; metalImpactParticle = ai.WorkingMemory.GetItem("MetalImpactParticle") as GameObject; bodyImpactParticle = ai.WorkingMemory.GetItem("BodyImpactParticle") as GameObject; Shoot(); return ActionResult.SUCCESS; } function Stop(ai:AI):void { super.Stop(ai); } function Shoot() { var hit : RaycastHit; if (Physics.Raycast(this.transform.position, Vector3.forward, hit, 50))//shootPos.transform.position, Vector3.forward, hit, 50)) { if (hit.gameObject.tag.ToLower() == "player") { print("Hit player"); Object.Instantiate(bodyImpactParticle, hit.point, bodyImpactParticle.transform.rotation); } } } }
and here is the XML Behaviour Tree:
<behaviortree version="1.1" repeatuntil="" name="soldierAITree"><parallel tiebreaker="fail" succeed="all" repeatuntil="" name="root" fail="any"><detect sensor=""eyes"" repeatuntil="running" name="detectEyes" entityobjectvariable="entityPlayerPos" aspectvariable="" aspectobjectvariable="" aspect=""entityPlayerVisual"" /><detect sensor=""shootRange"" repeatuntil="running" name="detectShootRange" entityobjectvariable="entityPlayerTarget" aspectvariable="" aspectobjectvariable="" aspect=""entityPlayerVisual"" /><selector usepriorities="False" repeatuntil="" name="ExecuteAll"><constraint repeatuntil="" priority="" name="IfTargetNull" constraint="entityPlayerPos == null && entityPlayerTarget == null"><parallel tiebreaker="fail" succeed="all" repeatuntil="" name="ExecuteAll" fail="any"><waypointpatrol waypointsetvariable="PatrolRoute" waypointactiontype="patrol" traversetype="pingpong" traverseorder="forward" repeatuntil="" pathtargetvariable="" name="patrol" movetargetvariable="nextPos"><move turnspeed="" repeatuntil="" name="move" movetarget="nextPos" movespeed="2" facetarget="" closeenoughdistance="" closeenoughangle="" /></waypointpatrol></parallel></constraint><constraint repeatuntil="" priority="" name="If PlayerFound" constraint="entityPlayerPos != null"><parallel tiebreaker="fail" succeed="all" repeatuntil="" name="parallel" fail="any"><constraint repeatuntil="" name="IfInRange" constraint="entityPlayerTarget != null "><parallel tiebreaker="fail" succeed="all" repeatuntil="" name="ExecuteAll" fail="any"><action repeatuntil="" parametervalues="" parameters="" namespace="(global)" name="ShootPlayer" classname="aiShootPlayer" /></parallel></constraint><constraint repeatuntil="" name="IfNotInRange" constraint="entityPlayerTaget == null"><parallel tiebreaker="fail" succeed="all" repeatuntil="" name="ExecuteAll" fail="any"><move turnspeed="" repeatuntil="" name="move" movetarget="entityPlayerPos" movespeed="2" facetarget="" closeenoughdistance="" closeenoughangle="" /></parallel></constraint></parallel></constraint></selector></parallel></behaviortree>
Cheers,
Stormy102
November 30, 2022 at 9:02 am #34434Your code is running in a RAINAction, not in a MonoBehaviour. “this” is not a unity component and so “this.transform” is not valid. You probably want “ai.Body.transform”, but you will have to pass that in to your shoot function.
-
AuthorPosts
You must be logged in to reply to this topic.