Help us understand the problem. What is going on with this article?

始めたてぐらいのunity C#のこと。

More than 1 year has passed since last update.

この記事は
softdeviceのみんなでゆるく記事を書く。 Advent Calendar 2018
の1201の記事です。

初めまして。softdeviceで。
unityを触ったりしているものです。

この記事では。
ゲームエンジンもプログラムも触ったことがないけど。
unityを触り始めて。C#を書き始めた人へ。
わたしが思う。
わかるとちょっと楽しい部分を紹介しようと思います。

 
unityで何かをしようと思うと。
たぶん。オブジェクトの何かしらの要素にアクセスしたいです。
(移動させたい/回転させたい/このコンポーネントの値を変えたい/とか)
あとはアクセスする方法についてなど。

作業環境
Unity 2018.2.16f1
vs code 1.29.1
macOS Mojave
バージョン10.14

目次

  1. 位置/角度/大きさ/を変える時
  2. オブジェクトのコンポーネントにアクセスする時
  3. まとめ

1. 位置/角度/大きさ/を変える時

さっそくですが。
cubeを作って。
cubeに下のスクリプトを貼ります。

tr_ch.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class tr_ch : MonoBehaviour {
    void Start () {
        // cubeの位置 = 新しいx,y,z
        transform.position = new Vector3(10,10,10);
        // cubeの角度 = 新しいx,y,z
        transform.eulerAngles = new Vector3(2,2,2);
        // cubeの大きさ = 新しいx,y,z
        transform.localScale = new Vector3(2,2,2);
    }
}

実行すると。cubeは
・10,10,10の位置
・2,2,2の角度
・2,2,2の大きさ
になっていると思います。

しかし。
ぱっと変化して欲しくない時もあると思います。
そんなときは。こんな感じです。

tr_sm_ch.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class tr_sm_ch : MonoBehaviour {

    // StartではなくUpdateに書きます。
    void Update () {
        // cubeの位置 = 現在の位置から指定した位置へLerpの補間分だけ毎秒移動。
        transform.position = Vector3.Lerp(transform.position,new Vector3(0,10,0),Time.deltaTime * 1);
        // cubeの大きさ = 現在の大きさから指定した大きさへLerpの補間分だけ毎秒大きく。
        transform.localScale = Vector3.Lerp(transform.localScale,new Vector3(3,3,3),Time.deltaTime * 1);
        // cubeの角度 = 現在の角度から指定した角度まで回る。
        transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 90f, 0), Time.deltaTime * 60);
    }
}

実行すると。じんわり変化しているはずです。

Vector3.Lerpの公式ドキュメント
public static Vector3 Lerp (Vector3 a, Vector3 b, float t);

直線上にある 2 つのベクトル間を補間します
t で a と b の間を補間します。t は、0-1 の範囲に固定されています。これは、直線状にあるポイント間(両端)で割合に対しての位置を取得するのに使用します(例えば徐々に目的地へ移動していくときに使用します)。

 

Quaternion.RotateTowardsの公式ドキュメント
public static Quaternion RotateTowards (Quaternion from, Quaternion to, float maxDegreesDelta);

from から to への回転を得ます。
The from quaternion is rotated towards to by an angular step of maxDegreesDelta (but note that the rotation will not overshoot). Negative values of maxDegreesDelta will move away from to until the rotation is exactly the opposite direction.

ドキュメント。なんだか難しそうに思ってしまいますが。
落ち着いて読めばちゃんとわかります。

2. オブジェクトのコンポーネントにアクセスする時

cubeに含まれているコンポーネントにアクセスしてみる。
・cubeのBoxColliderをoffに。
・cubeのDefault Materialの色を変更。

com_ch.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class com_ch : MonoBehaviour {

    void Start () {
        // cubeのBoxColliderをoffに。
        gameObject.GetComponent<BoxCollider>().enabled = false;
        // cubeのDefault Materialの色を変更。
        gameObject.GetComponent<Renderer>().material.color = new Color(0,0,0,1);
    }
}

<>の中にアクセスしたいコンポーネントの名前を入れればよいです。

例えば。
Box Colliderの他の要素にアクセスしてみる。
・Is Triggerをオンに。
・Centerの位置を変更。

co_tr.cs
// <BoxCollider>().まで書くと色々候補を出してくれると思います。
// Is Triggerをオンに。
gameObject.GetComponent<BoxCollider>().isTrigger = true;

// Centerの位置を変更。
gameObject.GetComponent<BoxCollider>().center = new Vector3(10,10,10);

作ったばかりのcubeに含まれているコンポーネントは。
・Cube(Mesh Filter)
・Mesh Renderer
・Box Collider
・Default Material
の4つです。
他のコンポーネントを追加すれば。
追加したものにもアクセスできます。


スクリプトを貼っていないゲームオブジェクトにアクセスしたい場合。
いくつか方法があります。

・名前を検索する。
下のスクリプトを空のGame Objectに貼ってください。
("名前")には。Hierarchyに存在するgame objectの名前を入れる。
Cubeなら("Cube")。Sphereなら("Sphere")。

ob_sr.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ob_sr : MonoBehaviour {
    void Start () {
        // GameObjectのObjを作る。
        // ObjにFindで見つけたGameObjectを入れる。
        GameObject Obj = GameObject.Find("名前");

        // Objの中にはFindで見つけたGameObjectが入っているので。
        // Materialがあれば。色を黒に変える。(Materialがない場合はエラーが出ます。)
        Obj.GetComponent<Renderer>().material.color = new Color(0,0,0,1);
    }
}

 
・publicに直接入れる。
空のGame Objectに貼ったスクリプトに。
表示されるNone(GameObject)へ。
対象のオブジェクトをドラッグ&ドロップで入れる。

ob_pu.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ob_pu : MonoBehaviour {

    // publicと書いて保存すると。Inspectorから見える。
    public GameObject Obj_pu;

    void Start () {
        Obj_pu.transform.position = new Vector3(10,10,10);
    }
}

3. まとめ

いっぱい書きましたが。
上に書いたことがわかっていれば。
色々できると思います。
やりたいことのために詰まったり。苦しんだ時は。
人に聞くことが一番ですが。
自分一人で挑戦して。
達成できた時はFPSゲームの連続キルにも匹敵する感じなので。
適度に頑張ってみてください。

おわり。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away