【キャラクターメモ】敵キャラクター「ビードラ」の作成

というわけで、朝の冷え込みがきつくなってきた山梨です。
こんな時に限ってサーバーメンテ日なので、朝4時起きだったりしました。

shot2ss20151028190854917

今回は新しい敵キャラクター「ビードラ」の作成になります!
既に「バブぴょん」という敵キャラクターを作ってあるので、それに続く第2のデフォルトスタンダードな敵キャラです。

名前の由来は「ビート(殴る、叩く)」とドラゴンを掛け合わせたものです。
あまりドラゴンという感じはしなかったりしますが、爪や尻尾はそれっぽくなっています。
まあ敵キャラなので深い意味はないです。

位置付けはマリオでいうクリボーに対するノコノコといったところでしょうか。
人型に近い体格なので亜種や派生種も作りやすそうです。

モデリングとテクスチャ

パっと見は猫とドラゴンを混ぜたような感じです。
体格だけで言えばモグフィーに近いものがあります。

shot2ss20151025231354379

色合いのせいか、「グランブルーファンタジー」の某トカゲと似ている気がします。
ついでに色合いがバブぴょんとも変わり映えしないので、いっそ青色にしようかと考えていたりします。
勿論リンゴが好きとかそういう設定はありません。

shot2ss20151025231300428

耳は前のめりでカーブの効いた形状になっています。
曲面を普通に作るのは難しいのですが、モディファイアの「Subdivision Surface」を使うと簡単に作れます。
Cubeをベースに、エディットモードでエルード(E)やループカット(Ctrl+R)を使ってみましょう。

shot2ss20151025231412891

足も翼も尻尾もCubeをベースにSubdivision Surfaceで作りました。
個人的にはすごく使いやすいモディファイアなので、最近のモデリングでよく使っています。
ただApply後に頂点数が増えすぎてしまうことがあるので、Decimateモディファイアで適度に減らすといい感じ。

shot2ss20151025231454954

頭のオブジェクトにテクスチャを貼り付けます。
かなり適当ですが、敵キャラをまじまじと見る機会もないと思うので気にしません!

実は最近ペンタブを買ったので、それを用いて描いています。
まだ上手く扱えず、イラストレベルのものは到底描けませんが、ちょっとテクスチャ描く程度なら手軽にできます。

ゲーム的な設定

バブぴょんと同じく、いろいろな場所に登場する予定の敵です。
歩いて移動し、接近してプレイヤーを攻撃します。
バブぴょんよりは体力・攻撃力共に高く設定する予定です。

攻撃アクションは両手を使ったパンチがメインです。
それだけではつまらないので、飛び蹴りや頭突きようなものを入れるのも面白いかもしれません。
人型故の汎用性があるので、何か持たせたり付けたりしてもよさそうです。

ちなみに翼に相応する部分はありますが、飛べるようにするつもりはありません。
何のためについているかは気にしない方向で!
現実でもペンギンとか翼あっても飛ばないですよね。それと一緒です!

まとめ

そんなわけで、新しく敵キャラクターを増やしてみました!
ゲームを進めても同じような敵ばかりでは飽きてしまうので、敵キャラクターもなるべく増やしていきたいところ。
とりあえずはあと1体くらい体格の異なる敵を作ってみたいと考えています。
バランスを見ると宙に浮く敵が欲しいですね。

【開発メモ】攻撃後の回避アクションの実装

というわけで、今回のお題はこれです!

20150605_1

攻撃後の隙や硬直を回避行動でキャンセルできる機能の実装になります!
今日のアクションゲームにはほとんど搭載されているものですね。
こういった基本的な機能は思いついた時に実装してしまいたいところです。
既に回避という名目で「短距離をダッシュする」というアクションがあるので、これに機能を上乗せする感じになります。

どうでもいいですが、GIFアニメーションを撮るのがかなり下手です。
撮ったものを編集したりするソフトがあれば良いですが・・・現状ではベタ貼り状態ですorz

攻撃中の移動制限

そもそも現状では攻撃中でもヌルヌル動けてしまうので、まずはそこから修正。
PlayerクラスのUpdate内に以下の処理を加えます。

void Update() {
    stateInfo = animator.GetCurrentAnimatorStateInfo(0);

    if (stateInfo.IsTag("Attack")) {
        isAttack = true;
        charMotor.canControl = false;
    } else {
        isAttack = false;
        charMotor.canControl = true;
    }
}

AnimatorControllerの攻撃系ステートにタグをつけ、PlayerクラスのUpdate内で攻撃中か判定します。
攻撃モーション中であればCharacterMotorのcanControlをfalseに設定。
攻撃する方向は動かせるようにしたいので、PlatformInputControllerはそのままにしておきます。

isAttackはPlayerクラスのフィールドに持たせ、stateInfoから判定して設定しています。
キャラが攻撃中かどうか判定できるようになり、他の機能を実装する際に便利です。

回避方向の制御

当たり前ですが、一方向にだけ回避できてもあまり意味がないですね。
3Dアクションである以上、移動キーを入れた方向にクルッと回避して欲しいところです。

void Update() {
    // 回避ボタン入力時
    if(Input.GetMouseButtonDown(2) || Input.GetButtonDown("Dash")){
        if (isAttack) {
            // 攻撃モーション中の回避可能タイミングを制御
            if (GameConstants.ATTACK_CANCEL_TIME < animator.GetCurrentAnimatorStateInfo(0).normalizedTime) {
                Vector3 inputDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

                // 入力が行われた場合、入力方向に振り向かせる
                if (inputDirection != Vector3.zero) {
                    transform.rotation = (inputDirection);
                }
                iTween.ValueTo(gameObject, iTween.Hash(
                    "from", transform.forward,
                    "to", Vector3.zero,
                    "onupdate", "Thrust",
                    "time", 1.0f,
                    "easetype", "easeOutQuart")
                );
            }
        }
    }
}

protected void Thrust(Vector3 v) {
    charControl.Move(v * Time.deltaTime * 100);
}

とりあえず入力した方向に前転するようにしました!
MoveByでtransform.forwardを指定しても上手くいかないので、Value.ToのonupdateでCharacterControllerのMoveを実行するようにしています。

Moveで移動させるわけですが、PlatformInputControllerの「入力方向に振り向く」という処理が入り、思うように移動させることができません。
なので、キー入力された方向に瞬時に振り向き、その状態で前方に移動させるようにしました!
移動キーを入力した方向をVector3型のx、z軸に設定しておき、Quaternion.LookRotationで振り向かせます。
もし入力がない場合=零ベクトルの場合は振り向かないように制御することで、キャラクターを前方に移動させることができます。

ちなみにonupdate内の関数でtransform.positionを直接加減する方法もあります。
ただし移動時に判定を考慮しないため、壁やブロックをぶち抜いて移動してしまいます。
ということで、アクションゲームには不向きな方法かと思われます。

回避可能なタイミングの制御

攻撃モーションの全タイミングでキャンセルを受け付けるのは流石にまずいので、特定のタイミングのみ受け付けるようにします。
一般的なゲームと同じく、攻撃モーションの後半ぐらいからでいいでしょう。
モーション毎に設定できるのが理想ですが、自分のスクリプト構成では面倒そうだったので、とりあえず固定値でいきます。

上で記載したスクリプトの5行目付近のif文が該当します。
AnimatorStateInfo.normalizedTimeで現在のステートの実行時間が割合として取得できます。
ステートが半分再生された場合は0.5、全て再生された場合は1.0といった感じです。
なので「モーションの後半からのみ入力を受け付けたい!」という場合、normalizedTimeが0.5より大きいかを判定すればOKです。

固定値を直に書くのはよろしくないので、GameConstantsという定数用クラスに「ATTACK_CANCEL_TIME」を定義し、そこに0.5fを設定しました。
定数を扱う方法については以下の記事をご参照ください。

【再編集】Unity開発メモまとめ (その他)

まとめ

そんなわけで、攻撃後の回避アクションを実装してみました!
慣れた人ほど硬直はもどかしく感じるもので、プレイヤーの介入で快適になる要素はなるべく入れていきたいところ。
キャンセルできすぎても問題なので、その加減が重要でもありますね。

2015/11/15 追記

上記実装では、カメラのY軸の角度が変化した際に変な方向を向いてしまいます。
どの角度からでも入力方向を振り向くようにするため、スクリプトに修正を加えました。
7行目のinputDirectionの算出時にカメラの向きを考慮します。

GameObject mainCamera = GameObject.FindGameObjectWithTag("MainCmaera") as GameObject;

Vector3 forward = mainCamera.transform.TransformDirection(Vector3.forward);
Vector3 right =mainCamera.transform.TransformDirection(Vector3.right);
Vector3 inputDirection = Input.GetAxis("Horizontal") * right + Input.GetAxis("Vertical") * forward;

「Vector3.forwardって何よ」と思いきや、単純に (0, 0, 1) のベクトルを表すだけのものみたいです。
TransformDirectionでカメラの正面をワールド座標に変換して掛ける・・・難しいですね。
まだまだAPIの理解が足りていないようですorz

実際には毎回カメラの参照を取るのはアレなので、Startあたりで取得してフィールドに持つ方が良いと思います。
他の箇所でも使う場合はなおさらですね。

本修正にあたり、こちらのサイトを参考にさせて頂きました!
http://nokutanno.kagome-kagome.com/unity/-unity-%E3%82%AB%E3%83%A1%E3%83%A9%E6%96%B9%E5%90%91%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%89%8D%E6%96%B9%E5%90%91%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B

【ステージメモ】ステージ構成とカメラアングルについて

というわけで、もうすっかり秋の気候な山梨です。
去年は忙しすぎて紅葉をまともに見れなかったので、今年はどこかに見に行きたいです。

shot2ss20151011011310415

今回は新ブログ最初のゲーム開発系の記事になります!
アクションゲームの土台でもあるステージを何とかしたいので、その話題です。
プレイする際に重要なカメラアングルについても修正しておきます!

ステージの構成

最初に作るサンプル的な役割も兼ねるステージということで、やはり海の雰囲気があるステージを作りたいところです。
ざっくりと組み込みたいセクションを書いてみます。
実現できるかどうかはやってみてから考えます!

前回の記事で書きましたが、ステージの難易度や順番は考慮しないことにしました!
1から順に難易度を上げていくことを考えると、どうしても構造が縛られてしまうためです。

・滝の入り江
滝つぼから滝をぐるっと回りながら登っていくイメージです。
地形を作るのが大変そうですが、漠然とした平地よりはアクション性が高くてよさそうです。
ジャンプ力と高低差のバランスに気をつけて作るようにします。

・洞窟
アクションゲームでは定番ですね。
どんな構造にするかは未定ですが、2Dアクションに近い感じになるかもです。
地形作成にTerrainは使わず、ほぼBlenderオンリーになると思われます。

・マングローブ
ステージ後半、夕焼けのようなライティングと合わせて作ってみたいです。
木の上に乗れたりすると面白いかも。
マングローブのモデリングが最大の難関になりそうです。

大きく3つに別れるわけですが、別シーンにするか同一シーンにするかは考え中です。
Unityの場合、同一シーン内の離れた地点に飛ばすような処理のほうが楽でしょうか。

shot2ss20151011005227774

そんなわけで、滝の入り江から作り始めています。
地形はTerrainで作り、所々にあるブロックはBlenderで作る予定です。
最後まで進めることに重点を置いているので、細かい部分は割と適当になっています。
途中で滝のパーティクルが上手くレンダリングされない問題が発生しましたが、パーティクルのSacleを1に直したら改善しました。

ちなみに水没したら「ダメージを受けて一定地点まで戻る」予定です。
「海の仲間たち()」になりそうですが、汚染された海という設定があるにはあるので、細かいところは気にしないで作ります!

カメラアングル

これまた前の記事で書きましたが、カメラアングルを自動化し、場面に合わせて自動で動かすようにします。
カメラアングル専用のクラスを用意し、以下のような関数を作ってカメラを操作するようにします。

public void changeAngle(Vector3 position, Vector3 angle) {
    // カメラ位置
    mainCamera.transform.position = transform.position;
    mainCamera.transform.localPosition = position;

    // カメラ本体角度
    iTween.RotateAdd(mainCamera, iTween.Hash(
        "rotation", angle,
        "time", 1f
    ));
}

public void rotateCameraPosition(float camera_rotate_y) {
    // カメラ回転
    iTween.RotateTo(gameObject, iTween.Hash(
        "y", camera_rotate_y,
        "time", 1f,
        "onupdate", "rotateCameraAngle"
    ));
}

public void rotateCameraAngle() {
    mainCamera.transform.LookAt(gameObject.transform.position);
}

上がカメラの位置と角度、下がカメラ回転用の関数です。

スクリプトはMainCameraに直接付与するのではなく、プレイヤーキャラと同じ位置に空のGameObjectを作り、そこからカメラを取得して操作します。
作成したオブジェクトの子としてMainCameraを設定します。
この状態でカメラ操作用のオブジェクトを回転させることで、カメラをキャラクターを中心として回転させることができます。
カメラ回転中はプレイヤーの方を見てもらわないと困るので、iTweenのonupdate内で指定しておきます。

直接プレイヤーキャラの子オブジェクトとしてしまうと、キャラが動く度に移動するので面倒なことになります。
面倒ですが、Update()内でプレイヤーの位置に合わせる処理を書いておきます。

カメラの回転を直接行うと一瞬で処理が行われてしまうので、見栄えがよろしくありません。
iTweenのRotateToやRotateAddを使いtimeを指定することで、慣性のある角度切り替えを実現できます。

あとはステージ上に透明の判定を用意し、触れた際にカメラの位置・角度を切り替えます。
パラメータとしてカメラ位置・角度・キャラを中心としたカメラの回転位置を設定しておきます。

using UnityEngine;
using System.Collections;

public class AngleChangeController : MonoBehaviour {

    [SerializeField]
    private Vector3 position;

    [SerializeField]
    private  Vector3 angle;

    [SerializeField]
    private float camera_rotate_y;

    private CameraController cameraController;

    void Start () {
        cameraController = GameObject.FindGameObjectWithTag("PlayerManager").GetComponent<CameraController>();
    }

    void OnTriggerEnter(Collider c){
        if (c.gameObject.tag == "Player") {
            cameraController.changeAngle(position, angle);
            cameraController.rotateCameraPosition(camera_rotate_y);
        }
    }
}

OnTriggerEnterでタグがPlayerのオブジェクトの場合のみ実行させます。
設定したパラメータを引数として渡します。

20150605_1

動き自体は問題なさそうです!
ただしCharacterMotorを使用しているため、切り替わった後がすごく操作しにくいです。
プレイヤーの移動に合わせて徐々に回転させるのが良いと思われますが、今の自分の知識で実現するのは難しそうです。
判定をいくつかに分け、小刻みに回転させるようにすると少しマシかも

まとめ

そんなわけで、ステージとカメラアングルに関してまとめてみました!
前よりはステージの構造がイメージしやすいので、そこそこはかどっています。
ひとまず1セクションの地形を作り上げ、システム面の改良も行っていきたいところです。

10/12 追記

カメラ回転時にY軸に限定せず、Vector3型を渡して回転させると汎用性が上がります。
上で記載したrotateCameraPositionをちょっと修正します。

 
public void rotateCameraPosition(Vector3 camera_rotate_angle) {
    // カメラ回転
    iTween.RotateTo(gameObject, iTween.Hash(
        "rotation", camera_rotate_angle,
        "time", 1f,
        "onupdate", "rotateCameraAngle"
    ));
}

public void rotateCameraAngle() {
    mainCamera.transform.LookAt(gameObject.transform.position);
}

AngleChangeControllerの方は型をVector3にするだけなので割愛させていただきます!

上手く調整すればサイドビューにもトップビューにもできます。
これにズームイン・アウトの処理を作れば大抵のアングルはカバーできそうですね。

開発するゲームの概要と今後の開発方針について

今までの開発メモを一通り再投稿したので、現状のゲーム概要や今後の開発方針などをまとめておきます。
旧ブログの流れで曖昧になっている部分もあるので、一度整理しようと思います!

Unityを使った自作ゲームということで、技術的な面が濃くなっています。
所々分かりにくい部分があるかもしれませんが、ご了承くださいorz

ゲーム概要

タイトルは「Frineds of Ocean」です。
直訳すると「海の仲間たち」になります。

ネーミング的な問題はさておき、いい略称が思い浮かばないのが難点です。
(FO、FoO、フレオー・・・どれも微妙orz)
現状ではタイトルというよりプロジェクト名みたいな感じになっているので、形ができてきたら考え直すかもしれません。

ちなみに旧ブログでは2作目という位置づけでしたが、1作目はほぼ黒歴史なのでなかったことにします!
Unity4.1の頃に作ったものなので、純粋に古かったりもします。

ジャンルは3Dアクション(の予定)です。
各種アクションでステージや敵を切り抜けていくオーソドックスなものです。
キャラ毎のアクションやオブジェクト・アイテムを、プレイヤーのスキルやアドリブで生かしていくようなゲーム性を目指しています。

ストーリーは「汚染される海を守るため、”海の仲間たち”が闇の軍団に立ち向かう!」
・・・とか考えましたが、アクションゲームなのであってないようなものです。
何の文脈もなく冒険するのもアレなので、一応の建前ということで・・・。

アクション

今現在搭載されているアクションは以下になります。
ロジックだけあってモーションはハリボテなものが多いですが・・・。

・移動
キャラクターを入力した方向へ移動させます。
CharacterMotorとPlatformInputControllerを使用しています。

・ジャンプ/2段ジャンプ
至って普通のジャンプです。
空中で入力すると再度ジャンプができます。
通常ジャンプはCharacterMotorで、2段ジャンプはiTweenを使用して擬似的にジャンプさせています。

・ローリング
現在向いている方向に転がります。
2段ジャンプと同じくiTweenを使用しています。
現状では価値が見出せないアクションのため、後々整え直す予定です。

・通常攻撃
持っている武器を使って攻撃します。
連続入力することで2段目、3段目と派生します。

・特殊攻撃
キャラクター固有の特別な攻撃を行います。
通常攻撃より強力ですが、発動時にアクションゲージ(MPのようなもの)を消費します。

・物を掴む/投げる/掴み攻撃
特定のオブジェクトを掴んで持ち上げ、投げることができます。
敵に対して掴むと専用の攻撃アクションを行います。

プレイヤーキャラクターについて

当初は9匹作ると言っていましたが、正直無理があるので3匹に絞ることにします。
それに伴い、プレイヤーキャラの性能も決め直します。

プレイアブルキャラは本ブログのマスコットになりつつある、ブログヘッダーにいる3キャラになります!
見た目も性能も個性を持たせることが目標です。

マリンパ

shot2ss20151004211213575

ブログヘッダー真ん中のウサギのようなキャラです。
3匹の中ではリーダー的存在で、実質的な主人公の扱いです。

武器は見た目通り剣で、攻撃速度・範囲のバランスに優れた攻撃です。
当初は「遠距離も近距離もいける万能型」というコンセプトでしたが、3キャラに絞る関係上、より近接寄りのキャラにしようと考えています。
「シンプルながら強力」という主人公らしいキャラに仕上げたいです。

特殊攻撃は剣に力を溜め、攻撃力とリーチの伸びた強力な斬撃にする予定です。
チャージして衝撃波を放ったりできると面白そうです。

モグフィー

shot2ss20151004211839209

ブログヘッダー右の猫のようなキャラです。
暗い体の配色には「闇の研究所から脱走してきた」という(無駄な)設定があったりします。
性格は無邪気で、見た目よりは明るい感じです。

槍を使った攻撃と、電撃を放つ中距離攻撃があります。
自分の中では槍というと空中戦のイメージが強いので、空中攻撃に特色を持たせようと思います。
マリンパがシンプルな強さなら、モグフィーはテクニカルな強さを出していきたいです。

雷を使った特殊攻撃で相手の動きを止めることができます。
「複数の敵に電撃を放つ」ようなアクションも取り入れてみたいところです。

シルリス

shot2ss20151004211548771

ブログヘッダー左のリスをモチーフとしたキャラです。
この中では最も動物らしいキャラで、帽子とストールをしたシマリスといった趣向です。
性格は真面目でやや弱気といった感じ。

杖を使って魔法を放つ、遠距離からの攻撃が主体になります。
前は「手数は多いが攻撃力が低い」といった性能でしたが、特別縛らず豊富に攻撃を持たせようと思います。
特殊攻撃は「召喚獣を出して攻撃」とかやってみたいです。すごく難しそうですが・・・。

今後の開発方針

旧ブログまでの内容を整理し、今優先すべきものは以下になります。

・ステージ
アクションゲームにおいてすごく重要ですが、ほとんど進んでいませんorz
Blenderを使って作っていましたが、やはりTerainも混ぜて作るほうがいいかも。

一度ステージコンセプトを明確にし、セクション毎に区切って作っていくべきかもしれません。
ステージ1から順に作ろうとすると難易度も考慮しなくてはいけないので、いっそステージセレクトを前提に作る方が伸び伸び作業できそうです。

・モーション/アニメーション系
Unity5のAnimator機能を使ってアニメーションさせていますが、イマイチ使いこなせていない部分があります。
特にモーション遷移がぎこちない感じなので、早めに解決したいところ。

・カメラアングル
ステージと関連する部分ですが、カメラアングルの扱いについて見直す予定です。
今までは入力で左右に回転できましたが、常に固定して特定部分で回すような感じにしようと思います!

・アイテム取得システム
ステージ中に配置されているアイテムを取得・装備するシステムです。
強力な弾丸を発射したり、特定のブロックを破壊できるハンマーなど、バリデーション豊かに作っていきたいです。
作ること自体はかなり前から決めているのですが、未だに着手できていない状態です。

上がひと段落したら取り掛かりたいものが以下になります。

・キャラクターモーション
最もテストで使うマリンパのモーションしか作っていません。
3キャラいるので個性あるモーションに仕上げたいところですね。

・敵キャラクター
バリエーションがすごく少ない・・・というか1匹だけです。
見た目や色で派生させるのも限界があるので、ベースとなる敵モデルをもっと作りたいです。

・クラス構成
内部的な話になりますが、クラスの役割・構成が歪なことになっています。
特にパラメータに関する部分が酷く、ゲッタセッタが混在していたり、アクセス修飾子をpublicにして直接操作など・・・。
パラメータを管理する専用のクラスを作成する等で一度整理しないとまずいです。

だいたいこんなところでしょうか!
ネットワーク系やGUIなど触れたい部分は多いのですが、「ゲームとして成り立っていない」部分から改善していくべきですね。
とはいえ焦っても楽しく作れないということで、まったりやっていきます!

まとめ

ということで、新ブログになってからのゲーム概要や開発方針をまとめてみました!
いろいろ実装してみたい機能もあるので、意欲的にチャレンジしていきたいところです!

ちなみに本ブログはWordPressで運用していますが、投稿の他に固定ページも作成できるようです。
目指すゲームの概要やキャラクター説明等を書いておくのもいいかもしれません。
また暇な時に考えてみます!

【再編集】イラスト・GIMPメモまとめ

※本記事は旧ブログの記事を再編集し、再度投稿したものです。
 一部内容に差異がある可能性がありますので、予めご了承ください。

カラーパレット

カラーパレットの作成方法が旧ブログでかなりのヒット数を誇っていたので、こちらでもメモしておきます!
ほぼ当時のコピペですが、今でも同じような手順で出来ます。

まず、カラーパレットダイアログを開きます。
ウィンドウ→ドッキング可能なダイアログ→カラーパレットで、右側のタブに追加されると思います。

GIMPにはプリセットで大量のカラーパレットが用意されています。
これらを使うのならともかく、使わないなら邪魔でしかないですね。
プリセット故か、パレットの削除もできないようです。

というわけで、Windowsエクスプローラから直接パレットファイルを削除してしまいました。
デフォルトでは「[ドライブ名]:ProgramFiles\GIMP 2\share\gimp\2.0\palettes」に格納されているようです。
ばっさり削除して、GIMPを開き直せばOKです。

shot2ss20140903003158791

さっぱりしたところでカラーパレットを新規作成します。
パレットダイアログ下の白紙アイコンをクリックすると、パレットエディターが開きます。

shot2ss20140903003641863

左側のツールボックスのスポイトで色を選択した後、パレットエディター下の白紙アイコンを押すと色を追加できます。
パレット名の他、色ごとに名称を付けることもできます。

shot2ss20140903003824232

また、列数を変えることができます。色の数に合わせて調整しましょう。
表示倍率は保存できませんが、右下の虫眼鏡を押すと大きさが最適化されます。

保存するとカラーパレットダイアログに表示されます。
キャラ毎に保存したり、ちょっと色を変えたりするのもよさそうです。

ちょっとしたメモ

・太陽光
グラデーションの「描画色から透明」というパターンを使うのがキモです。
太陽光の白から透明になる絶妙な透明度も簡単に描画できます。
太陽光自体はパスか自由選択を使い、いくつか適当に長方形みたいな感じで斜めに描きます。

・影のレイヤーモード
影を塗る専用のレイヤーを作り、レイヤーモードを「乗算」にします。
その状態で白~黒の間で濃さを調節し、上記レイヤーに影を付けていきます。
影を付け終わった後はフィルターでぼかしを入れると、不自然なつなぎ目等が少なくなります。

・輪郭線とパス
手書きの輪郭を二値化しただけではギザギザな部分がでてしまいますが、パスを使うとなめらかで、かつシャープな輪郭線を描くことができます。
後々で線を太くしたりする時も、選択範囲の拡大を使えば簡単に行えます。
下はパスを使って輪郭を書いたランパです。

ranpa_rinkaku

副次的な効果として、下書きの際に輪郭線に神経を使わなくて済みます。
極端な話、線が曲がっていたり歪んでいたりしても、パスで補正すれば問題ありません。

パスツールの操作は以下を覚えていれば何とかなります!

新しいパスを追加 左クリック
新しい曲線パスを追加 Ctrl + 左クリック
パス上に新しいパスを追加 パスの上で Ctrl + 左クリック
パスの削除 Ctrl + Shift + 左クリック
曲線の調整 パスをドラッグ
パスを閉じる 閉じるパスの上で Ctrl + 左クリック

内側の輪郭を書く場合、新しいパスを作成するか、適当な場所をクリックして Ctrl + 左クリックでいったん削除し、再度パスを作り直します。
作り終えたら「パスの境界線を描画」で輪郭線を描画します。

大雑把に輪郭を繋いでいき、パス上に曲線パスを追加して調整していくのがコツです。
割と適当でも綺麗に描けるので、ドラッグの感覚さえ掴めばサクサクできます。