PlayerColor

Hey I Have been searching all Night, for something to help me and have tired about a million combinations and i cannot seem to get what i am looking for…

Please mind that i am also new to C#, but any help will be appreciated.

ugh alright I have a Script Player.cs.

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{
  
    public string username;
    public bool human;
    public Color userColor = new Color(1,1,1,1);



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

    //PlayerColor
    void PlayerColor()
    {
      
    }
                
}

alright its using color picker to choose a color which ill get the player to choose. but i have created a Material called. “PlayerColor” I created A simple shader Called “S_PlayerColor” and assigned the Material “PlayerColor” to use “S_PlayerColor”

Just Incase you wanted to see the shader Code.

Shader "Custom/S_PlayerColor" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
      
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

basically I want the Color Value only nothing else so a simple diffuse to be controlled by the player and placed on this material.

then i can use this material for all 3d models where i have player Color places.

Please anyone Help me?

Hey, I have been searching and funneling out but seems i got one thats close… the only issue is the shader Disconnects on Runtime…

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{
   
    public string username;
    public bool human;
    public Color userColor = new Color(1,1,1,1);



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

    //PlayerColor
    void PlayerColor()
    {
        Renderer rend = GetComponent<Renderer>();
        rend.material.shader = Shader.Find("PlayerColor");
        rend.material.SetColor("_Color", userColor);
        }
       
    }

This is before i run… you can see everything is assigned…
6efd35149523a1014a5d7921a2fe4a5fcfbbb1b3.jpeg
At Runtime the S_player Color Disappears…
98c75b76ff60e738f7a070b7a1eca46f1a6b757c.jpeg
But if i drag it back on it is picking up the color that the player selected…
2273811--152466--Capture.JPG

Oh sorry I must Correct myself. Its Only Changing the Color that the material is assigned to if that material is on another Object it does not change it at all.

so back tooo square one :eyes:

You can use renderer.sharedMaterial to change the colors for all objects using the same material. However this also permanently changes the default material color in your project, so you need to add extra code to reset the colors to default at beginning of scene.

//PlayerColor
void PlayerColor()
{
        Renderer rend = GetComponent<Renderer>();
        rend.sharedMaterial.shader = Shader.Find("PlayerColor");
        rend.sharedMaterial.SetColor("_Color", userColor);
        }
      
}

hey bud, thanks for the reply

so sharedMaterial is used for everything using that material while material is just the game object applied to it?
thank you i can see it starts

Wow thanks Bud i found the problem with the shader…

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{
   
    public string username;
    public bool human;
    public Color userColor = new Color(1,1,1,1);



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

    //PlayerColor
    void PlayerColor()
    {
        Renderer rend = GetComponent<Renderer>();
        rend.sharedMaterial.shader = Shader.Find("Custom/S_PlayerColor"); // this is where the issue was had to add custom.
        rend.sharedMaterial.SetColor("_Color", userColor);
        }
       
    }

If this object already has the S_PlayerColor material applied to it, why are you doing a shader find at all?

well im new to coding so i assumed it needed it. from what i read on unity help site…

basic idea is just ill have 10 players max… each will have a username and pick a team and then finally a color…

the models i have created… i have 2 materials set one is the texture and the other is the player color which i want to place this one material controlled by the Player and all units will be the same color.