ださいのください

文字化するのを恥じらわず、備忘録でもいいから書いていこう

Mac OS Sierraが重いときMac初心者でも頑張れそうな対処法まとめ

開発経験がなく、PCにそこまで詳しくない知人から「5年ほど愛用しているiMacの挙動が急に重たくなった」という相談をうけました。

Mac初心者(=私目線)でも頑張れそうな解決策を探してみました。

自分では試していないので信頼性はよくわからないですが。。

 

解決策の概要

大きく2つのアプローチからまとめました。

 

 

 

【解決策その1】アクティビティモニタの解析

アクティビティモニタをみて、CPUを多く使っているものに応じて対処。
 

(1)「backup」の場合…

症状:バックアップを作ろうと頑張ってるから重い
*解決策*
メニューバーのTime Machineアイコンをクリックして
「バックアップ作成を準備中…」となってるか確認する
    ↓
なっている場合、
OSのアップロードが最新版か確認して、「バックアップの更新」をひたすら待つor一回バックアップを削除して新しくバックアップを作る
※参考リンク元
 
 

(2)「secd」の場合…

症状:キーチェーン(パスワード情報等)をiCloudと同期してて重い
*解決策*
次の①or②で解決できる。
iCloudとキーチェーンを同期する。
iCloudMacと連携させない。
※手順は参考リンク元↓見るほうが早い
 
 

(3)「photoanalysisd」の場合…

症状:写真ライブラリを同期しようとした際のバグ
*解決策*
設定→iCloudへ進み、「写真」のチェックを外してiCloudの同期を止める 
  ↓
バックアップを取り、写真ライブラリをまるごと削除するかどこかへ移動する
 ↓
再起動してから、iCloudの写真に再びチェックを入れる

 

参照リンク元
 

(4)特別異常なCPU保有率がなく、「windowServer」や「kernel_task」が上位にきている場合…

症状:SMC(システム管理コントローラ)の不都合の可能性
※SMCとは:電源周りや熱管理を制御するセンサー系
*解決策:SMCをリセットする。( ※実行は自己責任で。。)*
1.システムを電源オフ
2.電源コードを抜く。私はコンセントではなく、iMAC側を抜きました。
3.この状態でしばらく放置します。apple公式では15 秒間とのこと。
4.電源コードをつないで、再び放置。公式にでは5 秒間とのこと。
5.電源ボタンを押して Mac の電源を入れます。
参照リンク元
もしくは
1.コンピュータをシステム終了。
2.まだ接続していない場合は、MagSafe 電源アダプタをコンセントに接続し、Mac に接続する。
3.内蔵キーボードで、「(左の) shift + control + option」キーを押しながら、電源ボタンを押す
4.3 つのキー全部と電源ボタンを同時に放す。
5.電源ボタンを押してコンピュータを起動する。
※詳細は↓のリンク参照
 
 

【解決策その2:ダウングレード】

5年前のMacが最新版のSierraについていけない可能性を友達から指摘されて、なるほどなーて思いました。
おじいちゃんに新しいこといっても動かない的な。。
そこでOS X EI Captain(最新版より1つ前)にダウングレードする方法を調べました。
↓のサイトにダウングレードの仕方が3種類のっています。
このサイトを見た感じ、私的には次の順番でやりやすいとおもいました。
手法①Time Machineでダウングレード→多分いちばん簡単
手法③インストールディスクを作成してダウングレード→コマンド打つから抵抗ありそう。
手法②インターネットリカバリでダウングレード→5年前に買った当時のOSになるから初心者はやめたほうがよさそう
 

【その他:ブラウザを変えてみる】

Youtube見る時にめちゃくちゃ重たいと言っていたので、根本的な原因とは別な気がしますが、ブラウザを変えてみることも検討してみました。
SafariよりChromeFirefoxのが微妙に早いらしいので、それをダウンロードして使うといいのかな。。
ブラウザ比較サイト↓
 
 
私自身詳しくないから詳しい人に叩かれそうだけど、、
開発経験のない人にとってもこれくらいなら頑張れそう…というのを探してみました。
解決したらいいな。おわり。
 
 

 

 

 

ゲージ作成、移動ボタン作成、rigidbodyとか

メモ程度に〜

 

 

オブジェクトに当たると体力ゲージがさがるようなHUDを作る

完成したHUD.cs↓ これをプレハブ化したゲージにつけました

 

using UnityEngine;
using System.Collections;

public class HUD : MonoBehaviour {

    private float hitpoint;
    private float hitpoint_max;
    private float nowsize;
    public float default_size;
    public GameObject refObj;
     
    // Use this for initialization
    void Start () {


    }

    // Update is called once per frame
    void Update () {
        Rocket rocket =   refObj.GetComponent<Rocket> ();
        if (rocket != null) {
            hitpoint = rocket.Hitpoint;
            hitpoint_max = rocket.Hitpoint_max;
        } else {
            Debug.LogWarning ("can't get script Rocket!");
        }
        nowsize =  default_size - hitpoint/hitpoint_max;
        transform.localScale = new Vector3 ( nowsize0.5f1f);
        if(nowsize<=0){
            Application.LoadLevel("result");
        }

    }
}

 

デフォルトサイズから、減った割合だけ減るようにしたつもり…

わからなかったり苦戦したことが

・ゲームオブジェクトを参照するときpublicで宣言してるからあとでInspectorから対応するオブジェクトをドラッグアンドドロップする必要があった

・減らしたいHPバーをプレハブにする

→大きさ調整しただけで特になにもつけてない

 

他のブログみてると難しいことやってて行数少ないけど時間かかった…

 

移動ボタン作成

左右の移動ボタンを作った。まあマウス入力の判別だしいけるっしょー

でも、同じスクリプトを2箇所に使いまわしたかったけどうまくいかなかった。

コントローラーのスクリプトでbool型のチェック変数を作っておいて、クリックされたオブジェクトのタグで場合分けをしたかったのだけども…

先に押した方のtrueがずっと有効になっていて、Input.GetMouseButtonUpでFalseでリセットするようにしてるはずなのにうまくいかなかった記憶

 

時間ないから右用、左用でスクリプトを作った。ぽんこつ〜

 

public class TransButton_L : MonoBehaviour {
    
    public GameObject refObj;
    public float power;
 
    // Update is called once per frame
    void  Update () {
        
        Rocket rocket = refObj.GetComponent<Rocket> ();
        power = rocket.power;
        if(Input.GetMouseButton(0)){
            Vector3 aTapPoint=Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Collider2D aCollider2d = Physics2D.OverlapPoint(aTapPoint);

            if(aCollider2d){
            rocket.rigidbody2D.velocity = new Vector2(-1,0)*power;
            }
        }
    }
    
}

 

前に作ったRocket.csで動かすパワーを決めてたからそれを参照するように変更しただけー

どこかで見つけたマウス入力の違いをメモ書き

●マウス入力を取得

function Update() {
if(Input.GetMouseButtonDown(0)){
//マウスの左ボタンを押した
}
if(Input.GetMouseButton(0)){
//マウスの左ボタンを押し続けている
}
if(Input.GetMouseButtonUp(0)){
//マウスの左ボタンを離した
}
}

 

背景をスクロールするようにしたい

↓こちらを参考にして作った

背景をスクロールさせる | Unity | Obake Solutions

 

このリンク先のリンク先をもともと読んでいたらうまくいかなかったんだけどマテリアル作成してませんでしたぺろぺろ

 

rigidbody.AddForceとRigidbody2D.AddForceの受け渡しの違い

 

引力を発生するEnemy発生させようとおもって

[Unity] 惑星に向かって物体が落ちるようにする | ftvlog

このリンク先のスクリプトそのままコピペ。したけどエラー。

rigidbodyじゃなくてRigidbody2Dを使わなきゃいけないっぽくて、そのまま2Dだけ足してもエラー。

 

どうやらrigidbodyではAddForce(x: float, y: float, z: float, mode: ForceMode = ForceMode.Force): void;

の型でForceModeを引数にできる。

一方RIgidbody2D.AddForceでは
AddForce(force: Vector2): void;
なので同じ書き方をしたら怒られる。
※Rigidbody2DにもForceModeを引数にできるらしいけど、ForceMode2Dにしなきゃいけないぽい

rigidbody2D.AddForceの使い方の参考スレッド

Rigidbody2D and ForceMode.AddVelocity? - Unity Answers

↑このリンク後々神になる

 

しかもForceModeとForceMode2Dでvariablesが異なる
ForceMode2DではForceとImpulseのみ。

Unity - Scripting API: ForceMode2D

 

参考スクリプトではAcceleration使いたいのに!

げろげろ!

 

ということで引数にMode使うよりは、Modeに該当する計算式をさっき神リンクって紹介したスレッドからピックアップするほうがよさそう。

 

 

以上〜。

 

 

macのストレージを減らす

諸事情でどうにかBoot Campいれたいので残り6Gというありえねえストレージを減らす努力をしました

 

/coresが空なのに"その他"で64Gくらいくってるからなにかなーて探してたら

sleepimageとかイラレのキャッシュとかMobilebackupsとかlost+foundが原因ぽい。

ひたすら

sudo du -g -x -d 5 / | awk '$1 >= 5{print}'

を打ちまくって5G以上のファイルを探しまくったらヒットしました。

結果、使用ストレージが98G→73Gまで減った〜〜

Unity、AdobeCC、xcodeなどなどいれてるからApplicationが重いのは仕方ない…ということにしました。

やった〜

 

参考にしたリンク集

 

Macの起動ディスクの容量を確保するために、sleepimageの削除および設定 - 適当な感じでプログラミングとか!

iPhotoが重い!!固まる!!を解消するためにやったこと(ライブラリの再構築でもダメな場合の対処法) | Ninebonz - その和尚IT系

MacBook Airの容量不足の対処法 | takaken's Blog

ハードディスクの空き容量が極端に少なくなる場合の対処方法 | Apple サポートコミュニティ

 

 

 

オブジェクトが落ちてくるところの実装と当たり判定:初歩編

Unityで落ちてくるものを避けるゲームを実装中。

まだまだよくわかんねえ

当たり判定は↓とか本を参考にしたので割愛

Unityの2Dゲームで「当たり判定」の基本を30分で理解するコツ!(前編) - Unity不定期便

 

参考文献:

Amazon.co.jp: Unityではじめる2Dゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦: 大野 功二: 本

 

ボルコフに教えてもらったことをまとめながら書きます

ボルコフありがとう

 

今回の目標:設定したものがランダムに落ちてくる、あたったら消える

 

f:id:redbuller:20150204022629p:plain

↑ロケットがプレイヤー。横移動する。☆と青い鳥が障害物、あたったら障害物が消える

(フォルダにあった適当な素材を使ってるから見栄えは気にしないで)

 

今回メモする概要

・作るべきスクリプトの種類と使い道
→プレイヤーの横移動など

・Prefabつかって落ちてくる素材を作る

 

1.作るべきスクリプトの種類と使い道について

最低限作らないとダメなスクリプト

*プレイヤー操作に使うスクリプト("Player"とする)

*空のゲームオブジェクトに使うランダムに落ちてくるように障害物を呼び出すスクリプト(”CreateEnemy”とする)

*でてくる障害物に使われるどういう動きをするかのスクリプト(”ControlEnemy”とする)

 の3つ。

 

キャラクターコントローラーとかクラス構造したほうがいいらしいけどまだよくわかんないから今回はパス

 

Player.cs

今回実装する内容はプレイヤーの横移動。

 

>|C#|

public class Player : MonoBehaviour {

    // GlobalVariable for Inspector

    public Vector3 acceleration;
    public float threshold;
    public float power;



    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
    
        acceleration = Input.acceleration;
        float x;

            x = Input.GetAxis ("Horizontal");

        if (x > threshold) {
            rigidbody2D.velocitynew Vector2(1,0)*power;
            //            rigidbody2D.AddForce (new Vector2 (power0));
        } else if (x < -threshold) {
            rigidbody2D.velocity=new Vector2(-1,0)*power;
//            rigidbody2D.AddForce(new Vector2 (-power,0));
        }

||< 

 

プレイヤーキャラの横移動だとInput.GetAxis("Horizontal")だけでInputマネージャーに登録されたデバイスがどんなデバイスなのか気にせずに値だけを利用することが可能。

ゲームコントローラーでもカーソルキーでもOKだけど一度傾けた時に得る値はデバイスによって違うっぽい

※Inputマネージャーは入力機器を扱うところ

 

Axesの種類に二種類あるから違いを。

*GetAxisRaw:スムージングなしで取得。アナログスティックを動作させたような値を取得する。キャラの速度変化が離散的。

*GetAxis:スムージングありで取得。速度変化が連続的だから立つ、歩く、走るなど使い分けたいときによい。

 

今回はGetAxisをつかう。

次にAxesのプロパティについて

Edit>Profect Settings>Input

を選ぶとInspectorにAxesがでてきてSnap、Gravity、Sensitivity等がいじれる

*Snap:反対方向に行くとき一度減速してから移動を始めたいときはOFFに、アクションゲームとかですぐに切り替えたいときはONにするとよいらしい

*Gravity:ボタンを話した時0に戻る速度。大きすぎると反応が遅いと感じる

*Sensitivity:MAX速度に向かうための単位速度。精密な操作の時は大きく(大き過ぎたらつるつるする印象…)大雑把なら小さく設定。(小さ過ぎたらかくかくってかんじ)

 

これでどっちに移動したいかがわかったから、次は加速させていく

rigitbody2D.AddForceかrigidbody2D.velocityを使う。

thresholdは閾値。こだわらなかったら0で場合分けでもよさそう

 

*AddForce:速度変化が連続的だからリアルな変化をする。一瞬だけ踏み込んだように最初加速してその後減速して停止する

 *velocity:ある速度を指定するとずっとそれで走り続けようとする。減速しないから単純な動きをするときよさそう

 

コメントアウトしているけどどっちも使える〜。

それぞれでGravityとかをいじってすべり過ぎないように調整は必要そう。

 

これで横移動はOK〜

必要に応じてヒットポイントとか足していくとか付け加えたりする。

 

 CreateEnemy.cs

>|C#|

public class CreateEnemy : MonoBehaviour {

    public float interval;
    private float DeltaTimer;
    public GameObject[] copyEnemy;
//    private int Stage;

    // Use this for initialization
    void Start () {
        DeltaTimer = 0f;
    }
    
    // Update is called once per frame
    void Update () {
        DeltaTimer += Time.deltaTime;

        if (DeltaTimer > interval) {
                        int enemyType = Random.Range (04);
                        switch (enemyType) {
                        case 0:
                                Instantiate (copyEnemy [0], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 1:
                                Instantiate (copyEnemy [1], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 2:
                                Instantiate (copyEnemy [2], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        case 3:
                                Instantiate (copyEnemy [3], new Vector3 (Random.Range (-3f3f), 50), Quaternion.identity);
                                break;
                        }

                        DeltaTimer = 0f;
                }
    }
}
<||

 

ゲームオブジェクトの配列を宣言することで落ちてくる敵を後でInspectorから設定できる

ランダムで得た数で場合分け、switchで4種類の敵が落ちてくるように設定。

Instantiateはインスタンス(プレハブをシーンに追加するときに生成されるもの)を作成する意味らしい。へえ〜

 

intervalで障害物の発生速度を調整できるようにしてある。0にするとどばどば出てくるから注意。(それはそれで面白いけど)

 

これで降ってくる仕組み完成!

空のゲームオブジェクトを作ってこのスクリプトをいれる。

 

ControllEnemy.cs

>|C#|

public class ControlEnemy : MonoBehaviour {

    public float  Loop_Speed;
    public float down_length;
    private float DeltaTimer;


    // Use this for initialization
    void Start () {
        DeltaTimer = 0f;
    }

    // Update is called once per frame
    void Update () {
    
        DeltaTimer += Time.deltaTime;

        if(DeltaTimer > Loop_Speed){
           transform.position += new Vector3(0,-down_length,0);
        DeltaTimer = 0f;
    }
    }

    void OnTriggerEnter2D(Collider2D Coll){
        Destroy (gameObject);
        }
}

<||

 

Loop_Speedで障害物が一回分落下するのにかかる時間を調整

down_lengthで一度に障害物が落下する距離を調整

あたったら消える設定はOnTriggerEnter2Dで。

 

最低限これだけあれば大丈夫なはず。。

 

2.Prefabを使う

 プレハブはUnity - プレハブにある通りらしい。

BoxCollider2Dとかの物理エンジンスクリプトを付け加えたオブジェクトをまるまる素材として扱うときの単位ってかんじぽい

 

リンク先ではごにょごにょあるけど、素材をHierarchyに置いて色々調整して、できあがった素材をAssetsに戻すだけ!

 落下物にControllEnemyとか物理エンジン調整したものをいれてプレハブを作ったら

CreateEnemyをいれた空のゲームオブジェクトを選択、Inspectorからsizeをいじって配列数を変える。

その後Ellementからプレハブの素材を選ぶとふってくるインスタンスが選択されたことになる。(日本語あってんのかなこれ。。)

 

f:id:redbuller:20150204050949p:plain

 

 

 

 とりあえずこれで今回の目標はできるはず〜

IsTriggerにチェックし忘れてぶつかってんのにコロコロ転がられてあぁ〜〜ってなったから今度から気をつけよ〜

 

 

これからの目標は

 

プレイヤーの向きが変わる

あたった時のエフェクト

障害物の多様性ブラックホールに吸い込まれそうになる)

ステージの拡張

 

てかんじで。。まだまだ初歩的だなあ