官术网_书友最值得收藏!

Time for action – Making a custom weapon

The best way to learn about inheritance is to see it in action, and the most basic way to see it is through a game's weapons. They're easy to modify and are a good starting point for learning about the UDK's classes.

  1. Create a new .uc file in our AwesomeGame/Classes folder and call it AwesomeGun.uc. Write the following code in it:
    class AwesomeGun extends UTWeap_RocketLauncher_Content;
    
    defaultproperties
    {
        FireInterval(0)=0.1
        ShotCost(0)=0
    }
  2. Compile our class. Now here's where we would ask, "How did it compile? I didn't declare any variables, but we're putting some in our default properties!" This is how inheritance works. We already saw the ShotCost variable in UTWeapon on line 27:
    /** Holds the amount of ammo used for a given shot */
    var array<int> ShotCost;

    If we look higher up in the class tree at Weapon, we can see FireInterval on line 44 (as of the October 2011 build):

    /** Holds the amount of time a single shot takes */
    var()         Array<float>            FireInterval;

    When we create our class, any variables, properties, and functions of the classes higher in the tree are automatically created inside our class. This saves a lot of duplicated code, as anything that's going to be common to all of the subclasses only needs to be declared once. Remember when I said that a lot of programming is reading through the source code? This is why. To understand what functionality is already there and what variables we can already use, it's important to read through the classes higher up in the tree to see what they can do. This also prevents us from reinventing the wheel as it were, writing code to do something that already exists.

    In our case, using the already existing FireInterval and ShotCost keeps us from having to write any code at all to change the way our gun works. We can just change the default properties in our class.

  3. Open up the editor. To use our new weapon, we're going to need to place a weapon factory. In the Actor Classes browser, make sure Categories is unchecked, then browse down to NavigationPoint | PickupFactory | UDKPickupFactory | UTPickupFactory | UTWeaponPickupFactory. Place a UTWeaponPickupFactory on the floor where our AwesomeActors are, and delete our AwesomeActors.
    Time for action – Making a custom weapon
  4. Double-click on the factory to open its properties, and change its Weapon Pickup Class to our AwesomeGun.
    Time for action – Making a custom weapon
  5. One minor thing to do, unrelated to our programming. Since the weapon factory we placed is a navigation point, we need to rebuild paths in the editor to prevent us from getting warnings about it when we open up the map again later. Click on the build paths icon in the top toolbar, and then close the window that comes up afterwards.
    Time for action – Making a custom weapon
  6. Save the map and test it out. Run over to the weapon factory to pick up our custom gun, and then spray the level down with rockets.
    Time for action – Making a custom weapon

What just happened?

Boosh! And/or kakow! The changes we made were simple, but we can easily see how they affected the game. Changing the ShotCost to 0 effectively gave us infinite ammo, since firing a rocket consumes 0 ammo. Changing the FireInterval to 0.1 made it so that we fire ten rockets per second.

It's important to remember that variables and functions that are inherited only come from classes directly above ours in the class tree. As an experiment, let's create a subclass of our AwesomeGun.

主站蜘蛛池模板: 郓城县| 尉氏县| 伊吾县| 滦南县| 辰溪县| 宜阳县| 玉溪市| 连云港市| 铁岭市| 伽师县| 鄱阳县| 福建省| 札达县| 六盘水市| 抚顺县| 武穴市| 定安县| 宣化县| 德惠市| 比如县| 东宁县| 邻水| 香格里拉县| 米易县| 扎囊县| 融水| 内丘县| 长兴县| 大理市| 四川省| 英德市| 阳江市| 宝山区| 邮箱| 内丘县| 溆浦县| 泰顺县| 永吉县| 冕宁县| 汨罗市| 桦南县|