예제 #1
0
    void Update()
    {
        hitByRay.Clear();

        var  hits  = RayCastUtil.RayHitsFromCamera(layerMask);
        bool first = true;

        foreach (RayHitInfo hit in hits)
        {
            hitByRay.Add(hit.Hit, hit.hitPos);
            if (first)
            {
                HitFirst = hit;
                first    = false;
            }
            if (hit.Hit.ShutOutRay)
            {
                break;
            }
        }

        if (first)
        {
            HitFirst = null;
        }
    }
예제 #2
0
 public RayHitInfo(RayHitInfo copyInfo)
 {
     this.HitType          = copyInfo.HitType;
     this.ClosestHitObject = copyInfo.ClosestHitObject;
     this.HitPosition      = copyInfo.HitPosition;
     this.NormalAtHit      = copyInfo.NormalAtHit;
     this.DistanceToHit    = copyInfo.DistanceToHit;
 }
예제 #3
0
    //We're just treating gun as a single raycaster, but making a multiraycaster should be very easy
    public RayHitInfo ServerShoot(Gunfish gunfish)
    {
        rb = gunfish.rb;
        RayHitInfo rayHitInfo = new RayHitInfo();
        float      angle      = NetworkManager.singleton.client.GetRTT() / 1000f * rb.angularVelocity;
        Vector3    deltaPos   = NetworkManager.singleton.client.GetRTT() / 1000f * rb.velocity;
        //float x = Mathf.Tan(angle * Mathf.Deg2Rad);
        Vector3      point  = barrelPoint.transform.right;                               // + barrelPoint.transform.up * x;
        Ray          ray    = new Ray(barrelPoint.transform.position + deltaPos, point); //- barrelPoint.transform.position);
        RaycastHit2D rayHit = Physics2D.Raycast(ray.origin, ray.direction, shotInfo.distance);

        if (rayHit)
        {
            GameObject hit = rayHit.collider.gameObject;

            //if gunfish
            if (hit.CompareTag("Gunfish"))
            {
                rayHitInfo.netId   = hit.GetComponentInParent <Gunfish>().netId;
                rayHitInfo.color   = Color.red;
                rayHitInfo.hitType = HitType.Fish;
            }

            //if generic object
            else if (hit.CompareTag("Ground"))
            {
                //rayHitInfo.netId.Value defaults to zero
                rayHitInfo.color   = hit.gameObject.GetComponent <SpriteRenderer>().color;
                rayHitInfo.hitType = HitType.Wood;
            }

            else if (hit.CompareTag("Object"))
            {
                rayHitInfo.color   = hit.gameObject.GetComponent <SpriteRenderer>().color;
                rayHitInfo.hitType = HitType.Wood;
                if (hit.GetComponent <Rigidbody2D>())
                {
                    hit.GetComponent <Rigidbody2D>().AddForce(-rayHit.normal * shotInfo.force);
                }
            }

            rayHitInfo.normal = rayHit.normal;
            rayHitInfo.end    = rayHit.point;
        }
        else
        {
            //if nothing was hit
            rayHitInfo.netId = NetworkInstanceId.Invalid;
            rayHitInfo.end   = barrelPoint.transform.position + (transform.right * shotInfo.distance);
        }

        rayHitInfo.origin   = barrelPoint.transform.position;
        rayHitInfo.shotType = shotType;

        return(rayHitInfo);
    }
예제 #4
0
    public bool UseBaseAttack(RayHitInfo hit_info)
    {
        if (Vector3.Distance(hit_info.hit_point, (transform.position + Vector3.up * 1.5f)) < 2)
        {
            CastSkill(SkillButton.LMB, hit_info);
            return(true);
        }

        return(false);
    }
예제 #5
0
        public static ObjectInstance Object(RayHitInfo input)
        {
            var output = JS.instance.engine.Object.Construct();

            output["hit"]      = input.hit != 0;
            output["distance"] = (double)input.distance;
            output["position"] = Object(input.position);
            output["normal"]   = Object(input.normal);
            return(output);
        }
예제 #6
0
    private void HandleHitInfo(RayHitInfo rayHitInfo)
    {
        if (rayHitInfo.netId != NetworkInstanceId.Invalid)
        {
            EffectsManager.instance.DisplayBulletHit(rayHitInfo.end, rayHitInfo.normal, rayHitInfo.color, rayHitInfo.hitType);

            if (ownedGunfish && rayHitInfo.netId == ownedGunfish.netId)
            {
                ownedGunfish.Hit((rayHitInfo.end - rayHitInfo.origin).normalized, rayHitInfo.shotType);
            }
        }

        EffectsManager.instance.DisplayBulletLine(rayHitInfo.origin, rayHitInfo.end, ownedGunfish.gun.shotTrailColor);
    }
예제 #7
0
    public void OnGunshot(NetworkMessage netMsg)
    {
        GunfishMsg msg = netMsg.ReadMessage <GunfishMsg>();

        //Get the gunfish, tell it to shoot, and get the hit information
        Gunfish gunfish = NetworkServer.FindLocalObject(msg.netId).GetComponent <Gunfish>();

        //Presuming our gun is a single raycaster
        RayHitInfo rayHitInfo = gunfish.ServerShoot(gunfish);

        NetworkServer.SendToAll(MessageTypes.RAYHIT, new RayHitMsg(rayHitInfo));

        //This message handles gunshot audio and muzzle flash
        NetworkServer.SendToAll(MessageTypes.GUNSHOT, new GunfishMsg(msg.netId));
    }
예제 #8
0
        public static ObjectInstance GetCollisionRayModel(ObjectInstance ray, ObjectInstance position, ObjectInstance rotation, string modelPath)
        {
            var rayo      = Disaster.TypeInterface.Ray(ray);
            var model     = Disaster.Assets.Model(modelPath);
            var transform = new Disaster.Transformation(Disaster.TypeInterface.Vector3(position), Disaster.TypeInterface.Vector3(rotation), Vector3.One).ToMatrix();

            Matrix4x4.Invert(transform, out Matrix4x4 inverse);
            rayo.position  = Vector3.Transform(rayo.position, inverse);
            rayo.direction = Vector3.TransformNormal(rayo.direction, inverse);
            //model.transform = transform;

            RayHitInfo output = Raylib.GetCollisionRayModel(rayo, model);

            //model.transform = Matrix4x4.Identity;
            return(Disaster.TypeInterface.Object(output));
        }
예제 #9
0
    public void CastSkill(SkillButton skill_index, RayHitInfo hit_info)
    {
        if (equip_skills[(int)skill_index].IsOnCooldown())
        {
            StartCoroutine(SkillOnCDDisplay());
            return;
        }

        if (cast_timer > 0)
        {
            Debug.Log("Already casting a skill");
        }
        else
        {
            if (equip_skills[(int)skill_index].cast_time_mult == 0)
            {
                cast_timer = 0;
            }
            else
            {
                cast_timer = 1 / (equip_skills[(int)skill_index].cast_time_mult * attack_speed.Buffed_value);
            }

            if (CharacterController.instance.SpendResource(equip_skills[(int)skill_index].cost))
            {
                CharacterController.instance.move_controller.StopMovement();
                if (cast_timer != 0)
                {
                    pc_animator.SetInteger("Weapon", 1);
                    pc_animator.speed = 1 / cast_timer;
                    pc_animator.SetTrigger("AttackTrigger");
                    is_attacking = true;
                }
                equip_skills[(int)skill_index].CastSkill(GetCastInfo(transform.position, hit_info.hit_point));
                transform.rotation = Quaternion.LookRotation(hit_info.hit_point - (transform.position + Vector3.up * 1.5f), Vector3.up);
            }
            else
            {
                StartCoroutine(SkillNoMoreManaDisplay());
            }
        }
    }
예제 #10
0
        public unsafe static int Main()
        {
            // Initialization
            //--------------------------------------------------------------------------------------
            const int screenWidth  = 800;
            const int screenHeight = 450;

            InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh picking");

            // Define the camera to look into our 3d world
            Camera3D camera;

            camera.position = new Vector3(20.0f, 20.0f, 20.0f);                     // Camera3D position
            camera.target   = new Vector3(0.0f, 8.0f, 0.0f);                        // Camera3D looking at point
            camera.up       = new Vector3(0.0f, 1.6f, 0.0f);                        // Camera3D up vector (rotation towards target)
            camera.fovy     = 45.0f;                                                // Camera3D field-of-view Y
            camera.type     = CAMERA_PERSPECTIVE;                                   // Camera3D mode type

            Ray ray = new Ray();                                                    // Picking ray

            Model     tower   = LoadModel("resources/models/turret.obj");           // Load OBJ model
            Texture2D texture = LoadTexture("resources/models/turret_diffuse.png"); // Load model texture

            Utils.SetMaterialTexture(ref tower, 0, MAP_ALBEDO, ref texture);        // Set map diffuse texture

            Vector3     towerPos    = new Vector3(0.0f, 0.0f, 0.0f);                // Set model position
            Mesh *      meshes      = (Mesh *)tower.meshes.ToPointer();
            BoundingBox towerBBox   = MeshBoundingBox(meshes[0]);                   // Get mesh bounding box
            bool        hitMeshBBox = false;
            bool        hitTriangle = false;

            // Test triangle
            Vector3 ta = new Vector3(-25.0f, 0.5f, 0.0f);
            Vector3 tb = new Vector3(-4.0f, 2.5f, 1.0f);
            Vector3 tc = new Vector3(-8.0f, 6.5f, 0.0f);

            Vector3 bary = new Vector3(0.0f, 0.0f, 0.0f);

            SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode

            SetTargetFPS(60);                   // Set our game to run at 60 frames-per-second

            //----------------------------------------------------------------------------------
            // Main game loop
            //--------------------------------------------------------------------------------------
            while (!WindowShouldClose())        // Detect window close button or ESC key
            {
                //----------------------------------------------------------------------------------
                // Update
                //----------------------------------------------------------------------------------
                UpdateCamera(ref camera);          // Update camera

                // Display information about closest hit
                RayHitInfo nearestHit    = new RayHitInfo();
                string     hitObjectName = "None";
                nearestHit.distance = FLT_MAX;
                nearestHit.hit      = false;
                Color cursorColor = WHITE;

                // Get ray and test against ground, triangle, and mesh
                ray = GetMouseRay(GetMousePosition(), camera);

                // Check ray collision aginst ground plane
                RayHitInfo groundHitInfo = GetCollisionRayGround(ray, 0.0f);

                if ((groundHitInfo.hit) && (groundHitInfo.distance < nearestHit.distance))
                {
                    nearestHit    = groundHitInfo;
                    cursorColor   = GREEN;
                    hitObjectName = "Ground";
                }

                // Check ray collision against test triangle
                RayHitInfo triHitInfo = GetCollisionRayTriangle(ray, ta, tb, tc);

                if ((triHitInfo.hit) && (triHitInfo.distance < nearestHit.distance))
                {
                    nearestHit    = triHitInfo;
                    cursorColor   = PURPLE;
                    hitObjectName = "Triangle";

                    bary        = Vector3Barycenter(nearestHit.position, ta, tb, tc);
                    hitTriangle = true;
                }
                else
                {
                    hitTriangle = false;
                }

                RayHitInfo meshHitInfo = new RayHitInfo();

                // Check ray collision against bounding box first, before trying the full ray-mesh test
                if (CheckCollisionRayBox(ray, towerBBox))
                {
                    hitMeshBBox = true;

                    // Check ray collision against model
                    // NOTE: It considers model.transform matrix!
                    meshHitInfo = GetCollisionRayModel(ray, tower);

                    if ((meshHitInfo.hit) && (meshHitInfo.distance < nearestHit.distance))
                    {
                        nearestHit    = meshHitInfo;
                        cursorColor   = ORANGE;
                        hitObjectName = "Mesh";
                    }
                }
                hitMeshBBox = false;
                //----------------------------------------------------------------------------------

                // Draw
                //----------------------------------------------------------------------------------
                BeginDrawing();

                ClearBackground(RAYWHITE);

                BeginMode3D(camera);

                // Draw the tower
                // WARNING: If scale is different than 1.0f,
                // not considered by GetCollisionRayModel()
                DrawModel(tower, towerPos, 1.0f, WHITE);

                // Draw the test triangle
                DrawLine3D(ta, tb, PURPLE);
                DrawLine3D(tb, tc, PURPLE);
                DrawLine3D(tc, ta, PURPLE);

                // Draw the mesh bbox if we hit it
                if (hitMeshBBox)
                {
                    DrawBoundingBox(towerBBox, LIME);
                }

                // If we hit something, draw the cursor at the hit point
                if (nearestHit.hit)
                {
                    DrawCube(nearestHit.position, 0.3f, 0.3f, 0.3f, cursorColor);
                    DrawCubeWires(nearestHit.position, 0.3f, 0.3f, 0.3f, RED);

                    Vector3 normalEnd;
                    normalEnd.X = nearestHit.position.X + nearestHit.normal.X;
                    normalEnd.Y = nearestHit.position.Y + nearestHit.normal.Y;
                    normalEnd.Z = nearestHit.position.Z + nearestHit.normal.Z;

                    DrawLine3D(nearestHit.position, normalEnd, RED);
                }

                DrawRay(ray, MAROON);

                DrawGrid(10, 10.0f);

                EndMode3D();

                // Draw some debug GUI text
                DrawText(string.Format("Hit Object: {0}", hitObjectName), 10, 50, 10, BLACK);

                if (nearestHit.hit)
                {
                    int ypos = 70;

                    var x = string.Format("Distance: {0:000.00}", nearestHit.distance);
                    DrawText(string.Format("Distance: {0:000.00}", nearestHit.distance), 10, ypos, 10, BLACK);

                    DrawText(string.Format("Hit Pos: {0:000.00} {1:000.00} {2:000.00}",
                                           nearestHit.position.X,
                                           nearestHit.position.Y,
                                           nearestHit.position.Z), 10, ypos + 15, 10, BLACK);

                    DrawText(string.Format("Hit Norm: {0:000.00} {1:000.00} {2:000.00}",
                                           nearestHit.normal.X,
                                           nearestHit.normal.Y,
                                           nearestHit.normal.Z), 10, ypos + 30, 10, BLACK);

                    if (hitTriangle)
                    {
                        DrawText(string.Format("Barycenter:{0:000.00} {1:000.00} {2:000.00}", bary.X, bary.Y, bary.Z), 10, ypos + 45, 10, BLACK);
                    }
                }

                DrawText("Use Mouse to Move Camera", 10, 430, 10, GRAY);

                DrawText("(c) Turret 3D model by Alberto Cano", screenWidth - 200, screenHeight - 20, 10, GRAY);

                DrawFPS(10, 10);

                EndDrawing();
                //----------------------------------------------------------------------------------
            }

            // De-Initialization
            //--------------------------------------------------------------------------------------
            UnloadModel(tower);         // Unload model
            UnloadTexture(texture);     // Unload texture

            CloseWindow();              // Close window and OpenGL context
            //--------------------------------------------------------------------------------------

            return(0);
        }
예제 #11
0
    // Update is called once per frame
    void Update()
    {
        if (game_over_canvas != null && game_over_canvas.activeSelf)
        {
            return;
        }

        //Resource/health regen
        if (curr_health < variables_stats[(int)StatId.MaxHealth].Buffed_value)
        {
            curr_health += variables_stats[(int)StatId.HealthRegen].Buffed_value * Time.deltaTime;
            if (curr_health > variables_stats[(int)StatId.MaxHealth].Buffed_value)
            {
                curr_health = variables_stats[(int)StatId.MaxHealth].Buffed_value;
            }
        }

        if (curr_resource < variables_stats[(int)StatId.MaxResource].Buffed_value)
        {
            curr_resource += variables_stats[(int)StatId.ResourceRegen].Buffed_value * Time.deltaTime;
            if (curr_resource > variables_stats[(int)StatId.MaxResource].Buffed_value)
            {
                curr_resource = variables_stats[(int)StatId.MaxResource].Buffed_value;
            }
        }


        if (Input.GetKeyUp(KeyCode.Escape))
        {
            if (skill_controller.GetSkillSelectionUIStatus())
            {
                skill_controller.ForceSkillSelectioUIStatus(false);
                return;
            }
            if (inventory_canvas.activeSelf)
            {
                inventory_canvas.SetActive(false);
                return;
            }
            if (character_stats_canvas.activeSelf)
            {
                character_stats_canvas.SetActive(false);
                return;
            }

            if (main_menu_canvas != null)
            {
                main_menu_canvas.SetActive(!main_menu_canvas.activeSelf);
            }
        }

        if (main_menu_canvas.activeSelf)
        {
            return;
        }

        if (Input.GetKeyUp(KeyCode.I))
        {
            inventory_canvas.SetActive(!inventory_canvas.activeSelf);
        }
        if (Input.GetKeyUp(KeyCode.C))
        {
            character_stats_canvas.SetActive(!character_stats_canvas.activeSelf);
        }


        //Don't read inputs if UI active
        if (inventory_canvas.activeSelf || character_stats_canvas.activeSelf || skill_controller.skill_selection_UI.activeSelf)
        {
            return;
        }

        //Read game inputs
        if (Input.GetMouseButton(0) && !Input.GetKey(KeyCode.LeftShift))
        {
            Debug.Log("Processing Left Click");
            int mask = LayerMask.GetMask("Floor", "Enemy", "Item");

            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, mask);
            if (ray_hit.hitted)
            {
                if (ray_hit.layer_hit == LayerMask.NameToLayer("Floor"))
                {
                    Debug.Log("moving with the floor");
                    move_controller.MoveToPosition(ray_hit.hit_point);
                }
                else if (ray_hit.layer_hit == LayerMask.NameToLayer("Enemy"))
                {
                    Debug.Log("Enemy Attacked");
                    if (!skill_controller.UseBaseAttack(ray_hit))
                    {
                        move_controller.MoveToEnemy(ray_hit.go_hit.transform);
                    }
                }
                else if (ray_hit.layer_hit == LayerMask.NameToLayer("Item"))
                {
                    Debug.Log("picking the item");
                    ray_hit.go_hit.GetComponent <ItemWorld>().to_pick = true;
                    move_controller.MoveToPosition(ray_hit.hit_point);
                }
            }
        }

        if (Input.GetMouseButtonDown(0) && Input.GetKey(KeyCode.LeftShift))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.LMB, ray_hit);
            }
        }

        if (Input.GetMouseButtonDown(1))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.RMC, ray_hit);
            }
        }

        if (Input.GetKeyUp(KeyCode.Alpha1))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.NUM_1, ray_hit);
            }
        }
        if (Input.GetKeyUp(KeyCode.Alpha2))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.NUM_2, ray_hit);
            }
        }
        if (Input.GetKeyUp(KeyCode.Alpha3))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.NUM_3, ray_hit);
            }
        }
        if (Input.GetKeyUp(KeyCode.Alpha4))
        {
            RayHitInfo ray_hit = RayCastHandle(Input.mousePosition, LayerMask.GetMask("Floor", "Enemy"));
            if (ray_hit.hitted)
            {
                skill_controller.CastSkill(SkillButton.NUM_4, ray_hit);
            }
        }


        if (Input.GetKeyDown(KeyCode.F1))
        {
            invincible = !invincible;
            invincible_display.SetActive(invincible);
        }
        if (Input.GetKeyDown(KeyCode.F2))
        {
            no_mana_cost = !no_mana_cost;
            no_mana_display.SetActive(no_mana_cost);
        }
    }
예제 #12
0
 public RayHitMsg(RayHitInfo hitInfo)
 {
     this.rayHitInfo = hitInfo;
 }