クラフトゲーム開発(インベントリのアイテムをスタッシュに移動させる)
そろそろアイテムをインベントリからスタッシュに移動させられるようにします。
ただ、ここまで駆け足気味に開発して雑なコードになっているので修正もしていきます。
下準備
Unity に詳しくなくてわかってないのですが、TopDown Engine はデフォルトでカメラがゆらゆら揺れる設定になっていて、揺れたときにカーソルがあるように見える位置と実際のカーソル位置がずれてるらしくて「なんでスタッシュにカーソル合わせてるのに反応しないの?」と悩んだりしてました。
私があの揺れるカメラ好きじゃないので、揺れないようにします。
↓調べたらCinemachine Virtual Camera の Noise を none にすれば止まるのがわかりました。
右クリックでアイテム移動
次は、カーソルがインベントリ、スタッシュのどのアイテム枠にあるかを計算するあたりです。 RectTransformUtility.ScreenPointToLocalPointInRectangle() を使ってこんな風に計算しました。
public int ItemIndexOnCursor()
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(_content.GetComponent<RectTransform>(), Input.mousePosition, _uiCamera, out var localPoint);
if ((localPoint.x < _topLeftPosition.x) || (localPoint.y > _topLeftPosition.y))
{
return -1;
}
if ((localPoint.x > _bottomRightPosition.x) || (localPoint.y < _bottomRightPosition.y))
{
return -1;
}
var offset = localPoint - (Vector2)_topLeftPosition;
var width = _iconSize.x + _spacing.x;
var height = _iconSize.y + _spacing.y;
int xIndex = Mathf.FloorToInt(offset.x / width);
int yIndex = Mathf.FloorToInt(-offset.y / height);
return (_itemsGrids.x * yIndex) + xIndex;
}
とりあえず動作しました。よいです。
まとめと今後の予定
ここまでで、カーソルがインベントリのどの枠にあるかを取得できるようになりました。
本当は「アイテムを右クリックするとインベントリからスタッシュに移動する」まで実装したかったのですが、今回のやる気が尽きたのでここまでにします。
次回は、アイテム移動の続きと、ホームエリアで NPC にどんな風に行動してほしいかの仕様を考えようと思います。がんばります。